Objective-C의 세터에 관한 질문
-
16-09-2019 - |
문제
이것은 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 등)는 구현합니다. copy
와 retain
부르다.즉, 그들은 매우 빠릅니다.
세터도 릴리스해야 합니다. 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];
}
}