您的位置:首页 > 移动开发 > Objective-C

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

2015-11-18 16:12 706 查看
一 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 方法名];可以调用其他的对象方法或者是类方法

“`
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: