当我在声明合成的属性时使用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是否仅在未使用的内存中保留?
答案 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个字节,具体取决于你使用的架构。