1

根据 Apple 的 Objective-C 规范,所有未标记的实例变量都是@protected. 我没有找到任何信息来说明哪个指令是方法的默认值;他们@protected是,@private还是@public

4

2 回答 2

2

这些规范不适用于方法。方法的工作方式与 ObjC 中的 ivars 完全不同。具体来说,实际上并没有调用方法。一发消息。然后对象解释消息并采取一些行动。通常的操作是运行与发送的消息同名的方法,但还有其他选项。* 另一个常见的方法是抛出异常,因为对象无法弄清楚它应该对消息做什么。这个分派步骤是 ObjC 的基础,这意味着方法不能真正是私有的。

任何消息都可以发送到任何对象**,因此对象上存在的任何方法都可以在运行时运行。

可以在类扩展或类别中声明伪私有方法,这样特定的翻译单元就看不到它。然后,当您尝试发送相应的消息时,您会收到编译器警告或错误,但仍然可以(通过performSelector:和变体,或objc_msgSend()直接使用)运行“私有”方法。


*例如在动态方法解析和消息转发下的运行时编程指南中介绍的那些。

**需要注意的是,在 ARC 下编译并使用括号语法时[obj message],编译器必须已经看到该类型对象的具有该名称的方法声明,但这是另一个问题。

于 2012-10-04T18:10:28.010 回答
0

所有方法和所有实例变量都可以从任何地方访问(使用 KVC),没有真正的私有。但是,如果您尝试发送不在对象接口中的消息(调用方法),编译器会给您一个警告。所以@interface 中的所有方法都是公共的,其他的都是私有的。关于您的实例变量,不再需要它们。改为使用属性。

于 2012-10-04T18:10:03.190 回答