2012-06-14 3 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 문에 닫는 문장이 없습니다.} 모호한 부분을 없애기 위해 올바른 위치에 추가 할 수 있습니까? –

답변

3

ARC는 복사가 아닌 자동으로 유지 만 수행합니다. 복사본을 복사하려면 (1)이 올바른 것입니다.

2

_str = [str copy];이 맞습니다. 대신 retain (이유는 ARC가 개체를 유지함을 의미합니다)은 NSMutableStringNSString의 하위 클래스이기 때문입니다. 즉, strNSMutableString 일 수 있으며 나중에 '원하는 값이 아닌 값을 변경할 수 있습니다. copy을 사용하면 성능에 아무런 영향이 없습니다. str이 변경 불가능한 경우 NSString이면 copy은 다른 복사본을 만들지 않으므로 단순히 보유 수를 늘리기 때문입니다.

2

귀하의 질문에 대한 구체적인 답변에서 Benedict가 말하는 것은 정확합니다 (+1). 그러나 귀하는 다른 사소한 "문제"가 있습니다.

if (![_str isEqualToString:str]) 

은 과도합니다. 당신은뿐만 아니라 훨씬 빠른 비교하고 str_str 동일한 비교하는 가변 문자열 인 경우에만 상당한 벌금에 이르게

if (_str != str) 

을 할 수 있습니다.

관련 문제