例如,当我声明现有类的子类时, 我可以在下面写一下:
%subclass NEWCLASS: EXISTINGCLASS
- (void)overridemethod {
//code
}
%new(v@:)
- (void)newmethod {
//code
}
%end
但我不知道如何声明新类的成员或属性变量......
我该怎么办?
好的,我明白了。
但是编译包时会出错。
我编写的代码如下:
%subclass SBIconSubClass: SBIcon
%new
- (NSString *)aString {
return objc_getAssociatedObject(self, @selector(aString));
}
%new
- (void)setAString:(NSString *)value {
objc_setAssociatedObject(self, @selector(aString), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (id)application {
self.aString = @"Test";
NSLog(@"%@",self.aString);
return %orig;
}
%end
和错误:
答案 0 :(得分:3)
您不能,ivars
不受支持。
您可以使用objc_getAssociatedObject
和objc_setAssociatedObject
模拟属性。
%new
- (BOOL)boolProp {
NSNumber * _boolProp = objc_getAssociatedObject(self, @selector(boolProp));
return _boolProp ? [_boolProp boolValue] : NO;
}
%new
- (NSString *)aString {
return objc_getAssociatedObject(self, @selector(aString));
}
%new
- (void)setBoolProp:(BOOL)value {
objc_setAssociatedObject(self, @selector(boolProp), @(value), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
%new
- (void)setAString:(NSString *)value {
objc_setAssociatedObject(self, @selector(aString), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
这样您就可以访问boolProp
和aString
作为属性:
inst.boolProp = YES;
if (inst.boolProp) {
...
}
inst.aString = @"Hello";
在您的示例中,您还需要定义一个接口:
@interface SBIconSubClass
- (NSString *)aString;
- (void)setAString:(NSString *)value;
@end