문제

이것은 Objective-C 2.0 프로그래밍 언어의 예입니다.하단의 세터에서 다음을 사용할 수 있는지 궁금합니다. value = [newValue retain]대신에 value = [newValue copy] ?

    @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
도움이 되었습니까?

해결책

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

카피 vs 카피의 문제유지는 NSMutableString으로 전달되어 해당 값이 변경될 수 있다는 사실에 달려 있습니다.'불변' 유형(문자열, 집합, 배열, 사전)에 대한 설정자가 있는 경우 다음을 사용해야 합니다. copy 의미론.처음에는 이것이 직관에 어긋나는 것처럼 보일 수 있습니다(불변인데 왜 복사본을 만드는가?). 그러나 알아야 할 것은 클래스가 이를 불변이라고 가정하기를 원하며 전달된 내용이 실제로 불변이 아닐 수도 있다는 것입니다.

NSMutable 클래스는 다음을 구현합니다. copy 그들이 나타내는 것의 불변 버전을 반환함으로써 선택기.불변 클래스(NSString 등)는 구현합니다. copyretain 부르다.즉, 그들은 매우 빠릅니다.

세터도 릴리스해야 합니다. value 새로운 값을 할당하기 전에.적절한 코드는 다음과 같습니다:

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

호출할 수 있는 모든 클래스를 완전히 제어할 수 있는 경우 setValue: NSMutableString을 전달하지 않을 것이라고 확신하면 다음을 사용할 수 있습니다. retain, 하지만 사용하는 것이 가장 좋습니다. copy.

다른 팁

때에 따라 다르지.당신이 사용하는 경우 [newValue retain], 다른 개체가 이 값을 변경할 수 있습니다. NSString 바늘.일반적으로 당신은 이런 행동을 좋아하지 않습니다.

아니요, 인터페이스에 다음과 같이 나와 있습니다. copy.누군가 NSMutableString을 전달하면 두 가지 방법에서 매우 다른 결과를 얻게 됩니다.

세터 방법:

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

        }
   }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top