【问题标题】:What are the retain semantics of synthesized ivar?合成 ivar 的保留语义是什么?
【发布时间】:2014-02-15 15:21:26
【问题描述】:

当您创建属性并且编译器自动合成底层 ivar 时,ivar 是否具有与属性相同的保留语义,还是保留语义仅适用于“setter”?

@property (nonatomic, strong) NSObject *strongObject
@property (nonatomic, weak)   NSObject *weakObject

_strongObject = [[NSObject alloc] init];    // is this strong?
_weakObject =   [[NSObject alloc] init];    // is this weak?

【问题讨论】:

    标签: objective-c memory-management properties automatic-ref-counting llvm


    【解决方案1】:

    检查this 问题。假设您使用的是 ARC,基础变量似乎与属性具有相同的语义。您可以像这样将 setter 重写为强属性:

    - (void)setMyObject:(MyObject *)anObject
    {
       _myObject = anObject;
    }
    

    这意味着您不必在之前发布(如在非 ARC 中),因为 ARC 在 ivar 级别处理此问题(请参阅here)。

    但是,如果不使用 ARC,例如分配和保留,则不正确,对于 ivars 无效,仅对属性有效。

    【讨论】:

    • 这是否也意味着具有复制语义的直接 ivar 分配实际上会进行复制?举个例子:@property (nonatomic, copy) NSString *myString;自定义设置器看起来像if (_myString == nil) _myString = @"A"; return _myString;
    • 嗯,它看起来很奇怪(特别是 setter 的 return 语句),但是不,你需要明确地复制它。 ARC 处理保留计数,而不是复制操作。
    • 我的错。 return 语句不应该在那里。
    猜你喜欢
    • 2012-06-24
    • 2012-06-13
    • 2023-03-09
    • 1970-01-01
    • 2014-11-29
    • 2010-09-11
    • 2016-01-27
    • 1970-01-01
    • 2019-10-21
    相关资源
    最近更新 更多