Objective-C:访问声明为@private的实例变量

时间:2014-02-17 13:37:28

标签: objective-c class private-members

我在我的应用程序中使用的外部框架定义了theClass,其内部结构是不透明的。

其实例变量不应直接访问。

@class TheClassPrivateVars;

@interface TheClass : NSObject
{
    @private
    TheClassPrivateVars *_theClassPriv;
}

@end

框架公共接口并不完整,并且(由我自己承担风险)我想阅读myClass的一个私有变量。

幸运的是,框架提供了完整的源代码,因此我可以访问TheClassPrivateVars的定义:

@interface TheClassPrivateVars : NSObject
{
    int thePrivateInstanceVar; // I want to read this!

    //
    // other properties here...
    //
}

@end

我使用上面的代码创建了一个头文件,并将其包含在源文件中,其中必须发生“滥用访问”。

theValue = instanceOfTheClass->_theClassPriv->thePrivateInstanceVar;

不幸的是,_theClassPriv被声明为@private

我有什么方法可以解决它而不修改原始头文件

3 个答案:

答案 0 :(得分:14)

TheClassPrivateVars* private = [instanceOfTheClass valueForKey:@"_theClassPriv"];

编辑:或使用关键路径:

theValue = [[instanceOfTheClass valueForKeyPath:"_theClassPriv.thePrivateProperty"] integerValue];

答案 1 :(得分:4)

#import <objc/runtime.h>

TheClassPrivateVars *_data;
object_getInstanceVariable(self, "_theClassPriv", (void**)&_data);

你不能这样做吗?

答案 2 :(得分:-1)

如果它是一个Apple框架告诉我们你正在讨论什么框架和什么属性可能是一个好主意,因为一些有根据的猜测究竟是多么愚蠢或不是访问私有财产。毕竟,私人财产明天就可以消失。而且您将无法轻松地在App Store上获取应用程序。