A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© liu01230 中级黑马   /  2015-5-15 21:57  /  2520 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

id指针是万能指针 ,它可以指向任何OC对象。但是为什么不直接用NSObject类型的指针,它不是也能指向任何OC对象吗

8 个回复

倒序浏览
NSObject和id都能指向任何对象

NSObject会做编译时检查(需要强制转换)

id不需要强制类型转换,id可以直接用,编译器看到id时,认为是动态类型,不会在检查类型

        NSObject *p2 = [[Person alloc] init];
        
        [(Person*)p2 run];
   
        id p3 = [[Person alloc] init];
        [p3 run];

都可以创建对象,但是调用对象方法的时候一个需要强制转换,一个不用.
回复 使用道具 举报 2 0
学到东西!
回复 使用道具 举报
丶浩浩丶 发表于 2015-5-15 22:44
NSObject和id都能指向任何对象

NSObject会做编译时检查(需要强制转换)

强制转换成什么类型的呢
回复 使用道具 举报
丶浩浩丶 发表于 2015-5-15 22:44
NSObject和id都能指向任何对象

NSObject会做编译时检查(需要强制转换)

有学了点东西,看来光看视频还是不行呀!
回复 使用道具 举报
OC是门动态的语言,如果一个变量是id类型的话,就不会进行静态类型检查,可以调用任何方法,当然调用不恰当的方法运行时会报错。正是有了id类型所以OC的语言的动态性才那么强,它会强制对象和参数的实际类型在运行时确定,所以调用的方法当然也是运行时动态绑定的,有一点很重要,OC中方法都是运行时绑定的,不管一个对象是不是被赋值给id类型。
回复 使用道具 举报
涨姿势了,多学习,谢谢楼主的提问
回复 使用道具 举报
长知识了
回复 使用道具 举报

一个需要强制转换,一个不用.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马