1

当我assign在声明合成属性时使用时,ARC 是否仍会自动为其创建匹配的 ivar?我的财产如下

@property (nonatomic, assign) NSString *text:

- (NSString *)text {
    return self.label.text; // label is a UILabel
}

- (void)setText:(NSString *)text {
    self.label.text = text;
}

_text我对自动生成的ivar没有任何用处;当我省略@synthesize text = _text或未使用的 ivar 仅保留在未使用的内存中时,编译器是否仍会创建此 ivar?

4

3 回答 3

4

不要使用assign这种方式。在这种特殊情况下它可能无关紧要,但它会让调用者非常困惑,如果你改变实现,它会产生非常糟糕的错误。

您实现了 getter 和 setter 的事实意味着编译器不会生成 ivar。这与您使用的内存管理属性无关。在这里使用strong,因为那是您实现的。您的标头应与您的实现相匹配。

于 2014-09-03T12:59:30.587 回答
1

仅当您自己没有实现属性时,才会自动为您创建 ivar。@synthesize text = _text;除非您为 getter 和 setter 提供自己的实现,或者将属性综合到其他变量,否则它会自动完成。例如:

@synthesize text;

以上将综合text属性到text变量。

至于使用assign而不是复制,理论上会使用更少的内存,但同时也很危险。如果你使用可变字符串,如果你在赋值给一个属性之后改变字符串值,属性值也会改变,这在大多数情况下不是你想要的。

于 2014-09-03T13:00:12.583 回答
1

您是否担心每个实例有 4-8(32/64 位指针)字节的额外分配?使用 assign、weak 或 strong strong 不会改变内存占用。无论您使用什么字符串,都不会复制引用始终指向同一个实例。不同之处仅在于 assig,weak 不会增加对象的引用计数,因此通过省略 ivar,您只能“保存”4-8 个字节,具体取决于您使用的架构。

于 2014-09-03T14:35:49.887 回答