- 博客(13)
- 收藏
- 关注
原创 iOS高级工程师必备之代理代理消息转发避免循环强引用
我们知道,iOS中的强强循环引用会造成被引用对象无法释放,即内存泄露。看下面这个在UIViewController里面运行的例子:self.timer = [NSTimer timerWithTimeInterval:1.0f target:self selector:@selector(test1) userInfo:nil repeats:YES];[[NSRunLoop curr...
2020-04-01 19:05:28
327
原创 iOS高级工程师必备知识runtime之动态方法交换
我们知道OC消息发送流程中,是用以方法名为标识的SEL 变量为Key,去方法缓存或方法列表中查找该key对应的函数指针(即IMP)。方法交换即交换两个函数的函数指针,改变预先定义好的函数执行路径。在每一个类被加载到内存之前,都会调用load方法,且每个类的load方法仅调用一次。因此我们可以在load方法里面动态的进行方法的交换。method swizzlingDemo工程在这里...
2020-03-29 20:22:27
219
原创 iOS高级工程师必备知识runtime之消息转发流程
我们知道,当发送一个方法调用,却在其类及父类中找不到该方法的实现的时候,则进入消息转发流程。以实例方法的调用为例,如果没有查找到该方法,则首先调用+(BOOL)resolveInstanceMethod:(SEL)aSelector;问,要不要动态添加一个方法?如果在这个函数的实现里面动态添加一个方法,并返回YES,那么回重新调用objc_msgSend方法调用之前的消息发送流程,...
2020-03-29 20:21:53
179
原创 iOS高级工程师必备知识rutime之消息发送
当我们通过实例调用一个方法时,runtime 机制通过了那些步骤?以一个这样的调用为例:[self printSum:a:1 b:2]我们看一下下图:第一步,runtime内部首先调用 objc_msgSend(self,@selector(add:),a,b),接着将这个调用转化为 ^@add:IntergerInterger这样的函数标识符,然后拿该标识符到该实例的isa...
2020-03-29 20:21:20
132
原创 iOS高级工程师必备知识之runtime的本质
如我们所知,object-c 是种动态编译型语言,那么他与C++/Java等编译型语言的区别是什么?这就要从object-c 底层的runtime实现机制来看。每一个实例对象,都是继承自objc_class。objc_class的结构class_rw_t的结构class_ro_t的结构...
2020-03-29 20:20:23
163
原创 iOS高级工程师必备知识之block强循环引用
block对对象型变量进行截取的时候,会连同变量修饰符一起截取。 //self变量默认是带__strong修饰符的 self.block=^{ NSLog(@"%@",self.view); };上例中,block是 self指向的对象持有的属性,而在block内部,又截获(复制了)指向self的强引用指针,这样就造成了block所属的对象对bl...
2020-03-29 20:19:21
296
原创 iOS高级工程师之__block修饰符
在block内部可以访问在block外部定义的局部变量,但是如果要在block内部对外部局部变量进行修改,无论该外部变量是基本数据类型还是对象类型,都要求该在定义该外部局部变量的时候加上修饰符 __block,否则,编译器会报错。对于基本的数据类型,加了__block修饰符之后,block对其进行截获不再是复制其值,而是直接生成了一个包含了指向改外部变量的指针的结构体,因此,在block内部对...
2020-03-29 20:18:46
207
原创 iOS高级工程师必备知识之block变量截取
block如果要访问block以外定义的变量,对基本数据类型的局部变量、静态变量、全局变量、全局静态变量和对象变量的接受方式是不一样的。对于一个基本数据类型的局部变量,block生成的时候直接复制其值,看下面这个例子:-(void)test1{ //局部变量,截获值 int a =1; int(^ccCallBack)(void) = ^{ //这个a...
2020-03-29 20:17:59
208
1
原创 iOS高级工程师必备知识之block的三种类型
block按照存储区域分类,分为全局block,栈block,堆block。在block内部没有访问外部变量的block,为全局block。例如,像下面这样:-(void)test1{ //1.不访问block之外的变量的block为全局block void(^block1)(void) = ^{ NSLog(@"这是个全局block"); ...
2020-03-29 20:17:17
341
原创 iOS高级工程师必备知识之block的本质
block的本质我们知道OC的代码在编译阶段会被clang翻译成C++语言,所以Block实际上最终用C++实现的。看一个例子。我们新建一个名为BlockSource的OC类(继承自NSObject),类里面的实现如下:@implementation BlockSource-(void)testSource{ inta =1; int(^ccCallBack...
2020-03-29 20:16:09
173
原创 iOS 签名加密原理(一)
我们知道,要想安装iOS应用程序,必须要从appstore下载。苹果有一套签名加密的机制来保证用户不能从其他的渠道安装应用。那么苹果如果做到让iphone只能安装从appstore应用呢?苹果使用一对非对称密钥,对app来源进行控制。首先,私钥A存放在苹果appstore服务器,该私钥对应的公钥A则存放在每一台手机上面。当应用开发者向appstore服务器上传应用二进制文件之后,服务器先对...
2020-03-29 20:13:51
397
原创 mongodb的复合索引,这种情况下没什么作用?
有个数据库查询问题求解一下在一个集合里面有1000万条视频数据两个key 一个 时间戳 create_time 和一个 点赞量 parise_count现在要求查出 create_time 为昨天以后的集合并且按照点赞量排行第一种方法: 单独索引 create_time 、parise_count 按照 creat...
2019-09-13 14:13:13
884
原创 生产环境mongodb快速搭建复制集
#mongodb快速搭建复制集###现在很多数据库都支持实时安全备份,mongodb 也不例外。mongodb的复制集就是为安全备份而生。原理就是在主数据库被操作改变的同时,对副本数据库作同样的操作,时刻保持和主副数据库的一致性。同时顺便衍生了一个功能就是读写分离,可以写在主数据库,读在副本数据库,一定程度上实现了负载的均衡。下面来说一下配置过程:我这里选了一台CentOS的机器(部署一个从...
2019-08-12 10:05:58
326
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人