相关疑难解决方法(0)

@synchronized()做什么?

我刚刚创建了一个单例方法,我想知道函数的@synchronized()作用,因为我经常使用它,但不知道其含义.

cocoa-touch objective-c ios

82
推荐指数
4
解决办法
7万
查看次数

单例或类方法

在阅读了对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)

singleton objective-c

6
推荐指数
2
解决办法
4238
查看次数

标签 统计

objective-c ×2

cocoa-touch ×1

ios ×1

singleton ×1