Oha*_*gev 8 objective-c nsobject ios
是否有涉及的之间的差异Object
与类型"多态"的方式id
不是NSObject *
?
以什么方式:
NSString* aString = @"Hello";
id anObj = aString;
Run Code Online (Sandbox Code Playgroud)
不同于:
NSString* aString = @"Hello";
NSObject* anObj = aString;
Run Code Online (Sandbox Code Playgroud)
Par*_*fna 10
id
是Objective-C中使用的一个特殊关键字,意思是"某种对象."它不包含isa
指针(isa
给对象访问它的类,并通过类,它来自它继承的所有类),所以你输了有关该对象的编译时信息.
NSString* aString = @"Hello";
id anObj = aString;
Run Code Online (Sandbox Code Playgroud)
NSObject
包含isa
指针.
NSString* aString = @"Hello";
NSObject* anObj = aString;
Run Code Online (Sandbox Code Playgroud)
请考虑以下代码:
id someObject = @"Hello, World!";
[someObject removeAllObjects];
Run Code Online (Sandbox Code Playgroud)
在这种情况下,someObject将指向一个NSString
实例,但除了它是某种对象之外,编译器对该实例一无所知.所述removeAllObjects
消息是由一些可可或可可触摸对象(如定义的NSMutableArray
),从而,编译器不抱怨,即使该代码将在运行时生成异常,因为一个NSString对象不能响应removeAllObjects
.
重写代码以使用静态类型:
NSString *someObject = @"Hello, World!";
[someObject removeAllObjects];
Run Code Online (Sandbox Code Playgroud)
意味着编译器现在将生成错误,因为removeAllObjects
它没有在NSString
它知道的任何公共接口中声明.
id
是通用的.通过使用id
您告诉编译器您将在以后填写有关使用的详细信息.编译器假定您拥有的任何代码都是正确的,并且不会向您发出任何警告.在运行时,会进行检查以验证您要执行的操作,如果您的代码错误,您将收到异常.
NSObject
是具体的.通过使用NSObject
你告诉编译器确切的对象是什么.当您尝试在其上调用方法时,将检查它们的NSObject
理解.如果出错,您将收到编译时错误.
所有这一切,你可以在两种情况下转换为另一种类型.
您的关注点是将来您将要参考的内容.一般来说,使用NSObject
没有任何好处.
归档时间: |
|
查看次数: |
5286 次 |
最近记录: |