当前位置:网站首页>【id类型和NSObject指针 ObjectIve-C中】
【id类型和NSObject指针 ObjectIve-C中】
2022-08-04 03:39:00 【清风清晨】
前言
1)NSObject,是Objective-C中,所有类的基类。
2)根据里氏替换原则LSP,NSObject指针就可以指向任何类型的Objective-C对象。
3)所以,我们说NSObject指针,是一个万能指针。
例如:
NSObject *obj1 = [Person new];
NSObject *obj2 = [Student new];
NSObject *obj3 = @“jack”;
都是没有问题的。
但是,
NSString *str = [Person new];
就会被编译器给一个大警告,它说,你这个类型不一样!
4)所以,NSObject指针是1个万能指针,可以指向任意的OC对象。
5)但是,有一个问题:
如果,Person类中有一个sayHi()方法。
但是,你能不能通过obj1去调用这个sayHi()方法呢,答案是,不能!
因为,编译器认为obj1是NSObject类型的,NSObject类型里有sayHi()方法吗,没有,所以,编译器就认为不能调用!
那如果我非要调用呢,强转!
[(Person *)obj1 sayHi];
那这句话运行的时候,会不会出错,不会,因为obj1指向的对象里面,本来就有sayHi()方法吗!
如果要调obj2的study()方法呢,能直接调吗,也是不可以的。
因为NSObject类里面,没有study()方法,如果非要调怎么办,强转!
[(Student *)obj2 study];
如果你要调用obj3的length()方法,可以吗,也是不可以的,因为NSObject 类里面,没有length()方法,如果非要调怎么办,强转!
[(NSString *)obj3 length];
6)所以,NSObject是一个万能指针,它可以指向任意类型的OC对象,这句话没错,但是有一个缺点:
如果要调用指向的子类对象的独有的方法,就必须要做类型转换!
一、id指针是什么?
1)首先,第一个问题,id是一个指针!它是个什么样的指针呢,万能指针!可以指向任意的Objective-C对象!
例如:id id1 = [Person new];
但是,这个id是一个typedef自定义类型的,它定义的时候,已经加了了,如下:
typedef struct objc_object id;
所以,你在声明id指针的时候,就不需要加了
2)id指针,是一个万能指针!任意的OC对象,都可以指!
例如:id id1 = [Person new];
id id2 = [Student new];
id id3 = @“jack”;
二、NSObject 和 id 的异同
1.相同点
NSObject 和 id 都是万能指针,都可以指向任意类型的OC对象!
2.不同点
例如:NSObject *obj = [Person new];
id id1 = [Person new];
1)通过NSObject 类型的指针obj去调用对象的方法的时候,编译器会做编译检查。例如:
[obj sayHi];
编译器会告诉你,这句话是错的!
2)通过id类型的指针id1去调用对象的方法的时候,编译器直接通过。例如:
[id1 sayHi];
管你后面是什么方法,编译器直接通过,它不会去检查id1的类型。
3)不同点:
通过NSObject指针去调用对象的方法的时候,编译器会做编译检查。如果这个方法并不是NSObject类里面拥有的,直接报编译错误。
通过id类型的指针,去调用对象的方法的时候,编译器直接通过。无论你调用什么方法。
例如,[id1 length];
编译时不会报错,但是运行时会报错。
注意
1)id指针,只能调用方法,不能用点语法。
例如:id1.name = @“rose”;
编译报错。
但是你用setName方法,就不会有问题的,
例如:[id1 setName:@“rose”];
这样写,就不会有问题了!
2)所以,如果我们要声明1个万能指针,不要使用NSObject,而是使用id,因为id方便很多!
边栏推荐
- mq应用场景介绍
- Significant differences between Oracle and Postgresql in PLSQL transaction rollback
- 打造一份优雅的简历
- 三分建设,七分管理!产品、系统、组织三管齐下节能降耗
- 全网没有之一的JMeter 接口测试流程详解
- The general SQL injection flow (sample attached)
- Homemade bluetooth mobile app to control stm8/stm32/C51 onboard LED
- 异步编程解决方案 Generator生成器函数、iterator迭代器、async/await、Promise
- How to systematically plan and learn software testing?
- docker+网桥+redis主从+哨兵模式
猜你喜欢
随机推荐
mq应用场景介绍
【翻译】Terraform和Kubernetes的交集
目标检测-中篇
There are too many systems, how to realize multi-account interworking?
Sfdp 超级表单开发平台 V6.0.5 正式发布
2022支付宝C2C现金红包PHP源码DEMO/兼容苹果/安卓浏览器和扫码形式
if,case,for,while
拿捏JVM性能优化(自己笔记版本)
Significant differences between Oracle and Postgresql in PLSQL transaction rollback
数组相关 内容 解析
十一种概率分布
【项目实现】Boost搜索引擎
学会iframe并用其解决跨域问题
This Thursday evening at 19:00, the fourth live broadcast of knowledge empowerment丨The realization of equipment control of OpenHarmony smart home project
基地址:环境变量
仿牛客论坛项目梳理
高效IO模型
Gigabit 2 X light 8 electricity management industrial Ethernet switches WEB management - a key Ring Ring net switch
MySQL 查询练习(1)
SQL query String field less than 10 how to check