在ARC时代的财产与ivar

Toa*_*tor 56 properties objective-c ivar automatic-ref-counting

我的理解是,现在设置一个ivar会保留分配给它的对象,因为设置变量默认为strong限定符.因为ivars属于对象的范围,它们被声明并strong保留变量范围内的对象,这意味着当包含ivar的对象仍然存活时,永远不会释放ivars值.

它是否正确?

如果是这样,我是否正确地认为,就记忆管理而言,保留(强)财产和简单的伊娃之间没有区别?

bea*_*ain 70

如果变量:

  1. 在使用ARC的类中声明.
  2. 仅用于类实现(不作为类接口的一部分公开).
  3. 不需要任何KVO.
  4. 不需要任何自定义getter/setter.

然后将其声明为没有相应的@property/ 的ivar @synthesize,并在实现中直接引用它.它与Encapsulation内联,以在类实现文件中声明此ivar.

// MyClass.h
@interface MyClass : ParentClass
@end

// MyClass.m
@implementation MyClass {
    NSString *myString;
}

- (void)myMethod {
    myString = @"I'm setting my ivar directly";
}
@end
Run Code Online (Sandbox Code Playgroud)
  • 这个ivar将由__strongARC编译器处理.
  • nil如果它是一个对象,或者0它是一个原始对象,它将被初始化.

  • 注意:ivars是用`@ protected`隐式定义的,几乎不应该是`@ public`.明确定义`@ private`通常是一种很好的做法.使用下划线为ivars添加前缀也是一种好习惯.实际上,`@ property`将以这种方式隐式地"@ synthesize"其关联的ivar. (3认同)
  • @DenisMikhaylov好点.虽然我认为我会留在"第2点",因为我在谈论最佳实践,并且直接访问类的ivars可能不是一个好习惯. (2认同)

Mat*_*man 6

您不能使用KVO并使用实例变量进行自定义getter和setter,而不是使用ARC时它们非常相似.