使用Assign会减少使用的内存量吗?

时间:2014-09-03 12:22:47

标签: ios objective-c memory-management ivars

当我在声明合成的属性时使用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是否仅在未使用的内存中保留?

3 个答案:

答案 0 :(得分:4)

请勿以这种方式使用assign。在这种特殊情况下,它可能无关紧要,但它对调用者来说非常混乱,如果你改变实现,它会产生非常糟糕的错误。

您实现了getter和setter这一事实意味着编译器不会生成ivar。这与您使用的内存管理属性无关。在这里使用strong,因为这是您实施的内容。您的标题应符合您的实施。

答案 1 :(得分:1)

只有在您没有自己实施财产的情况下,才会自动为您创建ivar。 并且@synthesize text = _text;是自动完成的,除非您为getter和setter提供自己的实现或将属性合成到其他变量。例如:

@synthesize text;

以上内容会将text属性合成为text变量。

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

答案 2 :(得分:1)

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