当前位置:网站首页>【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方便很多!
边栏推荐
猜你喜欢
随机推荐
Mini program + new retail, play the new way of playing in the industry!
软件测试如何系统规划学习呢?
数据集类型转换—TFRecords文件
三分建设,七分管理!产品、系统、组织三管齐下节能降耗
new Date converts strings into date formats Compatible with IE, how ie8 converts strings into date formats through new Date, how to replace strings in js, and explain the replace() method in detail
深度学习——以CNN服装图像分类为例,探讨怎样评价神经网络模型
Introduction to the memory model of the JVM
什么是数字孪生智慧城市应用场景
Detailed analysis of scaffolding content
base address: environment variable
Introduction to mq application scenarios
MySQL查询优化与调优
函数,递归以及dom简单操作
自定义通用分页标签02
MySQL query optimization and tuning
ingress 待完善
自定义通用分页标签01
MySQL Query Exercise (1)
拿捏JVM性能优化(自己笔记版本)
Polygon zkEVM network node






![出现504怎么办?由于服务器更新导致的博客报504错误[详细记录]](/img/e0/32d78fac04dc2deb1cb1f847a7bab5.png)


