美文网首页iOS开发-面试
id和NSObject *和instanceType的区别与联系

id和NSObject *和instanceType的区别与联系

作者: 泉泉泉 | 来源:发表于2016-02-01 15:30 被阅读87次

    id 被成为万能指针,也就是可以指向任何对象.NSObject * 本身就是定义指向NSObject类型的指针.那么这两者有什么区别吗?这两者都是既可以作为返回值,又可以作为变量修饰.而其主要区别则在于id修饰的变量不遵循协议.这在实现代理模式中会体现出其区别,例如在调用代理方法时会先判断该代理是否能够响应某个方法  [obj respondsToSelector:]就定义在NSObject协议中.

    那么,苹果后来为什么有使用instancType呢?

    我觉得主要原因有两个,

    第一,是命名问题:很多数据库的设计,均有id字段.(当然,现在依然不能使用);

    第二,instancType只能作为方法返回值,不能修饰变量.而当作为方法返回值时,它与id的主要区别是什么呢?

    举个简单例子:

    NSString *str = [Person person];

    NSLog(@"%lu", str.length);

    对于以上代码,如果

    [Person person]返回值为id类型,则在编辑代码时xcode不会报错或者警告,运行时则会崩溃(因为OC是动态检测对象的真实类型);

    反之,当其返回值为instanceType时,xcode则会报出警告.

    所以,建议写类的方法时,对于返回值,如果是id类型的话,尽量使用instanceType.

    相关文章

      网友评论

        本文标题:id和NSObject *和instanceType的区别与联系

        本文链接:https://www.haomeiwen.com/subject/hqpskttx.html