在iOS的ARC启用的项目,当我是不允许不合成一个属性,因为保留/释放,会发生什么?
@interface SomeClass : NSObject {
NSMutableArray* _pieces;
}
@end
什么是在这种情况下,伊娃_pieces的内存语义? 说我把它用, _pieces = whatever
。
被_pieces设为零,当我SomeClass的实例被释放? 被_pieces存储为一个弱引用? 如果保留了_pieces所有其他对象释放,这将是空的,当我试图访问它?
一对夫妇的意见,其中大部分可能是由基于他人的反馈清楚这一点的:
你综合性能,而不是实例变量,并在你的榜样,你向我们展示了一个实例变量,而不是一个属性的一个例子。
你的问题可能意味着一些假设合成和能力做之间的连接retain
/ release
,但目前还没有这样的连接。 能力做retain
和release
是无论您使用的是功能ARC与否。 它无关,与合成属性。
正如其他人所观察到的,明确宣布实例变量,比如你的榜样,是strong
引用,默认情况下。 所以,在你的榜样, _pieces
是一个strong
参考。
是的,当你的SomeClass
对象被释放,它会删除其strong
参考_pieces
对象。 很显然,如果这是最后强烈的参考对象的指向_pieces
它会被释放和任何其他weak
,你必须在其他地方将被设置为引用nil
。 有关内存管理一个更加完整的讨论,请参阅苹果公司的高级内存管理编程指南 ,并过渡到ARC 。
你问“如果保留了所有其他对象_pieces
释放,这将是nil
,当我试图访问它?” 显然,这将是真实的,如果_pieces
是一个weak
引用,但考虑到这是一个隐含strong
参考SomeClass
,不,不是这样的。
如果你想使pieces
一个声明的属性 ,语法是
@property (nonatomic, strong) NSMutableArray* pieces;
的指定strong
与weak
(或其他)决定了物业的内存管理。
如果声明的属性,你不但不再有明确定义的实例变量,而是它现在建议你真的不应该这样做(当它的合成,因为编译器会为你创建伊娃)。 但是,如果你碰巧有正确的名称的显式声明的实例变量为你的财产,编译器将使用该属性。 但是,这不仅没有必要,而且不可取的(因为如果你输错实例变量的名字,你可能在不知不觉中有两个实例变量结束)。 只是让编译器合成的实例变量,你的属性,这潜在的不确定性消失。
将一个属性合成的实例变量的名字是由语法支配财产执行指令 ,即在@synthesize
声明。 因此,如果你有一个@synthesize
的发言pieces
形式的财产:
@synthesize pieces;
那么实例变量将被称为pieces
。 但是,如果你使用的首选@synthesize
的语法:
@synthesize pieces = _pieces;
然后该实例变量名将具有前述下划线(其是,按照惯例,优选的,以避免在性能和实例变量之间的代码模糊)。 而且,随着的Xcode 4.4,如果你省略@synthesize
声明为@property
,它会隐与后者的语法合成它适合你,也就是实例变量将承担前导下划线)。
假设你没有创建一个使用该属性,它会覆盖假定行为 ,ARC项目实例变量假设强,因此,声明确实是
@interface SomeClass : NSObject {
__strong NSMutableArray* _pieces;
}
@end
所以,在回答你的问题
被_pieces设为零,当我SomeClass的实例被释放?
没有,但指定实例,以它不会导致它被释放。
被_pieces存储为一个弱引用?
不,这是一个有力的参考。
如果保留了_pieces所有其他对象释放,这将是空的,当我试图访问它?
不,这是作为你的第一个相同的问题。
你声明属性命名pieces
或者这是一个直伊娃?
如果您定义的属性,则内存使用情况取决于你如何定义属性。
如果这是一个直伊娃则默认情况下伊娃将是strong
。 这基本上意味着伊娃将适当保留和释放什么都反对你分配给它。 您可以放心地使用它,而不必担心它。
据我所知,ARC将会把它当作你会以类似的方式对待它strong
。 当你分配给它,传入的值会retain
ED,不再指着将价值release
d。 如果它在某种程度上成为了释放它只会吊着。 如果你有一个财产申报,ARC将被指定有遵守规则,以及存取将在表单自动为您合成@synthesize someObject = _someObject
。 当对象被释放,我相信该对象被发送release
,因此如果没有别的主张所有权,指向的对象由指针也将被释放。
随着新的运行时你只需要@properties顺便说一句 - 不声明实例变量,不合成