2013-04-15 169 views
1

查看代码块,它是一个类方法。任何人都可以给我一些这种方法的解释吗?它做了什么?任何人都可以帮助我理解这段代码吗?

+ (PeriodicElements *)sharedPeriodicElements { 
    @synchronized(self) { 
    static dispatch_once_t pred; 
    dispatch_once(&pred, ^{ sharedPeriodicElementsInstance = [[self alloc] init]; }); 
    } 
    return sharedPeriodicElementsInstance; 
} 
+1

代码使其线程安全,并使用dispatch_once GCD。搜索这两个术语:) –

+0

感谢Anoop Vaidya :) – chinabenjamin66

+1

不正确的代码,以使线程安全的东西,在那。虽然不正确,但它工作。但它确实引起了关于其他代码库质量的问题。 – bbum

回答

3

它用来创建一个单身人士。 dispatch_once将确保无论您致电sharedPeriodicElements多少次,初始化程序将只在您的应用程序的整个生命周期内被调用一次。

​​块虽然有点过分,但因为dispatch_once已经线程安全。好像你正在看的做单身的老办法部分突变版本:

+ (PeriodicElements *)sharedInstance { 
    static PeriodicElements *sharedPeriodicElementsInstance; 
    @synchronized(self) { 
     if (sharedPeriodicElementsInstance == nil) { 
      sharedPeriodicElementsInstance = [[PeriodicElements alloc] init]; 
     } 
    } 
    return sharedPeriodicElementsInstance; 
} 

要清楚(THX @bbum),这实在是什么,你应该运行:

+(PeriodicElements *)sharedPeriodicElements { 
    static dispatch_once_t pred; 
    dispatch_once(&pred, ^{ sharedPeriodicElementsInstance = [[self alloc] init]; }); 
    return sharedPeriodicElementsInstance; 
} 
+0

是的,我正在学习从iOS开发中心下载的示例项目,谢谢mprivet – chinabenjamin66

+0

要清楚,没有@synchronized的'dispatch_once'模式是使用的。 – bbum

相关问题