如何访问 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
完全相同的结构的重要性!
我知道无法在 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
完全相同的结构的重要性!