类别可以为已有的类添加方法,但是却不能直接添加属性,因为即使你添加了@property,它既不会生成实例变量,也不会生成setter、getter方法,即使你添加了也无法使用。这里的原理要单独的看runtime的本质。以及OC方法调用的原理和消息传递机制。
例如:为百度地图的类BMKPolygon添加属性identifier
#import "BMKPolygon+Identifier.h"
@implementation BMKPolygon (Identifier)
@dynamic identifier;
static char charKey;
- (void)setIdentifier:(NSString *)identifier{
objc_setAssociatedObject(self, &charKey, identifier, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)identifier{
return objc_getAssociatedObject(self, &charKey);
}
@end
#import "BMKPolygon+Identifier.h"
@implementation BMKPolygon (Identifier)
@dynamic identifier;
static char charKey;
- (void)setIdentifier:(NSString *)identifier{
objc_setAssociatedObject(self, &charKey, identifier, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)identifier{
return objc_getAssociatedObject(self, &charKey);
}
@end
网友评论