언제 @synthesize
코드 에 명시 적으로 추가해야 합니까?
일반적으로 필요한 경우 : 필요한 경우에는 결코 맞지 않을 것입니다.
그래도 유용하다고 생각되는 경우가 하나 있습니다.
커스텀 getter와 setter를 모두 작성하고 있지만 인스턴스 변수가이를 지원하고 싶다고 가정 해 보겠습니다. (원자 속성의 경우 이는 사용자 지정 setter를 원하는 것만 큼 간단합니다. 단원 속성에 대해 setter를 지정하면 컴파일러가 getter를 작성하지만 원자 속성은 지정하지 않습니다.)
이걸 고려하세요:
@interface MyObject:NSObject
@property (copy) NSString *title;
@end
@implementation MyObject
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
_title
존재하지 않기 때문에 작동하지 않습니다. getter 또는 setter를 모두 지정 했으므로 Xcode는 (올바르게) 이에 대한 백업 인스턴스 변수를 생성하지 않습니다.
존재하도록하기위한 두 가지 선택이 있습니다. 다음 중 하나로 변경할 수 있습니다 @implementation
.
@implementation MyObject {
NSString *_title;
}
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
또는 다음과 같이 변경하십시오.
@implementation MyObject
@synthesize title = _title;
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
즉, 합성이 실제 목적을위한 것은 절대 필요하지 않지만 *, getter / setter를 제공 할 때 속성 지원 인스턴스 변수 를 정의하는 데 사용할 수 있습니다 . 여기에서 사용할 양식을 결정할 수 있습니다.
과거에는에서 인스턴스 변수를 지정하는 것을 선호 @implementation {}
했지만 이제는 @synthesize
중복 유형을 제거하고 백업 변수를 속성에 명시 적으로 연결하므로 경로가 더 나은 선택 이라고 생각 합니다.
- 속성의 유형을 변경하면 인스턴스 변수의 유형이 변경됩니다.
- 저장소 한정자를 변경하면 (예 : 강함 대신 약하게 또는 약함 대신 강하게) 저장소 한정자가 변경됩니다.
- 속성을 제거하거나 이름을 바꾸면
@synthesize
컴파일러 오류가 생성됩니다. 길잃은 인스턴스 변수로 끝나지 않을 것입니다.
*-여러 파일의 범주간에 기능을 분할하는 것과 관련하여 필요한 경우 한 가지를 알고 있습니다. 그리고 애플이 이것을 고치거나 이미 수정했다고해도 놀라지 않을 것입니다.