三angular形当你不合成时会发生什么

在启用了iOS ARC的项目中,当我不合成属性时会发生什么,因为保留/释放是不允许的?

@interface SomeClass : NSObject { NSMutableArray* _pieces; } @end 

在这种情况下,iVar_pieces的内存语义是什么? 说我使用它, _pieces = whatever

当我的SomeClass的实例被释放时,_pieces是否设置为零? 是否将_pieces存储为弱引用? 如果所有其他保留了_pieces的对象都释放它,当我尝试访问它时它会为空吗?

一些观察,其中大部分基于其他人的反馈可能是清楚的:

  1. 你综合了属性,而不是实例variables,在你的例子中,你向我们展示了一个实例variables的例子,而不是一个属性。

  2. 你的问题可能意味着合成与retain / release的能力之间存在某种联系,但是没有这种联系。 retainrelease的能力是否是否使用ARC的一个function。 它与合成属性无关。

  3. 正如其他人所观察到的,默认情况下,明确声明的实例variables(如您的示例)是strong引用。 所以,在你的例子中, _pieces是一个strong参考。

  4. 是的,当你的SomeClass对象被释放时,它将删除对_pieces对象的strong引用。 显然,如果这是对_pieces指向的对象的最后一个强烈的引用,那么它将被释放,并且其他地方的任何其他weak引用将被设置nil 。 有关内存pipe理的更完整的讨论,请参阅Apple的高级内存pipe理编程指南和转换到ARC 。

  5. 你问:“如果所有其他保留有_pieces物体都释放它,当我尝试访问它时它是否nil ? 显然,如果_pieces是一个weak引用,那么这将是真实的,但鉴于它在SomeClass中是一个strong引用,否则,情况并非如此。

  6. 如果你想制作一个声明的属性 ,语法将是

    @property (nonatomic, strong) NSMutableArray* pieces;

    strongweak (或其他)的指定决定了财产的memory management。

  7. 如果你声明一个属性,你不但不再需要显式地定义实例variables,而是现在build议你真的不应该这样做(因为当它被合成时,编译器会为你创buildivar)。 但是,如果您碰巧拥有一个明确声明的属性名称的实例variables,编译器将使用该属性。 但是这不仅是不必要的,而且也是不可取的(因为如果你错误input实例variables的名字,你可能不知不觉地结束了两个实例variables)。 只要让编译器综合你的属性的实例variables,这种潜在的歧义就消失了。

  8. 将为属性合成的实例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,不合成