消息轉發過程訪問/設置私有變量或者屬性

消息轉發過程中, 如果需要在分類中訪問/設置私有變量或者屬性, 可以參照如下方法。

#import <objc/runtime.h>

void startEngine(id self, SEL _cmd, NSString *brand, NSString *name) {
    // 訪問成員變量
    Ivar engineIvar = class_getInstanceVariable([self class], "_engine");
    if (engineIvar) {
        id engineValue = object_getIvar(self, engineIvar);
        NSLog(@"---我的engineValue:%@",engineValue);
        // 使用 engineValue 進行操作
        object_setIvar(self, engineIvar, @(8888));
        id engineValue1 = object_getIvar(self, engineIvar);
        NSLog(@"---我的engineValue1:%@",engineValue1);
    }
    
    // 設置成員變量
    Ivar mileageIvar = class_getInstanceVariable([self class], "_mileage");
    if (mileageIvar) {
        id mileageValue = object_getIvar(self, mileageIvar);
        NSLog(@"---我的mileageValue:%@",mileageValue);
        object_setIvar(self, mileageIvar, @(10000));
        id mileageValue1 = object_getIvar(self, mileageIvar);
        NSLog(@"---我的mileageValue1:%@",mileageValue1);
    }
    
    SEL propertyGetter = NSSelectorFromString(@"horsepower");//訪問屬性,
    SEL propertySetter = NSSelectorFromString(@"setHorsepower:");//設置屬性
    
    if ([self respondsToSelector:propertyGetter]) {
        id propertyValue = [self performSelector:propertyGetter];
        NSLog(@"---horsepower2 : %@,", propertyValue);
    }
    
    if ([self respondsToSelector:propertySetter]) {
        [self performSelector:propertySetter withObject:@(200)];
        id propertyValue = [self performSelector:propertyGetter];
        NSLog(@"---- horsepower1 : %@,", propertyValue);
    }
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容