美文网首页
Dark Corner In ARC

Dark Corner In ARC

作者: 偶是星爷 | 来源:发表于2018-12-21 13:06 被阅读9次

自从有了ARC,iOSer感觉得到了解放,再也不用考虑内存问题了,最多注意一下循环引用

iOS系统Framework很多地方对参数处理不统一。比如NSTimer强引用target,NSNotificationCenter是unsafe_assign,NSURLSession的delegate是retain等等

ARC通过分析代码,在合适的位置帮我们做内存管理。但是动态调用,就不能那么智能了。比如下面代码就会导致泄漏

- (void)test {
    for (int i = 0; i < 4; i++) {
        SEL sel = NSSelectorFromString(@"newData");
        [self performSelector:sel];
    }
    
    return YES;
}

- (MYData *)newData {
    
    MYData *data = [MYData new];
    return data;
}

可以看一下newData的汇编代码(Product->Perform Action->Assembly)

    .p2align    2
Lfunc_begin3:
    .loc    17 62 0                
    .cfi_startproc
    adrp    x8, l_OBJC_CLASSLIST_REFERENCES_$_.35@PAGE
    ldr x0, [x8, l_OBJC_CLASSLIST_REFERENCES_$_.35@PAGEOFF]
    adrp    x8, l_OBJC_SELECTOR_REFERENCES_.37@PAGE
    ldr x1, [x8, l_OBJC_SELECTOR_REFERENCES_.37@PAGEOFF]
    b   _objc_msgSend
Lfunc_end3:
    .cfi_endproc

ARC没有对返回的对象release,直接返回了。performSelector由于不知道返回的对象是什么,也不会它做任何操作,于是乎这个对象就泄漏了。

如果把newData改为getData,看看汇编代码有什么不同

    .p2align    2               ;
Lfunc_begin4:
    .cfi_startproc
    stp x29, x30, [sp, #-16]!   ; 8-byte Folded Spill
    mov x29, sp
    adrp    x8, l_OBJC_CLASSLIST_REFERENCES_$_.35@PAGE
    ldr x0, [x8, l_OBJC_CLASSLIST_REFERENCES_$_.35@PAGEOFF]
    adrp    x8, l_OBJC_SELECTOR_REFERENCES_.37@PAGE
    ldr x1, [x8, l_OBJC_SELECTOR_REFERENCES_.37@PAGEOFF]
    bl  _objc_msgSend
    ldp x29, x30, [sp], #16     ; 8-byte Folded Reload
    b   _objc_autoreleaseReturnValue
Lfunc_end4:
    .cfi_endproc

多了一个_objc_autoreleaseReturnValue调用。正是这个ARC插入的调用,将对象放入自动释放池,就不会出现泄漏。

OC有一套自己的命名规则,已new、copy,create开头的方法,默认都是调用方负责释放对象。所以,performSelector还是可以用的,就是要注意不要调用上面这种方法就可以了(官方建议使用NSInvocation代替)。

相关文章

  • Dark Corner In ARC

    自从有了ARC,iOSer感觉得到了解放,再也不用考虑内存问题了,最多注意一下循环引用 iOS系统Framewor...

  • dark dark dark

    20170414 时装周经历了几次黑暗。 出发之前的再三忧郁。始终想不通是否该去,作为一家经营前景不明的小店铺,没...

  • Corner

    2essays. 友情变淡,时过境迁,就像曾经最容易打开的对话框,现在却成了最难问候的一个。 我们总是...

  • CORNER

    1essays. 两点多醒来,又到四点了,天亮后,又是令我恐惧的一天。空闲的副作用就是让我多出很多胡思乱想的...

  • Corner

    3essays. 一个失眠症患者,不管他干什么,失眠是事情的实质。 2015年对我而言是艰难的一年,...

  • Corner

    他从长睡中醒来, 光亮从空中砸落到脸上 有些许酥麻。昨晚 胡乱扔到地上的衣服己 叠好后整齐地放在床边。 他想难道昨...

  • corner的分类

    Corner可以分为对晶体管的偏差建模的PVT corner,以及对互联线偏差建模的RC Corner。 PVT ...

  • RC corner

    scenario 定义中包括 Mode、Corner、RC 其中 Corner (PVT)用于计算 cell de...

  • the weather dark and dark

    The heavy smog coming again , the vision seems very obs...

  • On a dark dark night

    —-15期英文绘本训练营山东烟台老麦 读了一本英文绘本《On a dark dark night》,没想到孩子们接...

网友评论

      本文标题:Dark Corner In ARC

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