iOS > "id"与 NSObject

标签 ios objective-c nsobject

<分区>

NSObject * 相比,以“多态”方式与类型 id 相关的 Object 有区别吗?

什么方式是:

NSString* aString = @"Hello";
id anObj = aString;

不同于:

NSString* aString = @"Hello";
NSObject* anObj = aString;

最佳答案

id 是 Objective-C 中用来表示“某种对象”的特殊关键字。它不包含 isa 指针(isa,让对象访问它的类,并通过类访问它继承的所有类),所以你失去了编译 -对象的时间信息。

NSString* aString = @"Hello";
id anObj = aString;  

enter image description here

NSObject 包含 isa 指针。

NSString* aString = @"Hello";
NSObject* anObj = aString;

enter image description here

来自 Objective-C Is a Dynamic Language

考虑以下代码:

id someObject = @"Hello, World!";
[someObject removeAllObjects];

在这种情况下,someObject 将指向一个 NSString 实例,但编译器除了知道它是某种对象之外对该实例一无所知。 removeAllObjects 消息由某些 Cocoa 或 Cocoa Touch 对象(例如 NSMutableArray)定义,因此编译器不会报错,即使此代码会在运行时生成异常,因为NSString 对象无法响应 removeAllObjects

重写代码以使用静态类型:

NSString *someObject = @"Hello, World!";
[someObject removeAllObjects];

意味着编译器现在将生成一个错误,因为 removeAllObjects 没有在它知道的任何公共(public) NSString 接口(interface)中声明。

关于iOS > "id"与 NSObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19634367/

相关文章:

iOS:什么速度阈值使平移手势成为轻弹?

iphone - 当使用泄漏进行分析时,NSURLConnection 会吸收内存

IOS NSObject 发布

json - 如何在 Swift 中将 NSObject 类对象转换为 JSON?

objective-c - 在没有 NSObject 的情况下使用 Objective-C?

ios - 符号化 iOS 崩溃转储 : symbols not found

ios - 在 iOS 13 中获取 UIScrollView 的完整屏幕截图

objective-c - locationOfTouch 和 numberOfTouches

ios - 最好在约束更改之前或之后调用 .layoutIfNeeded()

iphone - 设置单元格文本颜色