在启用了iOS ARC的项目中,由于不允许保留/释放,当我不合成属性时会发生什么?
@interface SomeClass : NSObject {
NSMutableArray* _pieces;
}
@end
在这种情况下,iVar _pieces的内存语义是什么?
说我使用
_pieces = whatever
进行设置。当我的SomeClass实例被释放时,_pieces是否设置为nil?
_pieces是否存储为弱引用?
如果所有其他保留了_pieces的对象都释放了它,那么当我尝试访问它时,它是否为null?
最佳答案
根据其他人的反馈,到现在为止,有几个观察结果可能很清楚:
retain
/release
的能力之间存在某些假定的联系,但没有这种联系。进行retain
和release
的能力取决于您是否使用ARC。它与合成属性无关。 strong
引用。因此,在您的示例中,_pieces
是strong
引用。 SomeClass
对象被释放时,它将删除其对strong
对象的_pieces
引用。显然,如果这是对_pieces
指向的对象的最后一个强引用,它将被释放,并且您在其他地方对它的任何其他weak
引用都将被设置为nil
。有关内存管理的更完整讨论,请参阅Apple的Advanced Memory Management Programming Guide和Transitioning to ARC。 _pieces
的所有其他对象都将其释放,那么当我尝试访问它时,它是否会是nil
?”显然,如果_pieces
是weak
引用,那将是正确的,但是鉴于它在strong
中隐式是SomeClass
引用,不,不是这样。 pieces
设置为declared property,则语法将为@property (nonatomic, strong) NSMutableArray* pieces;
。strong
与weak
(或其他名称)的区别决定了属性的内存管理。 @synthesize
语句)控制。因此,如果您的@synthesize
属性具有pieces
语句,其形式为:@synthesize pieces;
,则实例变量将称为pieces
。但是,如果您使用首选的@synthesize
语法:@synthesize pieces = _pieces;
,则实例变量名将带有下划线(按照惯例,这是首选,以避免代码在属性和实例变量之间产生歧义)。并且,从Xcode 4.4开始,如果您省略@synthesize
的@property
语句,它将使用后一种语法为您隐式合成它,即实例变量将带有前导下划线)。 关于objective-c - 在弧中,当您不进行合成时会发生什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13297829/