2009-07-16 2 views
3

이것은 Objective-C 2.0 프로그래밍 언어의 예제입니다. 바닥에있는 세터에서 궁금한게 있는데 value = [newValue retain] 대신 value = [newValue copy]을 사용할 수 있습니까?objective-c의 setter에 관한 질문입니다.

@interface MyClass : NSObject 

{ 

    NSString *value; 

} 

@property(copy, readwrite) NSString *value; 

@end 



// assume using garbage collection 

@implementation MyClass 

@dynamic value; 



- (NSString *)value { 

    return value; 

} 



- (void)setValue:(NSString *)newValue { 

    if (newValue != value) { 

     value = [newValue copy]; 

    } 

} 

@end 

답변

7

가장 빠르고 안전한 방법은 구현 상단에 @synthesize value을 추가하는 것입니다. 그러면 컴파일러에서 자동으로 이러한 메서드를 생성합니다.

복사 대 보존 문제는 NSMutableString에서 전달 될 수 있다는 사실에 달려 있습니다. NSMutableString은 값을 변경합니다. '불변'유형 (문자열, 집합, 배열, 사전)에 대한 설정자가있는 경우 copy 의미론을 사용해야합니다. 처음에는 반 직관적 인 것처럼 보일 수 있습니다. (불변 인 경우 왜 사본을 만드나요?)하지만 깨닫게되는 점은 클래스가 불변이라고 가정하고, 전달 된 것이 실제로 변경되지 않을 수도 있다는 것입니다.

NSMutable 클래스는 표현할 수있는 버전의 불변 버전을 반환하여 copy 선택기를 구현합니다. 불변 클래스 (NSString 등) copyretain 호출 구현합니다. 즉, 그들은 매우 빠릅니다.

세터는 새로운 값을 지정하기 전에 value을 릴리스해야합니다.

-(void)setValue:(NSString*)newvalue 
{ 
    if (value != newvalue) 
    { 
     [value release]; 
     value = [newvalue copy]; 
    } 
} 

당신이 setValue:를 호출하고, 당신은 retain을 사용할 수 인 NSMutableString 전달되지 않습니다 절대적으로 확신 할 수있는 모든 클래스를 완벽하게 제어 할 경우,하지만 copy를 사용하는 모범 사례입니다 : 적절한 코드는 .

+0

항상 사본을 사용하는 것이 좋습니다. 또한 @property (retain, copy, readwrite) NSString * 값을 말할 수 있습니까? 효과는 무엇입니까? 감사합니다. – derrdji

+0

컴파일되지 않습니다. 클래스의 가시성으로 인해 항목을 변경하지 못하게 할 때 사본을 사용하는 것이 좋습니다. 값을 나타내지 않는 무언가 (예 : UI 출력 속성)에 대한 속성이있는 경우 retain을 사용합니다. – Jason

0

아니요, 인터페이스에 copy이 표시됩니다. 누군가 NSMutableString을 전달하면 두 메서드에서 매우 다른 결과를 얻을 수 있습니다.

+0

는, 교회가 '값'재산의 당신의 선언을 의미한다. 둘 다'copy' 또는'retain'이어야합니다. – notnoop

+0

그래서 복사본을 사용하여 런타임 오류를 피하기 위해 유형 검사를 건너 뛸 수 있습니다. 그 아이디어입니까? – derrdji

0

다릅니다. [newValue retain]을 사용하면 다른 개체가이 NSString 포인터의 값을 변경할 수 있습니다. 일반적으로이 동작을하는 것을 좋아하지 않습니다.

0

setter 메소드 : API에 의해

-(void)setValue:(NSString*)newvalue{ 
     if (_value != newvalue) 
     { 
      [_value release]; 
      _value = nil; 
      _value = [newvalue copy]; 

     } 
    } 
관련 문제