首先内存回收的本质:
1、申请一块空间,实际上是向系统申请一块别人不再使用的空间;
2、释放一块空间,指的是占用的空间不再使用,这个时候系统可以分配给别人去使用;
3、这个空间在分配给别人之前,原来的数据还是存在的;
3.1、OC对象释放后,表示OC对象占用的空间可以分配给别人使用;
3.2、但是在分配给别人之前,这个空间里对象的数据仍然存在;
僵尸对象:一个已经被释放的对象就叫做僵尸对象
野指针:当所指向的对象被释放或者被回收,但是对该指针没有做任何的修改(没有置为nil),以至于该指针仍旧指向已经回收的内存地址;此情况下该指针便称为野指针。
使用野指针访问僵尸对象,有时候会出问题,有时候不会出问题。
1、当野指针指向的僵尸对象所占用的空间还没分配给别人的时候,这个时候其实是可以访问的,因为对象的数据还在;
2、当野指针指向的对象所占用的空间分配给了别人的时候 这个时候访问就会出问题.
3、所以不要通过一个野指针去访问一个僵尸对象.(一般遇到exc_bad_access这种 都是野指针访问僵尸对象造成的问题)
oc中assign通常用来修饰基本数据类型;基本数据类型是分配到栈区的,栈区的内存是有系统分配和释放管理的,不会出问题;
当用assign修饰对象类型数据时,对象类型是分配到堆区的,而堆区的内存是有程序员管理的,当对象释放后(因为不存在强引用,离开作用域对象内存可能被回收),指针的地址还是存在的,也就是说指针没有被置为nil,下次再访问该对象就会造成野指针异常问题。
这里也反映了为什么weak可以修饰对象类型数据,虽然weak也没有强引用,但weak会在对象释放的时候,把指针置空,这样就无法访问到被释放的内存了。