接口方法的默认可见性是什么?

时间:2012-10-04 18:00:26

标签: objective-c methods interface member

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

2 个答案:

答案 0 :(得分:2)

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

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

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


*例如动态方法解析和消息转发下Runtime Programming Guide中提供的那些。

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

答案 1 :(得分:0)

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