我知道Objective-C不支持真正的私有方法。我目前正在做的声明'私有'方法是将以下内容添加到类.m文件中:
@interface MyClass()
- (void) privateMethodName;
@end
问题:
如果我现在添加一个子类,并想使用这个'私有'方法,我不能!我收到错误:
实例消息的接收者类型“SubClassName”未声明a 选择器'privateMethodName'
的方法
因此,如果我不希望非子类能够访问此方法,但确实希望子类能够,我该怎么办?实现目标的最佳/最佳方式是什么?
答案 0 :(得分:16)
您可以将“受保护”界面与公共界面分开。在主标题中,只需声明公共方法:
MyMagicThingy.h
:
@interface MyMagicThingy: NSObject
- (void) publicMethod;
@end
然后,有一个带有受保护方法的附加标题:
MyMagicThingy+Protected.h
:
#import "MyMagicThingy.h"
@interface MyMagicThingy (Protected)
- (void) protectedMethods;
@end
你不能在Objective C中拥有“真正的”私有/受保护/公共方法(如:编译器将强制执行访问规则。所有方法都是公共的)。你必须遵守惯例。
答案 1 :(得分:2)
您所描述的实际上是受保护的方法。克服这个问题的一种方法是:Ivars可以声明为@public
,@protected
或@private
。您可以声明一个受保护的帮助器实例来限制对派生实例的访问,派生实例然后通过保存它的对象回调。
在某些情况下,另一种选择是让子类写入接口,然后将您的实现保密。
有时候,你只需要记录“不要这样做,除非你不是一个子类”,因为它不是语言的一部分。在这种思维模式中,一个声明一类受保护方法的单独标题是我最喜欢的标题之一。它很好地隐藏在客户端之外,但可以通过显式包含对子类可见--Dirk同时提供了一个示例,请查看它。
最后,如果您对ObjC ++感到满意,C ++会提供此控件,因此您可以非常自由地混合模式和可见性。
答案 2 :(得分:0)
你无法让任何人无法调用Objective-C中对象上实现的任何方法(至少不会烧掉几十个剃须刀,使得Yaks的防风雨性能降低)。
只是不要调用未在公共头文件中声明的方法作为约定(这就是你正在做的事情)。
上段中的 public 这个词可以解决问题:
在Objective-C中(至少在目前的版本中),可以使用您刚才在帖子中描述的技术在任何数量的头文件上定义类的接口:类连续。
Apple框架类的一个这样的示例是UIGestureRecognizer
,其单独的子类标题UIGestureRecognizerSubclass.h
。
PS:
您看到的错误是使用ARC,所以您的运行时肯定是最近的,甚至可以使用多个实现文件。