Object-c之id ,instancetype,SEL,_cmd;self,super几种类型的区别及用法

一 id 和instancetype

相同点:
instanceType和id都是作为方法的返回类型而被使用。
不同点:
   1.instancetype可以返回和方法所在类相同类型的对象,id返回的类型只能是未知类型的对象;
   2.对于简易构造函数,用instancetype更好一点,因为编译器因此会知道返回的是什么类型的方法对象,而用id则不会,它只会返回未知类型的对象;
   3.instancetype在错误检查机制上更优于id,由于instancetype能够在无关联返回类型中返回对象的类型,因此更利于开发者检测到无关联返回类型中的错误。而id返回的是未知类型,在无关联返回类型中检错时没有instancetype更易于检测错误。

二 SEL,_cmd ,self和super

SEL:全称Selector 表示方法的存储位置。
sel:是一种数据类型,存放方法的地址,在类对象的映射表里面存放着映射关系
_cmd:每个方法的内部都有一个-cmd,代表着当前方法。
 super:指向了当前类的父类
Dog *g=[[Dog alloc] init];
        [g test];
        

**SEL 用法实例对象寻找方法的过程
1>首先将方法包装成sel数据类型的数据 SEL *sel = @selector(方法名)
2>然后根据SEL找方法的地址
3>根据方法的地址调用相应的方法
4)注意:在这个操作过程中有缓存,第一次找的时候是一个一个的找,非常耗性能,之后再用到的时候就直接使用。

//SEL是一种数据类型,获取方法的地址
SEL s1 = @selector(run); //取出run的地址
[p2 performSelector:s1]; //间接的调用run


self、super是一个指针,self谁调用了当前方法,self就指向谁
而super指向了当前类的父类,如果super在类方法中,它就代表了调用当前类方法的类的父类,如果在对象方法中,它就代表调用当前对象方法的对象的父类对象
1>如果self、super在类方法中,那么它就代表当前调用这个类方法的类、父类
2>如果self在对象方法中,那么它就代表当前调用这个对象方法的对象、父对象
出现在对象方法中,就代表着当前对象,出现在类方法中,就代表着当前类】

Self、super的用途:
(1)可以利用self->成员变量名访问当前对象内部的成员变量(仅在对象方法中)
(2)[self 方法名];可以调用其他的对象方法或者是类方法

你可能感兴趣的:(OC中几种类型的区别,使用)