文档章节

OC内存管理原则

Charly张
 Charly张
发布于 2016/07/25 14:39
字数 391
阅读 33
收藏 0

在做Vuforia-iOS-Lib的Demo程序时,发现库中的Controller在MRR工程中会得不到释放。我看了Apple官网的"Advanced Memory Management Programming Guide",收获不小,做点笔记。

思考角度

内存管理应该从对象所有权的角度思考,而不应该从引用计数的角度,去过分强调实现细节。

图片来自官方文档

基本原则

  1. 你拥有任何你创建的对象。
    • 使用 “alloc”, “new”, “copy”或者“mutableCopy” 创建的对象。
  2. 可以利用retain获取对象的所有权。
    • 存取方法init中获取对象所有权作为自身属性;
    • 为避免其他操作将对象销毁而造成问题;
  3. 当不需要对象时,必须释放对其所有权。
    • 利用“release” 或 “autorelease”
  4. 必须释放不该拥有的对象的所有权。

其他原则

  1. 你不拥有以引用形式返回的对象。

    • 比如 ClassName **id *
  2. 存取方法来管理内存。

    • 用来赋值给属性;
    • 不在initdealloc中使用存取方法
  3. 用弱引用来避免循环引用

  4. 不用dealloc管理稀缺资源。

    • 不应该在dealloc中管理文件描述符网络连接缓存等。
    • 因为程序的bug或突然中断会导致dealloc不能正常调用;
    • 因为对象图的析构顺序不确定。

© 著作权归作者所有

共有 人打赏支持
Charly张
粉丝 8
博文 22
码字总数 15101
作品 0
海淀
程序员
Managing Toll-Free Bridging

在cocoa application的应用中,我们有时会使用Core Foundation(CF),我们经常会在Objective-C和CF之间进行转化。系统使用arc的状态下,编译器不能自动管理CF的内存,这时候你必须使用CFRet...

鉴客
2012/01/09
286
0
精品 CF与OBJC在ARC下的内存管理。

http://wangjun.easymorse.com/?p=1490 « ios本地通知和远程通知 创建一个Storyboard工程 » Managing Toll-Free Bridging 在cocoa application的应用中,我们有时会使用Core Foundation(C...

晨曦之光
2012/05/28
772
0
03 - Object-C内存管理

1、基本原理 1.1、 什么是内存管理 移动设备的内存极其有限,每个app所能占用的内存是有限制的 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间。比如回...

口十耳
2015/12/29
18
0
iOS中的内存管理(上)

下列行为都会增加一个app的内存占用: 1、创建一个OC对象; 2、定义一个变量; 3、调用一个函数或者方法。 如果app占用内存过大,系统可能会强制关闭app,造成闪退现象,影响用户体验。如何让...

傲风凌寒
2014/05/20
0
0
IOS NSString真是个奇葩啊!

一直认为像这样写会造成内存泄露呢!可是我好像真的错了。 NSString *textStr = @"abc";if (YES) {textStr = @"def";}NSLog(@"textStr is %@", textStr); 这样写一点问题都没有,因为在OC中有...

李远超
2013/05/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周日乱弹 —— 种族不同,禁止交往

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《苏菲小姐》- 鱼果 《苏菲小姐》- 鱼果 手机党少年们想听歌,请使劲儿戳(这里) @貓夏:下大雨 正是睡觉的好时候 临睡前...

小小编辑
今天
211
6
Python 搭建简单服务器

Python动态服务器网页(需要使用WSGI接口),基本实现步骤如下: 1.等待客户端的链接,服务器会收到一个http协议的请求数据报 2.利用正则表达式对这个请求数据报进行解析(请求方式、提取出文...

代码打碟手
今天
1
0
Confluence 6 删除垃圾内容

属性(profile)垃圾 属性垃圾的定义为,一个垃圾用户在 Confluence 创建了用户,但是这个用户在自己的属性页面中添加了垃圾 URL。 如果你有很多垃圾用户在你的系统中创建了属性,你可以使用...

honeymose
今天
0
0
qduoj~前端~二次开发~打包docker镜像并上传到阿里云容器镜像仓库

上一篇文章https://my.oschina.net/finchxu/blog/1930017记录了怎么在本地修改前端,现在我要把我的修改添加到部署到本地的前端的docker容器中,然后打包这个容器成为一个本地镜像,然后把这...

虚拟世界的懒猫
今天
1
0
UML中 的各种符号含义

Class Notation A class notation consists of three parts: Class Name The name of the class appears in the first partition. Class Attributes Attributes are shown in the second par......

hutaishi
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部