由于我编程的情况,我需要在类中实现一些方法而不实际编辑类,所以我使用类别。
问题是类的接口中没有包含方法,但是在类实现中实现。我假设这只是意味着他们是私人方法。
类别是否无法访问其主类的私有方法?当我尝试使用我的类别中的一个私有方法时,我收到错误:
"没有可见的@interface为' MainClass'声明选择器' privateMethod'"
这是可以理解的,因为它不在界面中,但我认为从逻辑上讲,我能够访问实现中的所有内容。
答案 0 :(得分:4)
您想要调用的方法需要在某处声明。您可以使用自己的类别自行声明它们:
@interface MainClass(MyPrivateMethods)
- (CGRect)privateMethod:(NSString*)someParameter;
@end
那将摆脱"没有可见的@interface for' MainClass'声明选择器"编译器警告,你只需要希望它在运行时工作。如果MainClass
没有带有那些参数和返回类型的名称的方法,那么它将在运行时失败。
(您也可以使用performSelector:
,但仍可能会收到有关无法识别的选择器的警告,具体取决于您的编译器设置,并且不适用于所有参数和返回类型。)
答案 1 :(得分:2)
有一种标准的处理方法。
@interface MainClass ()
- (void)privateMethod;
@end
如果您只需要访问1 .m文件中的方法,请将声明放在该文件的顶部。如果需要访问超过1个.m文件,则创建一个MainClassSubclass.h标头来保存这些方法。
有关此模式的示例,请查看UIGestureRecognizer
中的UIGestureRecognizerSubclass.h
实际上,您将私有方法转为protected method。