我正在尝试在iOS上实现自动引用计数的自定义属性。
我的.h
文件:
@interface AObject : NSObject
@property(nonatomic,copy) NSString* str;
@end
我的.m
文件:
@implementation AObject
@synthesize str = _str;
-(void)setStr:(NSString *)str {
if (![_str isEqualToString:str]) {
// Which one is right?
_str = [str copy]; //(1)
_str = str; //(2)
}
}
@end
我应该使用两条线(1)和(2)中的哪一条?我测试了两者,两者似乎都有效。有区别吗?
答案 0 :(得分:3)
ARC只会自动保留,而不是复制。如果您希望将其复制,那么(1)是正确的。
答案 1 :(得分:2)
_str = [str copy];
是正确的。 copy
而不是retain
(ARC暗示为您保留对象)的原因是因为NSMutableString
是NSString
的子类。这意味着str
可能是NSMutableString
,之后可能会更改其值,这可能不是您想要的。使用copy
没有性能影响,因为如果str
是不可变的NSString
,那么copy
将不会创建另一个副本,它只会增加保留计数。
答案 2 :(得分:2)
本尼迪克特在你的问题的具体答案中说的是正确的(+1),但你还有另一个小问题。
if (![_str isEqualToString:str])
太过分了。你也可以这样做
if (_str != str)
这是一个更快的比较,如果str
是一个比较等于_str
的可变字符串,则只会导致严重的惩罚。