【问题标题】:Objective-C: accessing instance variables declared as @privateObjective-C:访问声明为@private 的实例变量
【发布时间】:2014-03-16 20:05:00
【问题描述】:

我在应用程序中使用的外部框架定义了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

有什么办法可以绕过它不修改原始头文件

【问题讨论】:

  • 这不是访问器方法的用途吗?还是不能编辑外部框架的代码?也许您可以继承 TheClass,或者将其作为属性添加到您自己的类中?读取 myClass 的属性应该不会太冒险,除非您开始编辑指针指向的地址处的值。
  • 没有访问器方法,我不想编辑框架代码并重新编译它。
  • @Paolo:“我不想编辑框架代码并重新编译它”你不需要编辑框架代码。您只需在 your 代码中定义该类的类别。
  • "它的属性不能直接访问。"术语说明:“属性”= getter/setter 方法对。方法不能是私有的或公共的。您所说的是实例变量,而不是属性。
  • @newacct:编辑了术语,谢谢。至于您之前的评论,我似乎无法访问具有用户 Avt 建议的类别的变量。

标签: objective-c class private-members


【解决方案1】:
TheClassPrivateVars* private = [instanceOfTheClass valueForKey:@"_theClassPriv"];

编辑:或使用关键路径:

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

【讨论】:

  • 它不起作用 - 只有实例变量,没有属性。
  • 如果我错了,请不要开枪,但我认为使用点符号访问属性仅在访问器方法为 @synthesized 时才有效,这会使这个问题过时。
【解决方案2】:
#import <objc/runtime.h>

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

你就不能这样做吗?

【讨论】:

  • 小错字 -- 应该是#import
【解决方案3】:

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

【讨论】:

  • 该框架不是来自苹果(苹果不发布其框架的源代码)并且该应用不通过互联网或应用商店向公众分发(它只是在我们公司内部使用)
猜你喜欢
  • 2012-01-23
  • 2012-03-10
  • 1970-01-01
  • 2011-11-02
  • 2018-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多