ios - 使用和不使用协议(protocol)将选择器发送到 id 有什么区别?

标签 ios objective-c compiler-errors clang

怎么可能呢?

编译错误:

id<NSCoding> response = [[NSObject alloc] init];
id copy = [response copy];

编译成功:

id response = [[NSObject alloc] init];
id copy = [response copy];

编译成功:

id<NSCoding> response = [[NSObject alloc] init];
id copy = [((id)response) copy];

$clang --version
Apple LLVM version 5.1 (clang-503.0.38) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.1.0
Thread model: posix

附言代码仅用于演示,将引发 NSInvalidArgumentException

最佳答案

当您声明类型为 id<SomeProtcol> 的变量时,编译器假定您只会调用协议(protocol)中的方法。 copy不是 NSCoding 的方法协议(protocol)。

当然如果变量只是id ,您可以调用当时任何已知类/协议(protocol)中可用的任何方法。

关于ios - 使用和不使用协议(protocol)将选择器发送到 id 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23345172/

相关文章:

ios - 无法追踪的 AFNetworking 内存泄漏

ios - 如何创建自定义 Xcode 预处理器宏

ios - 如何使用 NSSetUncaughtExceptionHandler 获取未捕获异常的类、方法和行号

ios - 我应该使用哪个类在 View 之间滑动?

ios - 如何创建带有大图像的苹果推送通知横幅

ios - 如何将NSString初始化为带双引号的文本

ios - 当我在 NSOperation 执行 performSelectorOnMainThread 时弹出导航 Controller 时应用程序崩溃

c++ - Dev C++中的嵌入式SQL

Android源代码编译问题

c# Dapper - 在 QueryAsync 方法上使用 linq