【问题标题】:Property vs. ivar in times of ARCARC时代的财产与ivar
【发布时间】:2011-10-20 12:50:47
【问题描述】:

据我了解,现在设置 ivar 会保留分配给它的对象,因为设置变量默认为 strong 限定符。因为 ivars 在声明它们的对象范围内,而strong 将对象保留在变量范围内,这意味着在包含 ivar 的对象仍然存在时,永远不会释放 ivars 值。

这对吗?

如果是这样,我是否认为在内存管理方面,保留(强)属性和简单 ivar 之间不再有区别?

【问题讨论】:

  • 好问题,我自己也在想。

标签: objective-c properties automatic-ref-counting ivar


【解决方案1】:

如果是变量:

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

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

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

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

- (void)myMethod {
    myString = @"I'm setting my ivar directly";
}
@end
  • ARC 编译器会将这个 ivar 视为 __strong
  • 如果它是一个对象,它将被初始化为nil,如果它是一个基元,它将被初始化为0

【讨论】:

  • 不能确定 2 项。你可以使用 classInstance->iVar = @"New value" 访问公共 ivar
  • @DenisMikhaylov 好点。虽然我认为我会留在“第 2 点”,因为我在谈论最佳实践,直接访问类的 ivars 可能不是一个好习惯。
  • 注意:ivars 是用@protected 隐式定义的,几乎不应该是显式的@public。明确定义@private 通常是一种好习惯。在 ivars 前加上下划线也是一种很好的做法。 @property 实际上会以这种方式隐含 @synthesize 与其关联的 ivar。
【解决方案2】:

您不能使用 KVO 并使用实例变量执行自定义 getter 和 setter,除非它们在使用 ARC 时非常相似。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多