objective C中的@class, SEL , IMP等灵活机制(五)
来源:互联网 发布:换热器计算软件下载 编辑:程序博客网 时间:2024/06/13 14:34
holydancer原创,如需转载,请在显要位置注明:
转自holydancer的CSDN专栏,原文地址:http://blog.csdn.NET/holydancer/article/details/7347399
在objective c中,如果细心的话会发现,每个类中都会自动生成一个class 类型的isa,
isa是什么,class又是什么呢,找到Class的定义我们会发现如下:而objc_class以前的定义又如下,现在据说被封闭了,不知道有没有再作修改,总之方便我们理解就好:于是我们就有了点头绪了,isa,is a pointer,是个指针(根据网上的资料,这样理解是最贴近事实的,不管你们信不信,反正我是信了),每个类都有一个class类型的指针isa,继承自NSObject中,继承关系,方法变量等信息都存放在isa中,isa作为一个隐藏的属性,会自动生成于每个类之中。有了这个前提,也就可以解释为什么我们可以根据@class来代替任意一个类了,看代码:
Human.h
Human.m
main.h
class可以灵活的代替别的类,SEL与其类似,不同的是SEL代替的是方法,可以方便的代替其他方法,class中是因为有isa属性保存有类的信息,而SEL是因为即使是在不同的类中,方法名只要相同,这两个方法的ID就相同,SEL就是根据这个ID来找到该方法,再根据调用该方法的类的不同来找到唯一的地址。看代码再作解释:
结果如下:
通过以上代码我们会发现,SEL通过方法名绑定后,可以被多个类实例调用,找了些网上的资料,解释都是说方法名一样的话,ID会一样,地址仍不同,才会实现这样的效果,我们不谈论是否准确,但我个人认为这是目前最合理的解释。这种用法的优势一方面是灵活性更高,类似于多态,另一方面是,这种用法sel找方法时匹配的是ID而不是字符串方法名,所以在效率上会高一些。还有一种更终极的方法,直接对应方法的地址,这种方法效率最高,请看代码:
输出语句:
今天这些内容不太好理解,我用自己理解的方式给大家再解释一遍,class用于代替类,增加灵活性,因为我们不知道什么时候会用到什么类,方法也是如此,所以SEL可以代替方法,每个方法有方法名,ID,地址,相同的方法名,ID也一样,正常情况下我们根据方法名找到方法,用SEL方法可以根据ID找到方法,而用IMP方式可以直接找到地址,但是灵活性不如SEL方法,虽然效率最高。好了,今天到此为止。
关键字:Objective-C ,objective c , oc ,@class, SEL ,selector ,IMP
阅读全文
0 0
- objective C中的@class, SEL , IMP等灵活机制(五)
- objective C中的@class, SEL , IMP等灵活机制(五)
- objective C中的@class, SEL , IMP等灵活机制(五)
- objective C中的@class, SEL , IMP等灵活机制(五)
- objective C中的@class, SEL , IMP等灵活机制(五)
- objective C中的@class, SEL , IMP等灵活机制(五)
- objective C中的@class, SEL , IMP等灵活机制
- objective C中的@class, SEL , IMP等灵活机制
- objective C中的@class, SEL , IMP等灵活机制
- OC-@class, SEL , IMP等灵活机制
- Objective-C中的SEL、IMP和Class类型(转)
- Objective-c SEL & Class IMP
- Objective-C中的SEL、IMP和Class类型
- Objective-c中的SEL、Method、IMP
- objective-C中的Class(类类型),Selector(选择器SEL),函数指针(IMP)
- objective-C中的Class(类类型),Selector(选择器SEL),函数指针(IMP)
- objective-C中的Class(类类型),Selector(选择器SEL),函数指针(IMP)
- objective-C中的Class(类类型),Selector(选择器SEL),函数指针(IMP)
- spring中scope(作用越)理解
- spring boot 配置
- HDU-6069 Counting Divisors
- Spring-2 <p: >标签的使用
- java 内部类 局部类 细节
- objective C中的@class, SEL , IMP等灵活机制(五)
- 网络请求封装
- 多态
- hdu6097 Mindis 2017多校第六场1002 圆的反演
- 基于k8s部署的应用(服务)如何访问
- jquery滚动页面底部时ajax加载多次解决办法
- 线段树
- Android学习(二) LinearLayout和RelativeLayout比较
- 插入排序