访问私有变量而不创建属性

时间:2016-06-24 19:14:52

标签: ios objective-c

说,我在isStarted类&中定义了一个私有变量MyService。这个班是一个单身人士:

@implementation MyService {
    BOOL isStarted;
}
...
@end

我的问题:

没有创建属性&访问者,有一种方法可以在我获得此类[MyService sharedInstance]的实例后从另一个类访问此私有变量。如果有办法,请你告诉我怎么样?提前谢谢。

(请不要谈论"不建议这样做"等等。我理解。我只是对在objective-c中访问私有字段的可能性感到好奇。 )

2 个答案:

答案 0 :(得分:3)

嗨再次=)有一种方法 - 您可以在运行时获取所有类变量,并且搜索需要一个。这仍然很难,不推荐。你为什么不想使用属性?

  - (void*)getValueWithName:(const char*)varName forClass:(NSString*)className {
        unsigned int varCount;

        Class theClass = NSClassFromString(className);
        Ivar *vars = class_copyIvarList(theClass, &varCount);

        for (int i = 0; i < varCount; i++) {
            Ivar var = vars[i];

            const char* name = ivar_getName(var);
            if (strcmp(name, varName) == 0) {
                ptrdiff_t offset = ivar_getOffset(var);
                unsigned char* bytes = (unsigned char *)(__bridge void*)self;
                free(vars);
                return (bytes+offset);
            }

        }



 free(vars);
        return NULL;
    }

铸造价值:

NSInteger t = *(NSInteger*)[self getValueWithName:"p" forClass:@"ViewController"];
BOOL checkBool = *(BOOL*)[self getValueWithName:"boolean" forClass:@"ViewController"];
NSString *checkString = *((__unsafe_unretained NSString **)([self getValueWithName:"string" forClass:@"ViewController"]));

答案 1 :(得分:0)

我不确定单身是否会使这与众不同,但这是一个类似的问题。

根据这篇文章,你可以。

Accessing private variables from an external class - iOS

这有点旧,但我会试一试。

具体来说,这一行

[object valueForKey:@"variable_name"];       
相关问题