类别访问 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。
由于我正在编程的情况,我需要在 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。