【Android基础学IOS开发】BOOL SEL IMP isa
来源:互联网 发布:7寸windows平板 编辑:程序博客网 时间:2024/05/24 05:03
标题这几个概念对于我这个从android过来的人真可谓是新鲜啊,但这恰恰又是Objective-c的重点,如果能很好的理解这几个概念相信会对Objective-c底层有更深层次的理解,而不只是停留在一般开发上,就算是面试也好跟技术官侃侃而谈。
首先是BOOL,这个比较好理解只要知道Objective-c中,BOOL和bool是不一样的就好了,BOOL是Objective-c的。我们再看看BOOL在objc.h这个文件里面是怎么定义的。
/// Type to represent a boolean value.typedef signed char BOOL; // BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" // even if -funsigned-char is used.#if __has_feature(objc_bool)#define YES __objc_yes#define NO __objc_no#else#define YES ((BOOL)1)#define NO ((BOOL)0)#endif
所以从本质上来说BOOL是一个8bit的一个char,所以我们在把其他比如说short或者int转换成为BOOL的时候一定要注意。如果short或者int的最低的8位bit都是0的话,尽管除了最低的8位以外都不是0,那么经过转换之后,就变成了0也就是NO。还有就是Objective-C里面的所有的逻辑判断例如if语句等等和C语言保持兼容,如果数值不是0判断为真,如果数值是0那么就判断为假,并不是说定义了BOOL值之后就变成了只有1或者YES为真。
一开始我看到上面的定义我也不是太理解低8位是啥,后来我查了下其实就是大学里最最基础的知识而已,当初听课不深入,忘了,现在补一下。
网上很喜欢用256这个十进制的数来做例子,我也用这个吧。
首先256这个数字如果换成16位2进制就是0000 0001 0000 0000.这里高八位其实就是0000 0001,低八位是0000 0000.那么按照之前的知识如果把256赋给一个BOOL的话,那么这个BOOL就是NO了。很好理解吧~
PS:如果直接在代码中写if(256)这样的话是走C的判断,是YES而不是NO。
接下来就是SEL,其实在Objective-c中,每个方法都对应一个唯一的ID值,这个ID标示其实就是SEL。在开发中经常会遇到如下代码:
- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
这里的action:(SEL)action就是要传一个类型为SEL的变量进去了。然后方法根据这个SEL去查找ID,找到了就可以发送消息了。这样的机制大大的增加了我们的程序的灵活性,我们可以通过给一个方法传递SEL参数,让这个方法动态的执行某一个方法;我们也可以通过配置文件指定需要执行的方法,程序读取配置文件之后把方法的字符串翻译成为SEL变量然后给相应的对象发送这个消息。在开发中经常使用@selector()来获取一个SEL变量,@selector()其实是一个编译器指令,它把凡是在括号内的都认定为是一个SEL类型。
说到SEL不得不说一下IMP,那SEL和IMP有什么不同呢?IMP是一个函数指针,而虽然每一个SEL对应的是一个方法的名称,但考虑到效率,SEL本身是一个整型,编译器会另外生成一张SEL和方法名称对应的表。有了这样的结构,objc就可以实现多态了。所以IMP的效率是最高的。
typedef id (*IMP)(id, SEL, ...);
最后就是isa了,先附上图上isa的定义
@interface NSObject <NSObject> { Class isa OBJC_ISA_AVAILABILITY;}
#if !OBJC_TYPES_DEFINED/// An opaque type that represents an Objective-C class.typedef struct objc_class *Class;/// Represents an instance of a class.struct objc_object { Class isa OBJC_ISA_AVAILABILITY;};/// A pointer to an instance of a class.typedef struct objc_object *id;#endif
通过后台输出的结果是:Printing description of myOwn->isa:MyOwn
在NSObject里面是这么定义objc_class的
typedef struct objc_class *MetaClass;typedef struct objc_class *Class;struct objc_class { MetaClass class_pointer; struct objc_class* super_class; const char* name; long version; unsigned long info; long instance_size; struct objc_ivar_list* ivars; struct objc_method_list* methods; struct sarray * dtable; struct objc_class* subclass_list; struct objc_class* sibling_class; struct objc_protocol_list *protocols; void* gc_object_type;};
isa本质是一个指针,这个指针也是NSObject的唯一变量,通过这个isa计算偏移可以找到其他实例变量的位置。
暂时理解就那么多~希望再深入可以继续了解更多,不过了解这些知识已经是举步维艰了。
- 【Android基础学IOS开发】BOOL SEL IMP isa
- iOS Runtime详解之SEL,Class,id,IMP,_cmd,isa,method,Ivar
- iOS Runtime详解之SEL,Class,id,IMP,_cmd,isa,method,Ivar
- iOS中SEL和IMP
- iOS中的SEl和IMP到底是什么
- iOS中的SEl和IMP到底是什么
- iOS基础--SEL 类型 @selector()
- iOS开发之SEL用法
- IOS开发- SEL知识回顾
- runtime运行时 isa指针 SEL方法选择器 IMP函数指针 Method方法 runtime消息机制 runtime的使用
- 【Android基础学IOS开发】__cplusplus extern __attribute__
- 【Android基础学IOS开发】从Java转向Objective-c
- 【Android基础学IOS开发】NS_ENUM 和 NS_OPTIONS
- 零基础学iOS开发
- SEL和IMP
- @class SEL IMP
- SEL和IMP
- SEL和IMP
- Python3.4【文本】之translate
- Android多线程下安全访问数据库
- how about broadcasting
- Struts2与Velocity模板
- 汇编里头,输入6个元素的数组的值,求和!----累加器
- 【Android基础学IOS开发】BOOL SEL IMP isa
- Dev 控件treelist等滚动条使用
- 人生如棋 走好每一步
- cscope记事
- C语言指针数组的概念
- 《算法导论》笔记 第10章 10.1 栈和队列
- 患得患失的人生
- USB学习笔记
- spring mvc xml配置拦截器