访问主类私有方法的类别 - 目标C.

时间:2015-01-13 18:49:58

标签: objective-c categories private-methods

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

问题是类的接口中没有包含方法,但是在类实现中实现。我假设这只是意味着他们是私人方法。

类别是否无法访问其主类的私有方法?当我尝试使用我的类别中的一个私有方法时,我收到错误:

"没有可见的@interface为' MainClass'声明选择器' privateMethod'"

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

2 个答案:

答案 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