随笔分类 - iOS底层原理
摘要:在利用theos开发一些插件时,我们经常会用到以下几个指令: %hook 指定需要hook的类名,以%end结尾 %orig 执行被hook函数的原始代码,类似于super.method功能 %new 该指令用来给现有的class添加一个新的函数。与Runtime中的class_addMethod相
阅读全文
摘要:RunLoop,翻译过来是运行环路。我们在创建命令行项目和创建ios项目时,发现命令行项目当最后一行代码执行完后项目就自动退出了,而ios项目确可以一直运行,知道用户手动点击退出按钮。这就是因为ios项目在main函数中自动创建了runLoop,从而可以使项目可以一直响应用户的操作。 我们可以将这个
阅读全文
摘要:Runtime是近年来面试遇到的一个高频方向,也是我们平时开发中或多或少接触的一个领域,那么什么是runtime呢?它又可以用来做什么呢? 1、详解isa 我们在研究对象的本质的时候提到过isa,当时说的是isa是个指针,存储的是个类对象或者元类对象的地址,实例对象的isa指向类对象,类对象的isa
阅读全文
摘要:1、block的基本概念及使用 blcok是一种特殊的数据结构,它可以保存一段代码,等到需要的时候进行调用执行这段代码,常用于GCD、动画、排序及各类回调。 Block变量的声明格式为: 返回值类型(^Block名字)(参数列表); //声明一个没有传参和返回值的blcok void(^myBloc
阅读全文
摘要:1、对组件化的理解 ①什么是组件化? 组件化就是将一个项目拆分成若干个组件,分而治之。比如一个汽车的生产,也是将轮子、灯、座椅等等作为单独的组件,由各自的工厂去生产维护,生产轮子的就专门做轮子,生产座椅的就专门生产座椅,等各个组件都做好后再拿到组装厂统一调度组装使用。 在实际的开发中也是一样,比如我
阅读全文
摘要:1、分类的概念 分类是为了扩展系统类的方法而产生的一种方式,其作用就是在不修改原有类的基础上,为一个类扩展方法,最主要的是可以给系统类扩展我们自己定义的方法。 如何创建一个分类?↓↓ 比如我们为Person创建了一个Student的分类: 其实分类的作用还是挺大的,比如我们有一个类的功能很复杂 如果
阅读全文
摘要:1、概念: KVC(Key-value coding):键值对编码,也就是我们可以通过变量的名称来读取或者修改它的值,而不需要调用明确的存取方法。这样就可以在运行时动态地访问和修改对象的属性。而不是在编译时确定。对于类里的私有属性,Objective-C是无法直接访问的,但是KVC是可以的。 作用:
阅读全文
摘要:1、概念 KVO(Key-Value-Observer)也就是观察者模式,是苹果提供的一套事件通知机制。允许对象监听另一个对象特定属性的改变,并在改变时接收到事件,一般继承自NSObject的对象都默认支持KVO。 2、使用 1、 2、 3、 注意点 KVO的addObserver和removeOb
阅读全文
摘要:Object-C的底层都是通过C/C++来实现的,所以OC中的对象也会转化成C/C++中的某一个数据结构, 我们在终端里通过指令 将oc代码转化为c++代码,我们可以看到NSObject的底层结构是: Class是一个指向对象的结构体指针 所以NSObject最终会转化成一个结构体,内部只有一个指向
阅读全文
摘要:1、概念 对于一个由2个字节组成的16位整数,在内存中存储这两个字节有两种方法: 一种是将低序字节存储在起始地址,这称为小端(little-endian)字节序; 另一种方法是将高序字节存储在起始地址,这称为大端(big-endian)字节序。 如123 1就是高序字节 3就是低序字节 2、为什么会
阅读全文
摘要:一个指针在64位的计算机上,占8个字节;一个指针在32位的计算机上,占4个字节。 原因如下: 我们都知道cpu是无法直接在硬盘上读取数据的,而是通过内存读取。cpu通过地址总线、数据总线、控制总线三条线对内存中的数据进行传输和操作。 具体流程: 1、cpu通过地址总线,找到该条数据; 2、通过控制总
阅读全文
摘要:1、什么是结构体 定义:结构体是一系列数据的集合,这些数据可能描述了一个物体,也可能是对一个问题的抽象。 举个栗子,简单的说,对于人,人有名字,性别,年龄,身高,体重等个人信息,那么,我们在定义这种个体的时候,就不能说它能用一个字符或整型变量来定义。 这时候,就需要结构体闪亮登场了。 基本语法: 方
阅读全文
摘要:1、成员变量和属性的区别 成员变量: 1. 成员变量的默认修饰是@protected。 2. 成员变量不会自动生成set和get方法,需要自己手动实现。 3. 成员变量不能用点语法调用,因为没有set和get方法,只能使用->调用。 属性: 1. 属性的默认修饰是@protected。 2. 属性会
阅读全文
摘要:在平时开发中,我们可能需要调试某些东西,比如查看给服务器发请求时传过去的参数,如果不适用LLDB的话我们用的最多的就是通过NSLog方式去打印,但现在我们可以精简这个步骤,那就是使用LLDB调试命令. Xcode从4.0开始编译器开始改用LLVM,相应的调试器也从gdb改为LLDB。而从 Xcode
阅读全文