1.Block存储的位置
<b>代码区 </b>
不访问处于栈区的变量(局部变量),且不访问堆区变量,可以访问全局变量
<b>堆区</b>
访问了处于栈区或者堆区的变量
实际放在栈区,ARC下自动拷贝到堆区,非ARC下,在栈区,所在函数执行完后就释放,想在外部调用,需要用copy到堆区,用strong会造成野指针
2.单利保存的位置
单例对象一旦建立,对象指针是保存在静态区的,单例对象在堆中分配的内存空间,会在应用程序终止后才会被释放;
3.AFNetWorking导致循环引用
常用的初始化方法:
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
但是manager并不是一个单利,每次创建都会创建一个新的对象
AFHTTPSessionManager 继承 AFURLSessionManager,
AFURLSessionManager中强引用 session
83088CC2-52B6-4129-909D-250E11288DDD.png而 session又设置当前代理为AFURLSessionManager, 从而导致循环应用
5AAECE7F-19F3-47B6-9A58-21D71AE0B736.png解决方法:
1.- (void) invalidateAndCancel; 取消当前任务,session对象被释放
2.- (void) finishTasksAndInvalidate; 等待任务结束后将session释放
可以在success 和 failure block中调用这两个方法推荐使用第二种
3._weak修饰的变量必须注册到autoreleasepool中
_waak修饰符只持有对象的弱引用,而在访问对象的过程中,该对象有可能被废弃,把要访问的对象注册到autoreleasepool中,那么在@autoreleasepool块结束之前都能保证对象的存在。
网友评论