美文网首页
performSelector内存泄漏问题

performSelector内存泄漏问题

作者: tom555cat | 来源:发表于2018-12-17 18:38 被阅读17次

编译器并不会判断performSelector调用了什么方法,ARC不会添加释放方法(关键是也不知道采用何种释放手段)。

例如下面代码:

[NSObject alloc];

编译器在执行时,会添加objc_release方法来释放创建的NSObject对象,

->  0x10ea80666 <+54>: mov    rax, qword ptr [rip + 0x26bb] ; (void *)0x000000010fa2dea8: NSObject
0x10ea8066d <+61>: mov    rsi, qword ptr [rip + 0x269c] ; "alloc"
0x10ea80674 <+68>: mov    rdi, rax
0x10ea80677 <+71>: call   0x10ea80a18               ; symbol stub for: objc_msgSend
0x10ea8067c <+76>: mov    rdi, rax
0x10ea8067f <+79>: call   0x10ea80a24               ; symbol stub for: objc_release

而采用performSelector执行时,

[NSObject performSelector:@selector(alloc)];

编译结果如下,可以看到在函数返回之前,编译器也没有加入任何释放NSObject对象的代码。而我们知道通过alloc创建的对象,需要通过objc_release来释放,所以会造成内存泄漏。

0x10f918666 <+54>: mov    rax, qword ptr [rip + 0x26c3] ; (void *)0x00000001108c5ea8: NSObject
0x10f91866d <+61>: mov    rdx, qword ptr [rip + 0x269c] ; "alloc"
0x10f918674 <+68>: mov    rsi, qword ptr [rip + 0x269d] ; "performSelector:"
0x10f91867b <+75>: mov    rdi, rax
0x10f91867e <+78>: call   0x10f918a18               ; symbol stub for: objc_msgSend
->  0x10f918683 <+83>: mov    qword ptr [rbp - 0x28], rax
0x10f918687 <+87>: add    rsp, 0x30
0x10f91868b <+91>: pop    rbp
0x10f91868c <+92>: ret    

在这种情况下,继续执行,然后打开memory graph查看内存:


内存泄漏查看

果然发现了内存泄漏。

相关文章

  • performSelector内存泄漏问题

    编译器并不会判断performSelector调用了什么方法,ARC不会添加释放方法(关键是也不知道采用何种释放手...

  • Xcode调试工具

    一.静态内存分析工具 编译阶段查找内存泄漏等问题 1.常见内存泄漏问题 常见的内存泄漏除了循环引用,CoreFou...

  • performSelector内存泄露

    performSelector延时调用的问题, performSelector关于内存管理的执行原理是这样的:执行...

  • 三个方法帮助解决Android内存泄漏问题

    三个方法帮助解决Android内存泄漏问题 最近自己遇到了好几个内存泄漏的问题,也帮同事解决了几个内存泄漏的问题记...

  • 安卓内存泄漏

    Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...

  • Part1_Android内存泄漏总结

    Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...

  • Android 内存泄漏总结

    Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...

  • 【中级——高级迈不过去?】Android高级工程师进阶学习——A

    Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...

  • Android内存泄漏相关

    问题1 内存泄漏的基本定义是什么?内存泄漏有什么危害?问题2 开发中常见的内存泄漏的情况有哪些?什么原因造成的?怎...

  • iOS 内存泄漏排查方法及原因分析

    本文将从以下两个层面解决iOS内存泄漏问题: 内存泄漏排查方法(工具) 内存泄漏原因分析(解决方案) 在正式开始前...

网友评论

      本文标题:performSelector内存泄漏问题

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