iOS开发底层学习笔记

作者: He_Define | 来源:发表于2016-09-06 16:59 被阅读156次

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



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

目录

  • 前言
  • 名词解释
  • OC消息传递和转发机制
  • Runtime
  • 自己动手写一个框架
  • Method Swizzling黑魔法
  • Category实现原理
  • 反射机制
  • Runloop
  • ...

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


名词解析:

源码皆来自runtime.h

  • Ivar
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等

  • id
typedef struct objc_object {
         Class isa;
     } *id;

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

  • isa
    isa指针是一个Class类型的指针,每个实例对象都有对应isa指针。其实Class也有个isa指针,指向了meteClass元类,元类也有个isa指针指向root meteClass根元,根元的isa指针指向自己。如此,就可以找到静态方法和变量了。
  • SEL
    typedef struct objc_selector *SEL;
    SEL其实也是其中一种数据类型,用来定义类方法,是类成员方法的指针,本质上其实只是一串字符串。(其实可以看做是类方法的identifier)
//定义:
SEL aSelector = @selector(SEL selector);
SEL bSelector = NSSelectorFromString(NSString *aSelectorName);
*用通过runtime的sel_registerName方法也可以获取,未尝试.
//获取方法名字字符串
NSString *methodsName = NSStringFromSelector(SEL aSelector);
  • IMP
typedef id (*IMP)(id, SEL, ...);           //有返回值
typedef void (*_VIMP) (id,SEL,...);        //无返回值

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

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

  • Method
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。通过这三个成员变量,就可以实现方法了。

  • Class
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那些事

相关文章

  • iOS高手

    劳模007_Mars:swift学习笔记、iOS底层原理探索系列YYYYYY25:戴铭(iOS开发课)读书笔记居然...

  • 【Objective-c】_蓝牙开发

    ios蓝牙开发学习笔记(一)蓝牙概述 ios蓝牙开发学习笔记(二)central角色的实现 ios蓝牙开发学习笔记...

  • iOS知识点,iOS面试题, iOS面试题总结

    推荐 :iOS七年开发之路网络笔记,iOS知识点总结,iOS开发笔记。KVC /KVO的底层原理高质量 iOS 博...

  • iOS开发底层学习笔记

    前言:学习iOS至今已经一年多了,包括实习也有了一年的时间了,这一年的工作里,用得比较多的还是界面逻辑,空间,动画...

  • iOS 2D游戏开发学习笔记:GameplayKit

    iOS 2D游戏开发学习笔记:GameplayKit 这是我的 iOS 2D 游戏开发学习笔记,本篇学习内容来自r...

  • iOS蓝牙开发学习笔记 - 系列

    详见我的csdn: iOS蓝牙开发学习笔记(一)蓝牙概述 iOS蓝牙开发学习笔记(二)central角色的实现 i...

  • 探索iOS底层原理第四篇——Category的本质

    本系列是学习iOS底层原理过程中的记录笔记第三篇,往期目录:探索iOS底层原理开篇——对象本质探索iOS底层原理第...

  • 探索iOS底层原理第三篇——KVC

    本系列是学习iOS底层原理过程中的记录笔记第三篇,往期目录:探索iOS底层原理开篇——对象本质探索iOS底层原理第...

  • iOS逆向+iOS 底层原理

    iOS底层原理探索[https://www.jianshu.com/nb/36245060] iOS底层原理笔记[...

  • ios蓝牙参考

    参考文章:iOS中的蓝牙开发iOS-BLE蓝牙开发demo 官网 转载 CenteralManager学习笔记

网友评论

    本文标题:iOS开发底层学习笔记

    本文链接:https://www.haomeiwen.com/subject/amjdettx.html