코드이 대략 비슷한 무언가를 (우리는 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
호출에 의해서만 유지되는 반면, 가변 문자열은 새로운 불변의 복사본을 생성합니다. 그렇게하지 않으면 문자열 자체가 설정자로 전달 된 후에 변경 될 수 있으며 객체의 지식없이 값이 변경됩니다.
NSMutableString을 변경할 수있게하려는 경우에도 합성 된 setter를 새 값에 대해 mutableCopy를 수행하는 것으로 대체해야합니다. 그런 식으로 원본은 안전합니다. 원할 경우/원할 경우 문자열의 복사본을 변경할 수 있습니다. – Abizern
그래, NSMutableString으로 속성을 정의 할 수도 있습니다.NSString이 '클래스 클러스터'이기 때문에 실제로 NSString이 NSMutableString인지 여부를 확인할 수 없습니다. NSString은 NSMutableString 서브 클래스가되는 NSString * 서브 클래스 *의 인스턴스를 실제로 얻는다는 것을 의미하기 때문에
[str isKindOfClass: [NSMutableString class]]
을 사용합니다. . 가장 좋은 방법은-mutableCopy
을 사용하는 것인데, 수신기가 이미 변경 가능하면 그대로 유지됩니다. –