如何在iOS上使用ARC实现自定义复制属性

时间:2012-06-14 02:56:06

标签: objective-c ios automatic-ref-counting

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

_str = [str copy];是正确的。 copy而不是retain(ARC暗示为您保留对象)的原因是因为NSMutableStringNSString的子类。这意味着str可能是NSMutableString,之后可能会更改其值,这可能不是您想要的。使用copy没有性能影响,因为如果str是不可变的NSString,那么copy将不会创建另一个副本,它只会增加保留计数。

答案 2 :(得分:2)

本尼迪克特在你的问题的具体答案中说的是正确的(+1),但你还有另一个小问题。

if (![_str isEqualToString:str])

太过分了。你也可以这样做

if (_str != str)

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