知识点

作者: 麋晓鹿 | 来源:发表于2017-04-16 15:26 被阅读6次

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

    相关文章

      网友评论

          本文标题:知识点

          本文链接:https://www.haomeiwen.com/subject/auuaattx.html