类别访问 main class - Objective C 的私有方法

Category accessing private methods of main class - Objective C

由于我正在编程的情况,我需要在 class 中实现一些方法而不实际编辑 class,所以我使用类别。

麻烦的是有些方法没有包含在 class 的接口中,但在 class 实现中实现了。我假设这只是意味着它们是私有方法。

难道一个类别不能访问它的主要class的私有方法吗?当我尝试使用我的类别中的一种私有方法时,出现错误:

"No visible @interface for 'MainClass' declares the selector 'privateMethod'"

这是可以理解的,因为它不在界面中,但我认为从逻辑上讲,我可以访问实现中的所有内容。

您要调用的方法需要在某处声明。您可以使用自己的类别自行声明它们:

@interface MainClass(MyPrivateMethods)
- (CGRect)privateMethod:(NSString*)someParameter;
@end

这将消除 "No visible @interface for 'MainClass' declares the selector" 编译器警告,您只需要希望它在运行时运行即可。如果 MainClass 没有具有这些参数和 return 类型的同名方法,那么它将在运行时失败。

(您也可以使用 performSelector:,但您可能仍会收到有关无法识别的选择器的警告,具体取决于您的编译器设置,并且不适用于所有参数和 return 类型)。

有一个标准的方法来处理这个问题。

@interface MainClass ()
- (void)privateMethod;
@end

如果您只需要访问 1 个 .m 文件中的方法,则将声明放在该文件的顶部。如果您需要访问超过 1 个 .m 文件,请创建一个 MainClassSubclass.h header 来保存这些方法。

有关此模式的示例,请查看 UIGestureRecognizer

中的 UIGestureRecognizerSubclass.h

实际上,您正在将私有方法转换为 protected method