当前位置:网站首页>【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方便很多!
边栏推荐
- 数据集类型转换—TFRecords文件
- Y86. Chapter iv Prometheus giant monitoring system and the actual combat, Prometheus storage (17)
- Postgresql source code (66) insert on conflict grammar introduction and kernel execution process analysis
- SQL注入中 #、 --+、 --%20、 %23是什么意思?
- tkmapper的crud示例:
- STM8S project creation (STVD creation) --- use COSMIC to create a C language project
- Polygon zkEVM网络节点
- Enterprise live broadcast is on the rise: Witnessing focused products, micro-like embracing ecology
- 函数,递归以及dom简单操作
- new Date将字符串转化成日期格式 兼容IE,ie8如何通过new Date将字符串转化成日期格式,js中如何进行字符串替换, replace() 方法详解
猜你喜欢
逻辑漏洞----其他类型
"Introduction to nlp + actual combat: Chapter 8: Using Pytorch to realize handwritten digit recognition"
docker+网桥+redis主从+哨兵模式
打造一份优雅的简历
How to drop all tables under database in MySQL
Hey, I had another fight with HR in the small group!
MySQL query optimization and tuning
SQL query String field less than 10 how to check
【MD5】采用MD5+盐的加密方式完成注册用户和登录账号
拿捏JVM性能优化(自己笔记版本)
随机推荐
类如何只能静态分配和只能动态分配
Polygon zkEVM network node
JVM内存和垃圾回收-07.堆
Introduction to mq application scenarios
自定义通用分页标签01
Embedded database development programming MySQL (full)
Gigabit 2 X light 8 electricity management industrial Ethernet switches WEB management - a key Ring Ring net switch
pnpm 是凭什么对 npm 和 yarn 降维打击的
if,case,for,while
Implementing a server-side message active push solution based on SSE
kingbaseES V8R2/R3 表在指定表空间,为何显示为默认表空间?
[Playwright Test Tutorial] 5 minutes to get started
6口全千兆二层网管型工业以太网交换机千兆2光4电光纤自愈ERPS环网交换机
Mini program + new retail, play the new way of playing in the industry!
软件测试如何系统规划学习呢?
复制带随机指针的链表
Homemade bluetooth mobile app to control stm8/stm32/C51 onboard LED
JVM的内存模型简介
SQL query String field less than 10 how to check
汇编语言之栈