【问题标题】:How to declare member variable of subclass in TheosTheos中如何声明子类的成员变量
【发布时间】:2014-08-15 06:40:08
【问题描述】:

例如,当我声明现有类的子类时, 我可以在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

和错误:

【问题讨论】:

    标签: objective-c jailbreak theos tweak member-variables


    【解决方案1】:

    你不能,ivars 不受支持。 你可以做的是模拟属性,使用objc_getAssociatedObjectobjc_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);
    }
    

    这样您就可以将boolPropaString 作为属性访问:

    inst.boolProp = YES;
    if (inst.boolProp) {
        ...
    }
    
    inst.aString = @"Hello";
    

    在您的示例中,您还需要定义一个接口:

    @interface SBIconSubClass
        - (NSString *)aString;
        - (void)setAString:(NSString *)value;
    @end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 2011-04-04
      • 2017-06-14
      • 2016-12-23
      • 1970-01-01
      相关资源
      最近更新 更多