我懂Java,现在我正在学习Objective-C.Java接口和Objective-C协议之间到底有什么区别?

推荐答案

首先是一位Java的创造者写的大约historical perspective on the topic篇文章.接下来,维基百科有一个适度有用的section on Objective-C protocols.特别是,要理解Objective-C支持formal protocols(用@protocol关键字显式声明,相当于Java接口)和informal protocols(一个类实现的一个或多个方法,可以通过反射发现).

如果您采用正式的协议(Objective-C术语,意为"实现接口"),编译器将为未实现的方法发出警告,正如您在Java中所期望的那样与Java(如skaffman所述)不同,如果Objective-C类实现了一个正式协议中包含的方法,那么它被称为"符合"该协议,即使它的接口没有显式地采用它您可以在代码中测试协议一致性(使用-conformsToProtocol:),如下所示:

if ([myObject conformsToProtocol:@protocol(MyProtocol)]) {
    ...
}

注:苹果的documentation个州:

"此方法仅基于头文件中的正式声明来确定一致性,如上所示.它不判断协议中声明的方法是否实际实现,这是程序员的责任."

从Objective-C2.0(在OS X 10.5"Leopard"和iOS中)开始,正式的协议现在可以定义optional methods,一个类只要实现了所有必需的方法,就符合协议.您可以使用@required(默认)和@optional关键字来切换mustmay之后的方法声明是否被实现以符合协议.(请参阅苹果Objective-C 2.0 Programming Language指南中讨论optional protocol methods的部分.)

可选协议方法为开发人员提供了很大的灵活性,尤其是对于实现delegateslisteners.您可以采用协议,只实现您关心的可选方法,而不是扩展MouseInputAdapter(这可能很烦人,因为Java也是单继承)之类的东西,或者实现许多无意义的空方法.使用此模式,调用方在调用该方法(使用-respondsToSelector)之前判断该方法是否已实现,如下所示:

if ([myObject respondsToSelector:@selector(fillArray:withObject:)]) {
    [myObject fillArray:anArray withObject:foo];
    ...
}

如果反射的开销成为一个问题,你总是可以 Select cache the boolean result for reuse,但要抵制过早优化的冲动.:-)

Objective-c相关问答推荐

Objective-C:为什么[对象复制]的两个请求返回相同的结果?

Objective-C struct 的默认值以及如何测试

警告:格式字符串不是字符串文字(可能不安全)

错误无法使 UICollectionElementKindCell 类型的视图出列

验证应用内购买的收据

无法编译连接:错误是什么意思?

如何在目标 C 中创建单例类

不区分大小写的核心数据 CONTAINS 或 BEGINS WITH 约束

NSUInteger 不应该在格式字符串中使用吗?

更改 UIBarButtonItem 的 Tint colored颜色

在 iOS 中创建带有 URL 的 UIImage

如何从 AVPlayer(不是 AVAudioPlayer)获取持续时间?

对块进行类型定义是如何工作的

如何在 Objective-C 中创建静态方法?

未找到 Apple Mach-O 链接器警告目录

如何为 iPhone 应用程序创建多个主题/皮肤?

交换 NSMutableArray 中的元素

点击手势识别器 - 哪个对象被点击了?

如何在 UITextField 上自动打开键盘?

@synthesized 保留属性的释放是如何处理的?