如何访问 Objective-C 中的受保护变量?

How to access protected variable in Objective-C?

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

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

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

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

@end

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

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

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

@end

然后将 getters 和 setters 添加到 Shadowclass 以使值可访问。

该做的:

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

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

getters 和 setters 的可访问性直接类似于 [shadowClass rootViewController:xxx] 甚至可能会因您是否使用 ARC 而有所不同。 (这里编译器的行为甚至可能是可配置的。这也是我不知道的细节。)

但是,我不确定我是否真的要推荐那个!您可能会找到更少的 "hacky" 个替代品。 并且不要低估为 Shadowclass 创建与 Someclass 完全相同的结构的重要性!