内存泄漏主要两种:
Release操作泄漏的内存
循环引用泄漏的内存
重写dealloc:
必须最后调用[super dealloc]
循环引用实质:多个对象相互之间有强引用,不能释放让系统回收
代理用weak还是assign?
Mrc用assign, arc用weak,因为变量释放后 自动指向nil,防止野指针存在
Nstime 循环引用属于相互循环使用解决方法:
回调方法设置invalidate设置为nil
在合适的位置invalidate设置为nil
悬垂指针:
指针指向的内存已经被释放了 但指针还存在
野指针:
没进行初始化的指针 ,指向不可用内存的指针
strong:
指向并持有该对象,修饰对象的引用计数会加1
weak:
指向但不持有该对象,引用计数不会加1
copy:
与strong类似,多修饰不可变对象
__unsafe_unretain:
类似weak。 当对象被释放后,指针已然保存着之前的地址,被释放后的地址 变为 僵尸对象,访问被释放的地址就会出问题,所以说他是不安全的。
内存5大区:
栈区:函数参数、局部变量
堆区:
全局区:全局变量和静态变量
文字常量区:字符串
代码区:二机制代码
默认关键字:atomic、readwrite strong/retain
@autoreleasePool的数据结构:
双向链表
__weak修饰的变量 是否已被注册在@autoreleasePool :
必须。 为了延长生命周期,以延缓释放。
引用计数:
mrc(手动引用计数)和arc(自动引用计数)
怎么找到引用计数值:
Retain和release经过两次哈希算法,找到其对应的引用计数值
bad_access在什么情况出现:
访问销毁的内存空间。 根本原因 悬垂指针没有被释放。
__weak 和 _Unsafe_Unretain区别:
修饰的指针变量,指向的内存地址销毁后,在runtime的机制下,自动设置为nil;
而_Unsafe_Unretain不会设置nil,容易出现野指针。不安全但效率高。