黑马程序员技术交流社区
标题:
oc 单例模式的设定
[打印本页]
作者:
Hi围城
时间:
2014-4-3 16:20
标题:
oc 单例模式的设定
本帖最后由 Hi围城 于 2014-4-3 20:24 编辑
如何设定一个单例模式,比如把一个person类设定成单例模式,它的对象以后就只有一个。
作者:
于清扬
时间:
2014-4-3 16:52
#import "Person.h"
@implementation Person
// 定义个全局变量(类方法中不能使用成员变量)
static Person *_instace;
// 重写allocWithZone:方法
+ (id)allocWithZone:(struct _NSZone *)zone
{
// 只执行一次里面的代码即只分配一次内存空间,而且是线程安全的
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instace = [super allocWithZone:zone];
});
return _instace;
}
// 提供工厂方法供外面使用
+ (instancetype)sharedPerson
{
if (_instace == nil) {
_instace = [[Person alloc] init];
}
return _instace;
}
@end
复制代码
作者:
程浩
时间:
2014-4-3 16:53
@implementation Singleton
+ (Singleton *)instance {
static Singleton *instance; //声明了静态变量,如果你有JAVA编程背景的话,这里或许会让你有点疑惑,在C(C++ 和 Objective-C)中,一个静态局部变量作用域存在于函数内,但是生命周期是整个程序,在下一次该函数调用时仍可使用 。(和java中的类静态变量被该类各个实例变量共有的特点相似)。
@synchronized(self) { //我们想使用线程保护,这样同时的两个[Singleton instance]调用不会产生两个独立的对象实例。即使在一个单线程程序中,这种 Synchronization不会有大的执行时间开销,而且这为以后开发 打下了好的基础。
if(!instance) { //检查是否该类对象实例已经初始化。我们是否需要生成该类的实例。
instance = [[Singleton alloc] init];
}
}
return instance; //返回创建的/已存在的对象实例。
}
@end
复制代码
作者:
Hi围城
时间:
2014-4-3 20:26
于清扬 发表于 2014-4-3 16:52
非常感谢!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2