根据 Apple 的 Objective-C 规范,所有未标记的实例变量都是@protected
. 我没有找到任何信息来说明哪个指令是方法的默认值;他们@protected
是,@private
还是@public
?
2 回答
这些规范不适用于方法。方法的工作方式与 ObjC 中的 ivars 完全不同。具体来说,实际上并没有调用方法。一发消息。然后对象解释消息并采取一些行动。通常的操作是运行与发送的消息同名的方法,但还有其他选项。* 另一个常见的方法是抛出异常,因为对象无法弄清楚它应该对消息做什么。这个分派步骤是 ObjC 的基础,这意味着方法不能真正是私有的。
任何消息都可以发送到任何对象**,因此对象上存在的任何方法都可以在运行时运行。
可以在类扩展或类别中声明伪私有方法,这样特定的翻译单元就看不到它。然后,当您尝试发送相应的消息时,您会收到编译器警告或错误,但仍然可以(通过performSelector:
和变体,或objc_msgSend()
直接使用)运行“私有”方法。
*例如在动态方法解析和消息转发下的运行时编程指南中介绍的那些。
**需要注意的是,在 ARC 下编译并使用括号语法时[obj message]
,编译器必须已经看到该类型对象的具有该名称的方法声明,但这是另一个问题。
所有方法和所有实例变量都可以从任何地方访问(使用 KVC),没有真正的私有。但是,如果您尝试发送不在对象接口中的消息(调用方法),编译器会给您一个警告。所以@interface 中的所有方法都是公共的,其他的都是私有的。关于您的实例变量,不再需要它们。改为使用属性。