2012-06-14 22 views
2

我試圖在iOS上使用自動引用計數實現自定義屬性。如何在iOS上使用ARC實現自定義副本屬性

.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

您的if語句缺少結束語}。你能否將它添加到正確的位置以消除任何歧義? – 2012-06-14 22:12:34

回答

3

ARC只會自動保留,不能複製。如果你希望它被複制,那麼(1)是正確的。

2

_str = [str copy];是正確的。原因是copy而不是retain(ARC暗示爲您保留該對象)是因爲NSMutableStringNSString的子類。這意味着str可能是NSMutableString,並且稍後可能會更改它的值,這可能不是您想要的值。使用copy沒有性能影響,因爲如果str是不可變的NSString那麼copy將不會創建另一個副本,它只會增加保留計數。

2

本尼迪克特在特定答案中說的是正確的(+1),但你有另一個小問題。

if (![_str isEqualToString:str]) 

是矯枉過正。你還不如做

if (_str != str) 

這是一個更快的比較只會導致一個顯著罰款,如果str是比較等於_str一個可變的字符串。

相關問題