以'new'开头的属性名称在iOS中会导致BAD_ACCESS错误

我的属性是在我的NSManagedObject类中声明的,名字为“newPrice”,这导致了“僵尸对象”。 经过几个小时的debugging,我发现有一个方法是释放这个对象,但没有保留它的问题。 把这个属性重命名为“priceNew”后,一切顺利。 我不明白为什么这会造成问题。

财产声明:

@property (nonatomic, retain) NSNumber * newPrice; 

这个调用导致问题:

 [self setPieceStateWithPrice:self.action.newPrice]; 

经过像self.action.price通过重命名的参数新的一切顺利…

不要这样做。

在Objective-C命名约定中,名字以new开头的方法应该返回一个保留的对象。 使用ARC,该命名约定成为要求。 这意味着一个正常的,ARC编译的方法不应该以new的名字开始,因为编译器会假定它已经有一个保留计数1。

引用文档:

您拥有您创build的任何对象

您可以使用名称以“alloc”,“new”,“copy”或“mutableCopy”(例如alloc,newObject或mutableCopy)开头的方法来创build对象。

属性具有为其自动合成的方法。 所以,有一个属性意味着有一个同名的方法。

alloccopyinitmutableCopynew开始的方法对于如何处理内存有特殊的假设。 除非你有很好的理由,否则你应该避免使用这些前缀。

来自Clang 3.5文档| Objective-C自动引用计数| 保留的返回值

返回可保留对象指针types的函数或方法可能被标记为返回保留值,表示调用者期望获得+1保留计数的所有权。

alloc,copy,init,mutableCopy和new系列中的方法被隐式标记为((ns_returns_retained)) 属性 。 这可以通过显式标记方法属性 ((ns_returns_not_retained))来抑制。