iOS开发攻城狮的集散地iOS面试知识点

iOS开发底层学习笔记

2016-09-06  本文已影响156人  He_Define

前言:学习iOS至今已经一年多了,包括实习也有了一年的时间了,这一年的工作里,用得比较多的还是界面逻辑,空间,动画等以及一些数据操作等。偶尔也犯犯嘀咕,最繁琐的逻辑问题,比如说排序啦,筛选啦、搜索啦这些涉及到效率复杂度的东西已经在后台进行处理过了,服务端返回给你的数据就大致已经是你需要的那堆数据了。接触多了这些东西,感觉好像app前端开发的东西有点...无脑?2333其实也不能这么说,不过至少最需要智商的算法我很少用得到。学习iOS也已经快一年了,扪心自问下自己目前的水平是否就是一年经验的水平了。所以说,惭愧之下,开始接触更底层的东西,比如说消息机制、Runtime等等这些一直不敢去涉及的东西(这话题转回来的...就问你服不服!233)



接下来要写的东西,都是杂七杂八的东西随笔记,能看则看。等到记的东西多了,就整理下,写成一篇系列文。因为简书不支持文章内部跳转,所以名词解释就单单放了一章。

目录

感觉。。挖了好大一个坑。。。


名词解析:

源码皆来自runtime.h

struct objc_ivar {
    char *ivar_name;  //实例变量名
    char *ivar_type;  //实例变量类型类型
    int ivar_offset;  //基地址偏移字节
    int space;
}
typedef struct objc_ivar *Ivar;

Ivar是用来定义对象的实例变量。Ivar是objc_ivar结构体,从结构体看出,Ivar包括类型和名字等。

这里有人会奇怪,Ivar (实例) 和 Property (属性) 有什么区别?我个人的想法是Ivar 和 Property主要差别在于property包括了Ivar的属性以外,还封装了setter( ) 和 getter( ) 方法。还有更底层的现在就不去了解了,比如objc_property等

typedef struct objc_object {
         Class isa;
     } *id;

id用来表示任何一个对象,从结构体看出,id其实是一个objc_object结构的指针,其isa指针指向了Class成员。

//定义:
SEL aSelector = @selector(SEL selector);
SEL bSelector = NSSelectorFromString(NSString *aSelectorName);
*用通过runtime的sel_registerName方法也可以获取,未尝试.
//获取方法名字字符串
NSString *methodsName = NSStringFromSelector(SEL aSelector);
typedef id (*IMP)(id, SEL, ...);           //有返回值
typedef void (*_VIMP) (id,SEL,...);        //无返回值

IMP(Implementation)是一个指向具体实现的方法的地址指针,参数都包含id和SEL类型。通过id(实例对象)里的SEL(方法指针)获取到唯一的实现方法,当然,IMP还有更底层更广泛的应用

其实,直接调用方法的IMP指针效率比调用方法本身更高。但是也不要盲目得去用IMP来提高速率,毕竟可读性肯定没有那么高了。

struct objc_method {
    SEL method_name;      //方法名
    char *method_types;   //参数以及返回类型
    IMP method_imp;       //指向具体方法实现的指针
}
typedef struct objc_method *Method;

Method就是函数方法,从源码可知,是一个objc_method的结构体,结构体包括一个SEL属性的方法名(可以看做是这个方法的identifier,可以通过这个属性来获取到该方法),一个method_types指的是参数以及返回类型的描述字符串,(*后者是博文Objective-C method及相关方法分析看到的,有待深入研究),第三个参数就是指向具体实现方法的IMP指针method_imp。通过这三个成员变量,就可以实现方法了。

typedef struct objc_class *Class;
.
struct objc_class {
    Class isa;
#if !__OBJC2__
    Class super_class;
    const char *name;
    long version;
    long info;
    long instance_size;
    struct objc_ivar_list *ivars;
    struct objc_method_list **methodLists;
    struct objc_cache *cache;
    struct objc_protocol_list *protocols;
#endif
};

1、聊聊runtime那些事

上一篇 下一篇

猜你喜欢

热点阅读