为什么当我发现自己在100%的时间使用非primefaces时,“primefaces”是Objective C中默认的@property限定符?

在我担任iOS开发人员的几年中,我不认为自己曾经在一个属性上使用primefaces 。 如果由于线程的原因,我可以看到潜在的竞争条件或数据完整性问题,那么对@property使用primefaces将永远不会有帮助。 我使用传统的事务/工作单元线程安全技术(使用机制锁,信号灯或其他)。

有没有人有(或知道)在什么地方使用primefaces的实际例子? (我很想看看一些实际的/实际的代码示例)

在写了十亿次非primefaces之后,我还想知道为什么苹果决定把primefaces作为默认值。

至于你遇到的第一个问题,也许是因为

尽pipe“primefaces”意味着对属性的访问是线程安全的,但是简单地将类中的所有属性设为primefaces并不意味着您的类或更一般的对象图是“线程安全的”线程安全不能在关卡中表示个人存取方法。

至于为什么苹果默认为primefaces,我不认为有什么好的理由,这只是一个糟糕的devise决定。 在WWDC会议上,各位反复鼓励人们使用非primefaces来消除性能影响。

值得注意的是,在垃圾回收的情况下,几乎所有的合成存取器都是固有的primefaces – primefaces和非primefaces版本之间没有区别,因为在这两种情况下,指针的简单赋值就是所有需要的。 既然你真的不能在垃圾回收下创build一个非primefaces合成的访问器,他们可能已经决定,默认情况下事物是primefaces更有意义。

我没有任何证据表明这是决定背后的原因,但对我来说是有道理的。

(如果你很好奇,在垃圾回收的情况下,还有一些情况是简单的赋值是非primefaces的 – 当值大于进程的字大小时,会发生这种情况。实际上,这只发生在结构中。

编辑:添加来源

在Objective-C编程语言 – >声明的属性 – >性能和线程中可以find关于垃圾收集下的综合属性的primefaces性的更多信息,在这里它说:“在垃圾收集环境中,大多数合成的方法是primefaces的,不会产生这种开销“。 固有的primefaces性在2008年的WWDC会议420“使用垃圾收集与Objective-C”中更为明确地提到,约29分钟。

用两个词 – 线程安全。 我们定期编写的大部分应用程序都非常简单,因此实际上可以从没有额外的locking中受益。


从Apple的Objective-C编程语言 :

属性在默认情况下是primefaces的,因此合成访问器在multithreading环境中提供了对属性的强大访问 – 也就是说,不pipe其他线程是否同时执行,始终都会完全检索或设置从getter或set通过setter返回的值。 有关更多详细信息,请参阅“ 性能和线程” 。

如果不指定nonatomic,那么在引用计数环境中,对象属性的综合get访问器使用锁并保留并自动释放返回的值 – 实现将类似于以下内容:

[_internal lock]; // lock using an object-level lock id result = [[value retain] autorelease]; [_internal unlock]; return result; 

如果指定nonatomic,则对象属性的合成访问器只是直接返回值。

当苹果首次引入属性的概念时,关于atomic或者nonatomic是否是默认的,primefaces人是否赢得了一个很大的争论。

我认为推理是在一个线程环境中,除非属性是primefaces的,否则你不能保证它返回的指针是有效的。 一个非primefaces的getter将被实现这样的东西

 -(MyObj*) someProperty { return someInstVar; } 

在指针被放置到寄存器中以便返回之前,但在调用者有时间保留之前,其他线程可能会释放由someInstVar指向的对象。 即使这样也不好:

 -(MyObj*) someProperty { return [[someInstVar retain] autorelease]; } 

因为其他线程可能会在保留计数递增之前释放someInstVar。

在multithreading环境中安全地返回指针的唯一方法是这样的:

 -(MyObj*) someProperty { @synchronized(self) { return [[someInstVar retain] autorelease]; } } 

也是为了同步setter。

然而,问题在于锁是非常昂贵的(实际上它们使用了比@synchronized更轻的东西,但是它仍然是昂贵的),所以每个人都使用非primefaces,只是使所有的属性成为primefaces并不能赋予线程安全性所以还需要其他技术,而且他们倾向于消除我上面讨论的问题。

有很多人认为错误的决定是应该做什么的,但为了向后兼容,现在不能改变。 我发现自己现在甚至没有想到打字nonatomic

primefaces电话是不能被打断的电话。 整个调用必须执行。

更新类似共享计数器variables的东西可能是primefaces的东西,因为你不希望两个进程试图同时访问variables。 这些行动将需要“primefaces”执行。

在这篇文章中有很多有用的信息:关于primefaces与非primefaces之间的区别和线程安全问题的primefaces与非primefaces属性。