新增的两个成员就是来对,对象进行内存管理操作的。
总结:person什么时候释放,就看一点,使用强引用访问person的这个block,在什么时候释放销毁。
默认情况下,block里面是不能去修改外面那个age的值的因为age的内存在main函数中,block里面的代码在另一个函数中,在另一个函数中修改age,是不可取的
原因:首先age是在main函数这个大括号里面声明的,说明age的内存是存在于main函数的栈空间,但是block内部的代码_main_block_func_0函数里面,现在想_main_block_func_0函数里面去修改main函数里面的age,这种想在一个函数里面去改另一个函数里面的局部变量,肯定改不了的。
static修饰的局部变量,可以修改
如果希望block内部访问的变量能够被修改的话,第一种做法就是把局部变量变成static修饰的局部变量,或者变成全局变量,这是一种做法。
用_block修饰age之后,生成的c文件
_block修饰后能改变值的原理:block内部会有个指针指向一个结构体,然后通过指针找到那个结构体的内存,把结构体里面的那个int age给改掉。
_blcok的原理
该代码对应生成的c文件是下图
_block不管是修饰基本数据类型还是oc对象类型,都是一样的,都会生成一个结构体,然后通过结构体间接去引用那个变量。
这种情况不是修改array这个指针,还是使用这个指针,所以不会报错。array = nil,这种直接修改array的情况,才需要_block修饰。
_blcok会导致block的结构变复杂,也会生成新的结构体,所以能不用_block就不用。
网友评论