Objective-C私有方法困境

Jor*_*ith 10 iphone inheritance objective-c ipad ios

我知道Objective-C不支持真正的私有方法.我目前正在做的声明'私有'方法是在类.m文件中添加以下内容:

@interface MyClass() 

- (void) privateMethodName;

@end
Run Code Online (Sandbox Code Playgroud)


问题:

如果我现在添加一个子类,并想使用这个'私有'方法,我不能!我收到错误:

用于实例消息的接收器类型"SubClassName"未声明具有选择器"privateMethodName"的方法


因此,如果我不希望非子类能够访问此方法,但确实希望子类能够,我该怎么办?实现目标的最佳/正确方法是什么?

Dir*_*irk 16

您可以将"受保护"界面与公共界面分开.在主标头中,只需声明公共方法:

MyMagicThingy.h:

@interface MyMagicThingy: NSObject

- (void) publicMethod;

@end 
Run Code Online (Sandbox Code Playgroud)

然后,有一个带有受保护方法的附加标头:

MyMagicThingy+Protected.h:

#import "MyMagicThingy.h"

@interface MyMagicThingy (Protected)

- (void) protectedMethods;

@end
Run Code Online (Sandbox Code Playgroud)

您不能在Objective C中拥有"真正的"私有/受保护/公共方法(如:编译器将强制执行访问规则.所有方法都是公共的).你必须遵守惯例.