2

たとえば、既存のクラスのサブクラスを宣言する場合、theos では次のように記述できます。

%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

とエラー:

ここに画像の説明を入力

4

1 に答える 1

2

できません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
于 2014-08-15T08:02:13.247 に答える