首页 文章

ARC的强大属性是否需要self.iVar?

提问于
浏览
17
  • 如果我声明一个强大的属性,就像这样:
@property (strong, nonatomic) UIView *iVar;

当我设置它时,如果我做 iVar = ...self.iVar = ... 这有关系吗?似乎用ARC,他们做同样的事情 .

  • 如果我只声明实例变量(不是@property),例如 BOOL selected ,这是否意味着它被推断为 __unsafe_unretained (因为没有指定它强的属性),或者我必须明确指定它吗?

在回答ARC: How to release static variable?时似乎我可能已经回答了我自己的问题,但我仍然对上述问题感到有些困惑 .

1 回答

  • 20

    从内存管理的角度来看,使用 ivar = ...self.property = ... (注意:没有 self.ivar 这样的东西)是一样的 . 但是,在 self.property = ... 时,使用 ivar = ... 不会调用setter . 这有三个重要的后果,没有特别的顺序:

    • 如果该属性未标记为 nonatomic ,则访问基础ivar将不会获取锁定,您将破坏原子性含义 .

    • 如果由您或子类覆盖该属性,则不会调用被覆盖的setter .

    • 将不会发送KVO通知 .

    至于仅声明ivar,它具有与声明局部变量相同的内存管理语义 . 这在section 4.4 of the Objective-C Automatic Reference Counting文档中有记录,但基本上,如果它是一个对象,它将被推断为 __strong .

相关问题