三angular形当你不合成时会发生什么
在启用了iOS ARC的项目中,当我不合成属性时会发生什么,因为保留/释放是不允许的?
@interface SomeClass : NSObject { NSMutableArray* _pieces; } @end
在这种情况下,iVar_pieces的内存语义是什么? 说我使用它, _pieces = whatever
。
当我的SomeClass的实例被释放时,_pieces是否设置为零? 是否将_pieces存储为弱引用? 如果所有其他保留了_pieces的对象都释放它,当我尝试访问它时它会为空吗?
一些观察,其中大部分基于其他人的反馈可能是清楚的:
-
你综合了属性,而不是实例variables,在你的例子中,你向我们展示了一个实例variables的例子,而不是一个属性。
-
你的问题可能意味着合成与
retain
/release
的能力之间存在某种联系,但是没有这种联系。retain
和release
的能力是否是否使用ARC的一个function。 它与合成属性无关。 -
正如其他人所观察到的,默认情况下,明确声明的实例variables(如您的示例)是
strong
引用。 所以,在你的例子中,_pieces
是一个strong
参考。 -
是的,当你的
SomeClass
对象被释放时,它将删除对_pieces
对象的strong
引用。 显然,如果这是对_pieces
指向的对象的最后一个强烈的引用,那么它将被释放,并且其他地方的任何其他weak
引用将被设置nil
。 有关内存pipe理的更完整的讨论,请参阅Apple的高级内存pipe理编程指南和转换到ARC 。 -
你问:“如果所有其他保留有
_pieces
物体都释放它,当我尝试访问它时它是否nil
? 显然,如果_pieces
是一个weak
引用,那么这将是真实的,但鉴于它在SomeClass
中是一个strong
引用,否则,情况并非如此。 -
如果你想制作一个声明的属性 ,语法将是
@property (nonatomic, strong) NSMutableArray* pieces;
strong
与weak
(或其他)的指定决定了财产的memory management。 -
如果你声明一个属性,你不但不再需要显式地定义实例variables,而是现在build议你真的不应该这样做(因为当它被合成时,编译器会为你创buildivar)。 但是,如果您碰巧拥有一个明确声明的属性名称的实例variables,编译器将使用该属性。 但是这不仅是不必要的,而且也是不可取的(因为如果你错误input实例variables的名字,你可能不知不觉地结束了两个实例variables)。 只要让编译器综合你的属性的实例variables,这种潜在的歧义就消失了。
-
将为属性合成的实例variables的名称受属性实现指令的语法(即
@synthesize
语句)@synthesize
。 因此,如果你有一个@synthesize
声明你的表单的属性:@synthesize pieces;
那么实例variables将被称为
pieces
。 但是,如果您使用以下的首选@synthesize
语法:@synthesize pieces = _pieces;
那么实例variables名就会有前面的下划线(按照惯例,首选,以避免属性和实例variables之间的代码含糊不清)。 而且,从Xcode 4.4开始,如果你忽略了
@synthesize
语句,它会用后面的语法为你隐式地合成它,也就是说实例variables将带有前导下划线)。
假设你还没有创build一个使用这个属性来覆盖假定的行为 ,ARC项目中的实例variables被认为是强壮的,所以声明真的是
@interface SomeClass : NSObject { __strong NSMutableArray* _pieces; } @end
所以,在回答你的问题
当我的SomeClass的实例被释放时,_pieces是否设置为零?
不,但是分配一个实例不会导致它被释放。
是否将_pieces存储为弱引用?
不,这是一个有力的参考。
如果所有其他保留了_pieces的对象都释放它,当我尝试访问它时它会为空吗?
不,这是你第一个问题。
你是否宣布了一个名为pieces
的属性,或者这是一个直的伊娃?
如果你定义一个属性,那么内存的使用取决于你如何定义属性。
如果这是一个直的伊娃,那么默认情况下,伊娃将是strong
。 这基本上意味着伊娃将适当地保留和释放你分配给它的任何东西。 你可以放心地使用它,而不用担心它。
据我所知,ARC会像对待strong
的方式一样对待它。 分配给它时,传入的值将被retain
,不再指向的值将被release
。 只有在某种程度上被释放的时候,它才会摇摆不定。 如果你有一个属性声明,ARC将遵守在那里指定的规则,访问者将自动以@synthesize someObject = _someObject
的forms为你合成。 当对象被取消分配时,我认为对象被发送release
所以如果没有其他东西已经声明所有权,指针指向的对象也将被释放。
与新的运行时,你只需要@properties btw – 不要声明ivars,不合成