简介
虽然工作了很长时间了,之前也是从一个不相关的职业改行到iOS的开发;;一个人开发的过程很没意思(没人和你交流提升自然很慢)....写过的程序用起来还不错,满足了用户的需求,但是当被问及一些类似基础面试题,一些原理以及一些第三方的基本实现原理的时候,还是萌萌哒(主要是蒙圈了)
所以我决定"从新","从低"的学习iOS...
本文主要参考Cooper's Blog的文章,自己模仿写的,估计有很多的不足之处,希望大家可以指教, 想看深一层的请点击大神连接查看,这篇文章里说的都是我个人理解(偏于大白话),写这个主要是想让自己加深印象
这文章中提及的都是在ARC环境下测试的
1.Block在内存中的位置
- 第一种类型
上面的代码打印出来的值是 <NSGlobalBlock: 0x100871090>
由打印结果可以看出来类型是:NSGlobalBlock,全局block,存储在代码区 - 第二种类型
打印结果: <NSMallocBlock: 0x7f8e72f0f410>
由打印结果可以看出来类型是: _NSMallocBlock ,堆block 存储在堆区
总结以上2中block的区别: 简单的说就是看block中是否用到了block之外的变量,第一种的是没有用到外部的变量,第二种的时候用到了block外部的局部变量,我们在外部打印的指向temp指针的地址和在block内部打印的结果不一样,这也许就是说的需要将局部变量copy一下,这就是区别所在.
- 第三种类型
我测试的环境是ARC,当你把block定义成一个属性用weak/assign来修饰的时候
1.如果你使用了block之外的局部变量,则此时的block是<NSStackBlock: 0x7fff5a9e9a50>
2.如果没用使用外部的局部变量,则此时的是***<NSGlobalBlock: 0x1095c6080>****
2.block循坏引用
- 在MRC下,为了避免循环引用的问题我们需要用__block
- 在ARC下,由于__block取变量的时候一样会被block retain,所以在ARC情况下应该使用__weak(弱引用)
- 当block声明为属性的时候,应该使用copy来修饰,因为这样block才能将block拷贝到堆上,要不就跑栈上了,栈区就不是你控制的了啊
3.__weak的使用
参考文章__weak和__block的区别
在Block中使用成员变量,retain的不是这个变量,而会retain self
在ARC下为了防止循环引用用__weak
如果我们正在执行block中,这时如果是外部把model = nil 那么block中的weakModel的值也会被设置成nil,这也许就违背了使用的意图
解决方法是:如上图所示 __strong接受一些weakmodel,这样就可以避免