我知道受保护的变量不能访问类的类,但可以在Category或SubClass中访问它们,我认为Subclass不可能,但它是否与Category相同?
我想要做的是对github库的一些修改,但我不想修改原始源代码。我希望通过子类化或使用类别来实现这一点,但问题是我想引用一些受保护的变量。
.m文件中的受保护变量: -
@interface Someclass() {
NSMutableDictionary *viewControllers;
__weak UIViewController *rootViewController;
UIPageViewController *pageController;
}
@end
答案 0 :(得分:1)
类别不能访问私有实例变量,子类也不能这样做。
由于您可以访问源代码并且不想更改原始源代码,因此您可以创建具有完全相同数据结构的另一个类。 (完全以相同的方式和顺序声明相同的变量名称和类型)。
@interface Shadowclass() {
NSMutableDictionary *viewControllers;
__weak UIViewController *rootViewController;
UIPageViewController *pageController;
}
@end
然后将getter和setter添加到Shadowclass
以使值可访问。
do:
Someclass *someclass = ... // you get the object from somewhere somehow.
object_setClass(someClass, [ShadowClass class]);
someclass是如何使用ShadowClass类型的,您可以访问getter和setter。坦率地说,如果允许现在someClass
转换为ShadowClass
类型的对象变量,我不确定当前编译器如何允许直接访问getter,但您可以使用performSelector
来访问吸气剂或者二传手。
直接使用[shadowClass rootViewController:xxx]
的getter和setter的可访问性甚至可能会因您是否使用ARC而有所不同。 (这里的编译器行为甚至可以配置。这也是我不知道的细节。)
但是,我不确定我是否真的想推荐它!你可能会发现更少的" hacky"备择方案。
并且不要低估为Shadowclass
创建与Someclass
完全相同的结构的重要性!