2

我正在尝试在 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) 两条线中的哪一条?我对两者都进行了测试,两者似乎都有效。有区别吗?

4

3 回答 3

3

ARC 只会自动进行保留,而不是复制。如果您希望它被复制,那么 (1) 是正确的。

于 2012-06-14T03:41:03.240 回答
2

_str = [str copy];是正确的。copy代替retain(ARC 隐含为您保留对象)的原因是因为NSMutableStringNSString. 这意味着它str可能是一个NSMutableString并且以后可能会改变它的值,这可能不是你想要的。使用没有性能影响,copy因为如果str是非可变的NSString,则copy不会创建另一个副本,它只会增加保留计数。

于 2012-06-21T09:46:41.180 回答
2

本尼迪克特在对您的问题的具体回答中所说的是正确的(+1),但您还有另一个小“问题”。

if (![_str isEqualToString:str])

是矫枉过正。你也可以这样做

if (_str != str)

这是一个更快的比较,如果str是一个比较等于的可变字符串,只会导致显着的惩罚_str

于 2012-06-21T10:45:47.917 回答