知识点

1.Block存储的位置

<b>代码区 </b>
不访问处于栈区的变量(局部变量),且不访问堆区变量,可以访问全局变量
<b>堆区</b>
访问了处于栈区或者堆区的变量
实际放在栈区,ARC下自动拷贝到堆区,非ARC下,在栈区,所在函数执行完后就释放,想在外部调用,需要用copy到堆区,用strong会造成野指针

2.单利保存的位置

单例对象一旦建立,对象指针是保存在静态区的,单例对象在堆中分配的内存空间,会在应用程序终止后才会被释放;

3.AFNetWorking导致循环引用

常用的初始化方法:
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
但是manager并不是一个单利,每次创建都会创建一个新的对象

A13545AB-4B35-48AD-9F41-E71CC3A07524.png

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块结束之前都能保证对象的存在。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 使用 #import 相对c的 include 是防止头文件的重复导入 2. NSLog 相对于 print...
    迎风起飞的猪阅读 1,769评论 6 9
  • 重点掌握 3 类对象和方法 对象就是一个物体 类的独特存在就是一个实例,对实例进行操作叫做方法。方法可以应用于类或...
    Coder大雄阅读 1,281评论 0 2
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,731评论 0 11
  • 37.cocoa内存管理规则 1)当你使用new,alloc或copy方法创建一个对象时,该对象的保留计数器值为1...
    如风家的秘密阅读 887评论 0 4
  • 10.9号……83天 【体验入】 今天下了一天的雨,客人不是很多,销售和美容室的同事们,都在为自己今天完不成业绩发...
    吕志萍阅读 386评论 0 1