【问题标题】:How to access protected variable in Objective-C?如何在 Objective-C 中访问受保护的变量?
【发布时间】:2016-02-19 21:25:58
【问题描述】:

我知道受保护的变量不能在类之外访问,但是可以在 Category 或 SubClass 中访问它们,我认为 Subclass 是不可能的,但 Category 的情况是否相同?

我想做的是对 github 的库形式进行一些修改,但我不想修改原始源代码。我想通过子类化或使用类别来实现这一点,但问题是我想引用一些受保护的变量。

.m 文件中的受保护变量:-

@interface Someclass() {
    NSMutableDictionary *viewControllers;
      __weak UIViewController *rootViewController;
    UIPageViewController *pageController;
}

@end

【问题讨论】:

标签: objective-c io subclass protected objective-c-category


【解决方案1】:

类别不能访问私有实例变量,子类也不能这样做。

由于您可以访问源代码并且不想更改原始源代码,因此您可以创建另一个具有完全相同数据结构的类。 (以完全相同的方式和顺序声明的相同变量名称和类型)。

@interface Shadowclass() {
    NSMutableDictionary *viewControllers;
      __weak UIViewController *rootViewController;
    UIPageViewController *pageController;
}

@end

然后将 getter 和 setter 添加到 Shadowclass 以使值可访问。

要做的事:

Someclass *someclass = ... // you get the object from somewhere somehow. 
object_setClass(someClass, [ShadowClass class]); 

someclass 是如何属于 ShadowClass 类型的,您可以访问 getter 和 setter。坦率地说,我不确定当前编译器如何允许直接访问 getter,如果您现在可以将 someClass 转换为 ShadowClass 类型的对象变量,但您可以使用 performSelector 访问 getter 或 setter。

无论您是否使用 ARC,getter 和 setter 的可访问性(如 [shadowClass rootViewController:xxx])甚至可能会有所不同。 (这里的编译器行为甚至可能是可配置的。这也是我不知道的细节。)

但是,我不确定我是否真的要推荐它!您可能会发现更少“hacky”的替代品。 不要低估为Shadowclass 创建与Someclass 完全相同的结构的重要性!

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 2014-12-06
    • 2023-01-13
    • 2014-05-14
    • 2019-10-27
    • 2013-04-09
    • 1970-01-01
    • 2012-01-12
    相关资源
    最近更新 更多