当前位置:网站首页>【instancetype类型 Objective-C】
【instancetype类型 Objective-C】
2022-08-05 06:20:00 【清风清晨】
一、instancetype是什么?
例如,有一个Person类:
@interface Person : NSObject
@property NSString *name;
@property int age;
- (Person *)person; //按照规范,应该有一个同名的类方法,用来返回一个该类的对象
@end
@implementation Person
++ (Person *)person
{
return [Person new];
}
@end
这时候,如果我想拿到一个Person对象的话,那就:
#import <Foundation/Foundation.h>
int main()
{
Person *p1 = [Person person];
}
请问一个问题,这个person()方法,可不可以被子类Student继承到?答案是,可以!
这时候,我调用这个person()方法:
Student *s1 = [Student person];
返回的不是一个Student对象!
现在,如何能让这个方法,通过Person来调,返回的就是Person对象,通过Student来调,返回的就是Student对象?
1)+ (Person *)person;这个方法的返回值类型能不能写(Person *)类型,不能,你这样写死了,就只能返回(Person *)了。那写什么,id类型:
- (id)person;
2)但是,这个方法返回的还是Person对象,因为:方法里面写的是return [Person new];
所以,不管通过父类来调,还是通过子类来调,返回的都是Person对象!
如何,让这个方法,通过父类Person来调,返回的就是Person对象,通过子类Student来调,返回的就是Student对象?用self- (id)person
{
return [self new];
}
这时候,通过Person来调,这个self指的是Person类,通过Student来调,这个self指的是Student类。那有人要问了,self不是指的当前对象吗?那是在对象方法中,self指的是当前对象,这是类方法,self指的是当前类!
3)父类中的类方法,创建一个父类对象返回
a。如果返回值类型写为父类类型的,那么子类来调用这个方法,得到的就是父类指针
b。解决方案,就是把返回值改为id类型
c。方法的内部,创建对象的时候,不要写死,一旦写死了,创建的对象就固定了,比如Person,不论怎么调,返回的都是Person对象!
怎么才能做到,哪一个类来调用方法,就是创建哪一个类的对象?把类名写为self,哪一个类来调用这个方法,self就指的是哪一个类。创建的就是哪一个类的对象!
这时候,就可以调用sayHi和study方法了
[p1 sayHi];
[s1 study];
看起来完美无瑕,实际上还有一个问题,例如:
[Person person];
这个方法的返回值返回的是什么类型的?id类型的。
那我能不能通过一个NSString *str指针去接?可以
NSString *str = [Person person];
编译器不会报警告,但实际上这样写是不可以的!
如何让[Person person]; 调用的类方法,只能用Person指针来接?如果你用的不是Person指针,我最起码要给你一个警告!
4)方法的返回值是id类型的,问题是任意指针都可以接收这个方法的返回值,编译器连个警告都没有!
这里的问题在于,这个方法的返回值是id类型, + (id)person; 而id类型我们说过它会做编译检查吗,不会!
所以,如何让这个方法,通过Person类来调,返回的是Person对象类型,如果这个方法通过Student对象来调,它返回的是Student类型!
那就把返回值写成:instancetype
instancetype代表什么意思?代表这个方法的返回值是,当前类的对象!哪个类来调用这个方法,就是哪个类的对象!
5)如果方法的返回值是instancetype,代表什么意思,代表方法的返回值是当前这个类的对象!
这时候,这个方法[Person person];的返回值是Person指针类型。
- (id)person
二、使用建议
1.如果方法内部是在创建当前类的对象,最好不要写死成类名,用self,就是不要去写[类名 new]; 因为你一旦写死了的话,子类是不是可以把方法继承过去啊,那么子类一继承完了,可能子类的效果就不太一样了。
用self来代替类名 , [self new];
2.如果方法的返回值,是一个当前类的对象,你也不要写死了,而是用instancetype代替,instancetype代表什么意思,当前类的对象!谁调用这个方法,就代表谁的对象!
3.id和instancetype的区别
1)id是个类型,instancetype只能作为方法的放回值,别的地方没法用;
id既可以声明指针变量,也可以作为参数,也可以作为返回值
2)instancetype是一个有类型的东西,代表当前类的对象,比如这个方法我在Person里面调,那instancetype就代表Person *,如果这个方法我在Student里面调,那么instancetype就代表Student *,如果这个方法我在NSString里面调,那么instancetype就代表NSString *
id是一个无类型的指针。仅仅是一个地址,没有类型的指针。
边栏推荐
猜你喜欢
随机推荐
武田公司2022财年第一季度业绩强劲;正稳步实现全年的管理层指引目标
Tips for formatting code indentation
FPGA parsing B code----serial 4
腾讯业务安全岗 IDP 谈话总结
typescript65-映射类型(keyof)
文件内音频的时长统计并生成csv文件
PCI Pharma Services Announces Multi-Million Dollar Expansion of UK Manufacturing Facility to Meet Growing Demand for Global High Potency Drug Manufacturing Services to Support Oncology Treatment
VS Code私有服务器部署(私有化)
numpy.random usage documentation
Pytorch distributed parallel processing
Freeswitch操作基本配置
UI刘海屏适配方式
技术分析模式(十一)如何交易头肩形态
【MyCat简单介绍】
HelloWorld
typescript60-泛型工具类型(readonly)
矩阵的构造
2022杭电多校六 1007-Shinobu loves trip(同余方程)
淘宝客APP带自营商城本地生活CPS外卖优惠电影票话费更新渠道跟单生活特权V3
#Sealos#使用工具部署kubernetesV1.24.0









