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

Pao*_*olo 4 class objective-c private-members

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

它的实例变量不能直接访问.

@class TheClassPrivateVars;

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

@end
Run Code Online (Sandbox Code Playgroud)

框架公共接口的并不完整,因为它应该和(在我的我自己的风险),我想读的私有变量之一myClass.

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

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

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

@end
Run Code Online (Sandbox Code Playgroud)

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

theValue = instanceOfTheClass->_theClassPriv->thePrivateInstanceVar;
Run Code Online (Sandbox Code Playgroud)

不幸的_theClassPriv是被宣布为@private.

有没有办法在不修改原始头文件的情况下绕过它?

Mic*_*iak 14

TheClassPrivateVars* private = [instanceOfTheClass valueForKey:@"_theClassPriv"];
Run Code Online (Sandbox Code Playgroud)

编辑:或使用关键路径:

theValue = [[instanceOfTheClass valueForKeyPath:"_theClassPriv.thePrivateProperty"] integerValue];
Run Code Online (Sandbox Code Playgroud)

  • 它不起作用 - 只有实例变量,而不是属性。 (3认同)
  • 让我们尝试;)它会 (3认同)

Dav*_*der 5

#import <objc/runtime.h>

TheClassPrivateVars *_data;
object_getInstanceVariable(self, "_theClassPriv", (void**)&_data);
Run Code Online (Sandbox Code Playgroud)

你不能这样做吗?