주어진 대답은 훌륭하게 작동하며 내 제안은 너무 많은 상용구 코드를 작성하지 않는 확장 일뿐입니다.
카테고리 속성에 대한 getter 및 setter 메서드를 반복적으로 작성하지 않도록이 답변은 매크로를 소개합니다. 또한이 매크로는 다음과 같은 원시 형 속성의 사용 용이성 int
또는 BOOL
.
매크로가없는 전통적인 접근 방식
전통적으로 다음과 같은 카테고리 속성을 정의합니다.
@interface MyClass (Category)
@property (strong, nonatomic) NSString *text;
@end
그런 다음 관련 객체 와 get 선택기 를 키로 사용하여 getter 및 setter 메서드를 구현해야합니다 ( 원래 답변 참조 ).
#import <objc/runtime.h>
@implementation MyClass (Category)
- (NSString *)text{
return objc_getAssociatedObject(self, @selector(text));
}
- (void)setText:(NSString *)text{
objc_setAssociatedObject(self, @selector(text), text, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
내가 제안한 접근 방식
이제 매크로를 사용하여 대신 작성합니다.
@implementation MyClass (Category)
CATEGORY_PROPERTY_GET_SET(NSString*, text, setText:)
@end
매크로는 다음과 같이 정의됩니다.
#import <objc/runtime.h>
#define CATEGORY_PROPERTY_GET(type, property) - (type) property { return objc_getAssociatedObject(self, @selector(property)); }
#define CATEGORY_PROPERTY_SET(type, property, setter) - (void) setter (type) property { objc_setAssociatedObject(self, @selector(property), property, OBJC_ASSOCIATION_RETAIN_NONATOMIC); }
#define CATEGORY_PROPERTY_GET_SET(type, property, setter) CATEGORY_PROPERTY_GET(type, property) CATEGORY_PROPERTY_SET(type, property, setter)
#define CATEGORY_PROPERTY_GET_NSNUMBER_PRIMITIVE(type, property, valueSelector) - (type) property { return [objc_getAssociatedObject(self, @selector(property)) valueSelector]; }
#define CATEGORY_PROPERTY_SET_NSNUMBER_PRIMITIVE(type, property, setter, numberSelector) - (void) setter (type) property { objc_setAssociatedObject(self, @selector(property), [NSNumber numberSelector: property], OBJC_ASSOCIATION_RETAIN_NONATOMIC); }
#define CATEGORY_PROPERTY_GET_UINT(property) CATEGORY_PROPERTY_GET_NSNUMBER_PRIMITIVE(unsigned int, property, unsignedIntValue)
#define CATEGORY_PROPERTY_SET_UINT(property, setter) CATEGORY_PROPERTY_SET_NSNUMBER_PRIMITIVE(unsigned int, property, setter, numberWithUnsignedInt)
#define CATEGORY_PROPERTY_GET_SET_UINT(property, setter) CATEGORY_PROPERTY_GET_UINT(property) CATEGORY_PROPERTY_SET_UINT(property, setter)
매크로 CATEGORY_PROPERTY_GET_SET
는 주어진 속성에 대한 getter 및 setter를 추가합니다. 읽기 전용 또는 쓰기 전용 속성은 각각 CATEGORY_PROPERTY_GET
및 CATEGORY_PROPERTY_SET
매크로를 사용합니다 .
원시 유형은 좀 더주의가 필요합니다.
기본 유형은 객체가 아니므로 위의 매크로에는 unsigned int
속성 유형으로 사용하기위한 예제가 포함되어 있습니다 . 정수 값을 NSNumber
개체 로 래핑하여 수행 합니다. 따라서 사용법은 이전 예제와 유사합니다.
@interface ...
@property unsigned int value;
@end
@implementation ...
CATEGORY_PROPERTY_GET_SET_UINT(value, setValue:)
@end
이 패턴에 따라, 당신은 단순히 또한 지원하기 위해 더 많은 매크로를 추가 할 수 있습니다 signed int
, BOOL
등 ...
한계
모든 매크로는 OBJC_ASSOCIATION_RETAIN_NONATOMIC
기본적으로 사용 됩니다.
App Code 와 같은 IDE 는 현재 속성의 이름을 리팩토링 할 때 setter의 이름을 인식하지 못합니다. 직접 이름을 변경해야합니다.