我刚刚创建了一个单例方法,我想知道函数的@synchronized()作用,因为我经常使用它,但不知道其含义.
在阅读了对Objective C中关于单例的问题的回答之后,似乎每个解决方案都在实例访问器中对线程进行了一些权衡.即
@synchronized(self)
{
if (sharedInstance == nil)
sharedInstance = [[MySingleton alloc] init];
}
return sharedInstance;
Run Code Online (Sandbox Code Playgroud)
这基本上是单线程访问单例,如果它是在操作中经常使用的东西,看起来像是可能导致线程不必要地竞争的东西.
简单地使用类对象作为单例实例,并通过类方法公开功能,即
@interface MySingleton : NSObject {
}
+ (void)doSomething;
@end
@implementation MySingleton
+ (void)initialize {
//do some setup if necessary
}
+ (void)doSomething {
//do something
}
@end
Run Code Online (Sandbox Code Playgroud)
通过这种方式,我们避免每次想要引用单例对象时都进行锁定+检查,我们也可以省去将其存储在本地或方法ivar中.
此方法还允许运行时保证在任何给定时间系统中只存在一个实例(Class对象).
编辑
这里除了线程之外还有更多,使用传统的单例,您通常会编写如下代码:
MySingleton *instance = [MySingleton getSharedInstance];
NSObject *someResult = [instance getResult];
//or
if (instance.someProperty) {
//do something
}
Run Code Online (Sandbox Code Playgroud)
但是,如果你的单例是一个类实例,你基本上就不需要一直调用getSharedInstance.考虑以下代码:
NSObject *someResult = [MySingleton getResult];
//or
if ([MySingleton someProperty]) {
//do …Run Code Online (Sandbox Code Playgroud)