2009-05-09 5 views
2

속성 해제 I는 다음과 같이 정의된다 @property 가지고(오브젝티브 C)

@property (비 원자, 유지) 이름;

함수에서 일부 xml을 구문 분석하고 name 속성을 설정합니다. 내 질문에 새로운 인스턴스를 보유하기 전에 이전에 보유한 인스턴스를 명시 적으로 해제해야합니까? exemple 들어

:

myObj.name = otherObj getName]; // .. 횟수 +1

유지

myObj.name = otherObj getName]; // 이름의 새 인스턴스 인 이전 이름이 출시 되었습니까?

답변

4

코드이 대략 비슷한 무언가를 (우리는 name는 속성 이름이있을 것이고, _name는 인스턴스 변수가 될 것입니다) :

- (void) setName: (NSString *) newValue 
{ 
    if (newValue == _name) 
    return; 

    [newValue retain]; 
    [_name release]; 
    _name = newValue; 
}

위의 속성 선언에 따라 어떤 결과가 발생하는지 보여줍니다. 해당 속성의 다른 가능한 속성에 따라 해당 함수는 [newValue retain] ('copy'속성이 지정된 경우) 대신 [newValue copy]을 사용하거나 @synchronized(self) 블록으로 모두 래핑됩니다 ('비 원자'속성이 이 아닌 경우). 제공).

또한 귀하의 재산은 NSCopying 프로토콜을 구현하고있는 NSString를 의미하기 때문에, 당신이 정말로 즉, 복사본을 사용하기보다는 유지해야한다는주의해야한다 :

@property (nonatomic, copy) NSString * name; 

사용하는 합성 세터의 원인이됩니다 그 -retain 대신 -copy이 필요합니다. 실제로 NSMutableString 객체가 전달 될 때 더 안전합니다. 불변의 문자열은 궁극적으로 -copy 호출에 의해서만 유지되는 반면, 가변 문자열은 새로운 불변의 복사본을 생성합니다. 그렇게하지 않으면 문자열 자체가 설정자로 전달 된 후에 변경 될 수 있으며 객체의 지식없이 값이 변경됩니다.

+0

NSMutableString을 변경할 수있게하려는 경우에도 합성 된 setter를 새 값에 대해 mutableCopy를 수행하는 것으로 대체해야합니다. 그런 식으로 원본은 안전합니다. 원할 경우/원할 경우 문자열의 복사본을 변경할 수 있습니다. – Abizern

+0

그래, NSMutableString으로 속성을 정의 할 수도 있습니다.NSString이 '클래스 클러스터'이기 때문에 실제로 NSString이 NSMutableString인지 여부를 확인할 수 없습니다. NSString은 NSMutableString 서브 클래스가되는 NSString * 서브 클래스 *의 인스턴스를 실제로 얻는다는 것을 의미하기 때문에 [str isKindOfClass: [NSMutableString class]]을 사용합니다. . 가장 좋은 방법은 -mutableCopy을 사용하는 것인데, 수신기가 이미 변경 가능하면 그대로 유지됩니다. –

3

속성 (지시문 사용)에 대한 접근자를 합성 한 경우 속성 재 할당시 해당 속성을 지원하는 ivar를 릴리스합니다. 명시 적으로 ivar를 해제하고자하는 유일한 경우는 객체가 할당 해제 될 때입니다. 그래서, 당신의 dealloc 방법은 다음과 같습니다 합성 속성 setter에서

- (void)dealloc { 
    [name release]; 
    // other cleanup here 
    [super dealloc]; 
} 
+0

기본적으로 속성은 getters 및 setter를 호출하기위한 단순한 축약 형입니다. 재산을 설정할 때 세터에서 일어나는 모든 일이 발생합니다. 보유 및 복사 속성에 대한 합성 된 setter에서 이전 객체를 해제하고 새 객체를 유지 (또는 복사)합니다. – Chuck

+0

@chuck 예, 알고 있습니다. 그것이 재산이 합성되는 한 그것이 관리되는 것을 지정했기 때문입니다. –

관련 문제