我在我的应用程序中使用的外部框架定义了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
。
我有什么方法可以解决它而不修改原始头文件?
答案 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上获取应用程序。