在弧线中,当你不合成时会发生什么

1da*_*ake 8 objective-c ios automatic-ref-counting

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

@interface SomeClass : NSObject {
    NSMutableArray*     _pieces;
}
@end
Run Code Online (Sandbox Code Playgroud)

在这种情况下,iVar _pieces的内存语义是什么?假设我使用,设置它_pieces = whatever.

当我的SomeClass实例被解除分配时,_pieces是否设置为nil?_pieces是否存储为弱引用?如果保留_pieces的所有其他对象释放它,当我尝试访问它时它是否为null?

Rob*_*Rob 16

一些观察结果,其中大部分可能基于其他人的反馈而明白:

  1. 您合成了属性,而不是实例变量,在您的示例中,您向我们展示了实例变量的示例,而不是属性.

  2. 您的问题可能意味着在合成和执行retain/ 的能力之间存在一些假定的联系release,但是没有这样的联系.能否做到retain并且release是否使用ARC的功能.它与合成属性无关.

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

  4. 是的,当您的SomeClass对象被释放时,它将删除strong对该_pieces对象的引用.显然,如果那是对_pieces它所指向的对象的最后一个强引用将被释放,并且weak你在别处的任何其他引用将被设置为nil.有关内存管理的更完整讨论,请参阅Apple的高级内存管理编程指南过渡到ARC.

  5. 您询问"如果所有其他保留的对象都_pieces将其释放,那么nil当我尝试访问它时会是这样吗?" 显然,如果_pieces是一个weak参考,那将是真的,但鉴于它隐含地是一个strong参考SomeClass,不,不是这样的.

  6. 如果你想使pieces一个声明的属性,语法会

    @property (nonatomic, strong) NSMutableArray* pieces;

    的名称strongweak(或其他)决定了物业的内存管理.

  7. 如果你声明一个属性,你不仅不再需要显式定义实例变量,而是现在建议你真的不应该这样做(因为当它被合成时,编译器会为你创建ivar).但是,如果您碰巧有一个显式声明的属性正确名称的实例变量,编译器将使用该属性.但这不仅是不必要的,而且也是不可取的(因为如果你错误输入实例变量的名称,你可能会在不知不觉中最终得到两个实例变量).只需让编译器为您的属性合成您的实例变量,这种潜在的歧义就会消失.

  8. 将为属性合成的实例变量的名称由属性实现指令的语法(即@synthesize语句)控制.因此,如果您有一个表单属性的@synthesize声明pieces:

    @synthesize pieces;

    那么将调用实例变量pieces.但是如果你使用首选@synthesize语法:

    @synthesize pieces = _pieces;

    那么实例变量名将具有前面的下划线(按照惯例,这是首选的,以避免代码在属性和实例变量之间出现歧义).并且,从Xcode 4.4开始,如果省略a的@synthesize语句@property,它将使用后一种语法隐式合成它,即实例变量将带有前导下划线.