id 、NSObject、id<NSObject>

2019-02-23  本文已影响1人  liboxiang

id是Objective-C中使用的一个特殊关键字,意思是“某种对象”。id 指向的对象并不全是 NSObject 的子类。它不包含isa指针(isa给对象访问它的类,并通过类,它来自它继承的所有类),所以你输了有关该对象的编译时信息。

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

NSObject包含isa指针。

请考虑以下代码:

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

在这种情况下,someObject将指向一个NSString实例,但除了它是某种对象之外,编译器对该实例一无所知。所述removeAllObjects消息是由一些可可或可可触摸对象(如定义的NSMutableArray),从而,编译器不抱怨,即使该代码将在运行时生成异常,因为一个NSString对象不能响应removeAllObjects

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

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

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

上一篇 下一篇

猜你喜欢

热点阅读