<分区>
与 NSObject *
相比,以“多态”方式与类型 id
相关的 Object
有区别吗?
什么方式是:
NSString* aString = @"Hello";
id anObj = aString;
不同于:
NSString* aString = @"Hello";
NSObject* anObj = aString;
<分区>
与 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;
NSObject
包含 isa
指针。
NSString* aString = @"Hello";
NSObject* anObj = aString;
来自 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/
相关文章:
iphone - 当使用泄漏进行分析时,NSURLConnection 会吸收内存
json - 如何在 Swift 中将 NSObject 类对象转换为 JSON?
objective-c - 在没有 NSObject 的情况下使用 Objective-C?
ios - 符号化 iOS 崩溃转储 : symbols not found
ios - 在 iOS 13 中获取 UIScrollView 的完整屏幕截图
objective-c - locationOfTouch 和 numberOfTouches