【问题标题】: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 完全相同的结构的重要性!