在Objective-C中,声明变量id和声明变量NSObject *有什么区别?

推荐答案

使用类型为id的变量,可以发送任何已知消息,编译器不会抱怨.对于类型为NSObject *的变量,只能向其发送NSObject声明的消息(不是任何子类的方法),否则它将生成警告.一般来说,id是你想要的.

进一步说明:所有对象基本上都是id型.声明静态类型的目的是告诉编译器,"假设这个对象是这个类的一个成员."因此,如果您向它发送一条类没有声明的消息,编译器可以告诉您,"等等,该对象不应该得到该消息!"此外,如果两个类有名称相同但签名不同的方法(即参数或返回类型),它可以通过为变量声明的类猜测您指的是哪个方法.如果它被声明为id,编译器就会举手告诉你,"好吧,我这里没有足够的信息.我随机选取了一个方法签名."(不过,声明NSObject*通常不会有帮助.通常冲突发生在两个更具体的类之间.)

Objective-c相关问答推荐

Objective c 判断文本字段是否为空

如何声明仅调试语句

具有动态高度的子视图的自动布局 UIScrollView

Objective C for循环中断并继续

为什么 NSDateFormatter 为这 4 个时区返回 nil 日期?

XCTAssert 和 XCTAssertTrue 有什么区别?

如何知道 NSAssert 在发布版本中是否被禁用?

如何在 iOS 中拨打电话?

我们可以在 UIPageViewController 中自定义页面指示器吗?

如何四舍五入浮点值?

带有块的 Objective-C 延迟动作

IOS 6强制设备方向为横向

cellForRowAtIndexPath 是如何工作的?

Xcode - 如何将 XIB 连接到 ViewController 类

根据文本量更改 UITableViewCell 高度

iOS 10 中的错误:无法从 https://mesu.apple.com/assets/ 复制assets资源信息以获取assets资源类型

如何将 tintColor 应用于 UIImage?

捕捉固定步数的 UISlider(如 iOS 7 设置应用程序中的文本大小)

ld:找不到文件:链接器命令失败,退出代码为 1

info.plist 中的Application Requires iPhone Environment键是什么意思?