iOS 设计模式的应用 ④ 单例模式
在数学和逻辑学中,单例定义为” 有且仅有一个元素的集合 “,在无论什么情况下,获取到的都是同一个值。在程序中,单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。这个方法应该是类方法,阻止所有想要生成对象的访问,避免一个全局使用的类频繁地创建和销毁。
成都创新互联主要从事网站制作、成都网站制作、网页设计、企业做网站、公司建网站等业务。立足成都服务张家川回族自治,十年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220
static uniqueInstance 是 Singleton 中的唯一实例, static sharedInstance 将它返回给客户端。通常, shareInstance 会检查 uniqueInstance 是否已经被实例化,如果没有,会生成一个实例然后返回 uniqueInstance 。
没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
只要应用程序需要集中式的类来协调其服务,这个类就应该生成单一的实例,而不是多个实例。
iOS 蓝牙开发(一)
iOS 蓝牙开发(二)
iOS 蓝牙开发(三)
iOS 蓝牙开发(四)
在iOS中蓝牙相关实现都是在CoreBluetooth这个framework中的,所以我们创建一个单例类中需要先导入 #import CoreBluetooth/CoreBluetooth.h ,再后即可使用这个单例类进行管理我们蓝牙的扫描、连接、状态等实现。
当 central.state 为CBManagerStatePoweredOn即可开始扫描, 具体方法 [self.centralManager scanForPeripheralsWithServices:nil options:nil] 当调用 scanForPeripheralsWithServices:options: 函数时就会实时调用其代理方法 - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
peripheral 是外设类 advertisementData 是广播的值,一般携带设备名, serviceUUID 等信息。 RSSI 绝对值越大,表示信号越差,设备离的越远。如果想装换成百分比强度, (RSSI+100)/1001 (这是一个约数,蓝牙信号值并不一定是-100 - 0的值)
蓝牙的连接是当中心设备扫描到可用外设后, 利用函数 [self.centralManager connectPeripheral:peripheral options:nil]; 进行链接, 当函数被调用后, 就会回调其对应的代理函数。
本篇笔记主要是记录如何初始化蓝牙的 CBCentralManager 的中心管理类,并记录如何实现扫描周边外设、如何链接、获取蓝牙当前状态。
iOS开发之单例,如何正确的创建单例
请输入您的回答实例方法和类方法的区别:实例方法需要创建对象后,由该对象调用,也就是只能被对象使用的方法。类方法,也就是类自身可以调用的方法。优缺点以及使用频率这个不太好说一般使用类方法的地方都是为了调用简单,并且内存占用少,因为它不需要n
ios~单例模式:
在iOS OC中,一般我们都是用官方推荐的写法来写单例:GCD方式单例
URLManager* a = [URLManager sharedInstance];
接下来,可以用 a 这个单例来干很多事情了,看起来没有问题。在很多实际的项目中,很多人也的确是这么做的。
可是,谁能保证所有人都会使用 sharedInstance 方法来创建对象?而一旦有人用 alloc,new 等来创建对象,这就不是单例了。
例如:
查看 a、b、c :
可以看到, a、b、c 不是同一个对象,而所谓单例,就是不管我用何种方法创建对象,都必须是同一个 。
所以,单例模式,绝不是一个 sharedInstance 就够了。
解决方案 一 、
那么如何避免这种问题呢?我们知道:
在对象创建的时候,无论是 alloc 还是 new,都会调用到 allocWithZone: 方法;
使用拷贝创建对象时,会调用 copyWithZone:,mutableCopyWithZone:方法;
那么,重写这些方法,就可以让创建的对象唯一。
再运行,看一看a、b、c:
都是同一个对象!大功告成!
解决方案 二 、
此外,还有一种方法,就是直接禁用掉 alloc、new 、copy等方法:
如此,在调用这些方法时就会报错,提示使用 sharedInstance 方法:
以此,也可以达到单例模式的要求,始终只有一个对象。
iOS-单例的几种写法
一、静态指针方式(单线程模式单例)
二、多线程加锁单例
三、单例的健壮性
由于水平有限,难免出现纰漏,如有问题还请不吝赐教。
开发中如何使用单例 ios
为你解答。
第一、基本概念
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问。
第二、在IOS中使用单例模式的情况
1.如果说创建一个对象会耗费很多系统资源,那么此时采用单例模式,因为只需要一个实例,会节省alloc的时间
2.在IOS开发中,如果很多模块都要使用同一个变量,此时如果把该变量放入单例类,则所有访问该变量的调用变得很容易,否则,只能通过一个模块传递给另外一个模块,这样增加了风险和复杂度
第三、创建单例模式的基本步骤
1.声明一个单例对象的静态实例,并初始化为nil
2.声明一个类的工厂方法,生成一个该类的实例,并且只会生成一个
3.覆盖allcoWithZone方法,确保用户在alloc 时,不会产生一个多余的对象
4.实现NSCopying协议,覆盖release,autorelease,retain,retainCount方法,以确保只有一个实例化对象
5.在多线程的环境中,注意使用@synchronized关键字
[cpp] view plaincopyprint?
//
// UserContext.h
// SingleDemo
//
// Created by andyyang on 9/30/13.
// Copyright (c) 2013 andyyang. All rights reserved.
//
#import Foundation/Foundation.h
@interface UserContext : NSObject
@property (nonatomic,retain) NSString *username;
@property(nonatomic,retain)NSString *email;
+(id)sharedUserDefault;
@end
[cpp] view plaincopyprint?
//
// UserContext.m
// SingleDemo
//
// Created by andyyang on 9/30/13.
// Copyright (c) 2013 andyyang. All rights reserved.
//
#import "UserContext.h"
static UserContext *singleInstance=nil;
@implementation UserContext
+(id)sharedUserDefault
{
if(singleInstance==nil)
{
@synchronized(self)
{
if(singleInstance==nil)
{
singleInstance=[[[self class] alloc] init];
}
}
}
return singleInstance;
}
+ (id)allocWithZone:(NSZone *)zone;
{
NSLog(@"HELLO");
if(singleInstance==nil)
{
singleInstance=[super allocWithZone:zone];
}
return singleInstance;
}
-(id)copyWithZone:(NSZone *)zone
{
NSLog(@"hello");
return singleInstance;
}
-(id)retain
{
return singleInstance;
}
- (oneway void)release
{
}
- (id)autorelease
{
return singleInstance;
}
- (NSUInteger)retainCount
{
return UINT_MAX;
}@end
[cpp] view plaincopyprint?
#import Foundation/Foundation.h
#import "UserContext.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
UserContext *userContext1=[UserContext sharedUserDefault];
UserContext *userContext2=[UserContext sharedUserDefault];
UserContext *userContext3=[[UserContext alloc] init];
UserContext *userContext4=[userContext1 copy];
// insert code here...
NSLog(@"Hello, World!");
}
return 0;
}
在开发中我们可以利用ios提供的方法来实现单例模式:
SYNTHESIZE_SINGLETON_FOR_CLASS(MyClassName);
将该语句置于@implementation MyClassName声明后,这样你的类自动会变成单例。
内容来自于richard_如风的博客。
分享标题:ios开发单例类,ios开发实例
浏览路径:http://lswzjz.com/article/dsdopje.html