http://blog.sina.com.cn/s/blog_7309637a01016q6c.html

首先给一段错误的代码:

NSString *mm  = (NSString*)ABMultiValueCopyValueAtIndex(phone, i);

mm = [mm substringToIndex:1];//这时的mm已经不是原先的mm了,之前的mm被内存泄漏了
if(mm)
  CFRelease((CFTypeRef)mm);
//注:phone是由一下方式获取;ABMultiValueRef phone = ABRecordCopyValue(person,kABPersonPhoneProperty);
上面这段代码使用xcode->product->Analyze编译会得到两个警告提示:、
(1)Incorrect decrement of the reference count of an object that is not owned at this point by the caller;
(2)Potential leak of an object allocated on line 414 and stored into 'mm'
接下来再给一段正确的代码:

CFStringRef mmcf = ABMultiValueCopyValueAtIndex(phone, i);

NSString *mm = (NSString*)mmcf;

mm = [mm substringToIndex:1];//mm由NSString的系统机制自行维护

CFRelease(mmcf);

最后,为什么会这样,Why?

我们分析一下那段错误的代码:

首先,将ABMultiValueCopyValueAtIndex(phone, i)得到的结果记作变量CF,

其类型是CFString。

CFString必须使用CFRelease()来释放,否则会内存泄漏;

(NSString*)CF是类型强制转换;把CF的内容以NSString*的形式提供出来。所以(NSString*)后,本质还是CF.

于是下面这句代码

NSString *mm  = (NSString*)ABMultiValueCopyValueAtIndex(phone, i);

的真正含义是:

NSString *mm = (NSString*)CF;

此时,mm和CF本质上是同一个东东;

继续看接下来的代码:

mm = [mm substringToIndex:1];

将[mm substringToIndex:1]的结果记作变量B,于是上面的的语句也可以写作:

mm=B

这时产生问题了,CF哪里去了?按照这样写代码的方式,没有办法释放CF,所以CF即将被内存泄漏了。

于是在最后一句:
if(mm)
  CFRelease((CFTypeRef)mm);
释放的的内容实际是B,不是原先的CF,CF被内存泄漏了。

ABMultiValueCopyLabelAtIndex使用不当引起的内存泄漏相关推荐

  1. Java Review - 线程池中使用ThreadLocal不当导致的内存泄漏案例源码分析

    文章目录 概述 Why 内存泄露 ? 在线程池中使用ThreadLocal导致的内存泄漏 概述 ThreadLocal的基本使用我们就不赘述了,可以参考 每日一博 - ThreadLocal VS I ...

  2. android释放acitity内存,Android 内存泄漏分析与解决方法

    在分析Android内存泄漏之前,先了解一下JAVA的一些知识 1. JAVA中的对象的创建 使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象 垃圾回收器回收非存活的对象,并释放对应的内 ...

  3. ThreadLocal到底有没有内存泄漏?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 1. 前言 ThreadLocal 也是一个使用频率较高 ...

  4. Netty防止内存泄漏措施

    谨以此文献给李林锋即将新生的爱女. 1.  背景 1.1 直播平台内存泄漏问题 某直播平台,一些网红的直播间在业务高峰期,会有 10W+ 的粉丝接入,如果瞬间发生大量客户端连接掉线.或者一些客户端网络 ...

  5. ThreadLocal到底有没有内存泄漏?从源码角度来剖析一波

    1. 前言 ThreadLocal 也是一个使用频率较高的类,在框架中也经常见到,比如 Spring. 有关 ThreadLocal 源码分析的文章不少,其中有个问题常被提及:ThreadLocal ...

  6. golang 关闭gc 并手动gc_Golang 防内存泄漏编码原则

    (给Go开发大全加星标) 来源:zmlgo https://www.cnblogs.com/share-ideas/p/11365511.html [导读]go 编程中,如果写法不当,可能引发内存泄漏 ...

  7. ThreadLocal 内存泄漏问题

    本文说说ThreadLocal由于使用不当造成的内存泄漏问题 Thead和ThreadLocal的内存状况如下图,不了解的同学参考: 图解ThreadLocal核心原理 如果线程太多,每个线程的val ...

  8. web 开发之js---理解并解决IE的内存泄漏方式

    程序当中任何编程内存操作不当都会导致内存泄漏 http://wenku.baidu.com/link?url=8ba4UIn1aaevxTagH-F4vID79-bAfxdcLdeujGFn7PBnv ...

  9. threadlocal使用场景_ThreadLocal有没有内存泄漏?源码给你安排得明明白白

    1. 前言 ThreadLocal 也是一个使用频率较高的类,在框架中也经常见到,比如 Spring. 有关 ThreadLocal 源码分析的文章不少,其中有个问题常被提及:ThreadLocal ...

最新文章

  1. wcf 返回图片_WCF实现上传图片功能
  2. appium 搭建及实例
  3. iOS 将16进制颜色转换成UIColor
  4. java程序源代码如何保存到桌面_如何编写JAVA小白第一个程序
  5. Node.js listen EADDRINUSE 错误解决 How to solve nodejs Error: listen EADDRINUSE
  6. 2048小游戏设计思路
  7. 计算机网络实验(router_sim)工具
  8. The specified JRE installation does not exist异常的原因和解决办法
  9. svm支持向量机分类方法
  10. 拓端tecdat|R语言和Stan,JAGS:用rstan,rjags建立贝叶斯多元线性回归预测选举数据
  11. java long类型6_Java学习6——基本数据类型及其转换
  12. java mysql图书馆管理系统源码+论文
  13. hourstracker 考勤表软件下载
  14. 江西银行服务器怎么选择硬件配置
  15. x509证书验证示例
  16. 一文掌握智能抠图Deep Image Matting(pytorch实现)
  17. 【算法学习笔记07】贪心算法(Greedy Algorithm)
  18. iOS 手动实现KVO / iOS KVO底层原理
  19. IDEA全局搜索快捷键Ctrl+Shift+F无效,解决方法
  20. 在matlab中理解采样定理

热门文章

  1. 《R in Action》读书笔记(3) 数据变换
  2. EBS系统请求表定时清除
  3. 复旦的NLP——fudanNLP
  4. 社区实施 GPL 的原则介绍
  5. spring boot 的API敏捷开发框架
  6. 高并发架构系列:Redis缓存和MySQL数据一致性方案详解
  7. 微软人工智能-服务和 API
  8. HTML5的革新:结构之美
  9. Leecode 入门--单链表-- 递归操作
  10. python采用函数式编程模式-浅谈Python 函数式编程