性能之内存管理

应用中的内存消耗分为:栈大小和堆大小。

栈大小

  • 可被递归调用的最大方法数
  • 一个方法中最多可以使用的变量个数
  • 视图层级中可以嵌入的最大视图深度

堆大小

每个进程的所有线程共享一个堆。一个应用可以使用的堆大小通常远远小于设备的RAM值。

自动释放池块(autoreleasepool)

在一些特殊情况下,需要创建自己的autoreleasepool。
* 当你有一个创建了很多临时对象的循环时
* 当你创建一个线程时

ARC的规则

* 不能实现或调用retain、release、autorelease或retainCount方法
  这一规则不仅针对对象,对选择器同样有效
* 可以实现dealloc方法,但不能调用它包括超类
* 不能调用NSAllocateObject和NSDeallocateObject方法
  应该使用alloc方法创建对象,运行时负责回收对象
* 不能在C语言的结构体内使用对象指针
* 不能在 id 类型和void * 类型之间自动转换。如果需要,必须做显示转换。
* 不能使用NSAutoreleasepool,要替换成autoreleasepool
* 不能使用NSZone内寸区域
* 属性的访问器名称不能以new开头,以确保与MRC的互操作性
* Core Foundation类型需要自己手动管理内存

引用类型

  • 弱引用:不会增加引用计数
  • 强引用:会增加引用计数

变量限定符

  • _strong、 _weak 、_unsafe_unretained、_autoreleasesing
    例子:
    Person* _strong p1 = [[Person alloc] init]// 引用计数为1,并且对象在p1引用期间不会被回收
    Person* _weak p2 = [[Person alloc] init]// 引用计数为0,对象会被立即释放,且p2将被设置为nil
    Person* _unsafe_unretained p3 = [[Person alloc] init]// 引用计数为1,对象会被立即释放,且p3不会被设置为nil
    Person*_autoreleasing p4 = [[Person alloc] init]// 引用计数为1,当方法返回时对象会被立即释放

属性限定符

这个就不在此做解释了,不懂的,百度上有很多教程

僵尸对象

用来捕捉内存错误的调试功能
通常情况下,当引用计数为0时,对象会立即释放,会使得调试困难。开启僵尸对象,那么对象不会立即释放内存,而是标记为僵尸。
NSZombieEnabled是一个环境变量,可以控制Core Foundation的运行时是否将使用僵尸对象
注意:在发布构建时一定要禁用

内存管理规则

* 你拥有所有自己创建的对象,如new、alloc、copy、mutableCopy
* 你可以用MRC中的retain或ARC中的__strong引用来拥有任何对象的持有关系
* 一定不能抛弃原本并不存在持有关系的对象

循环引用

主要出现的场景委托、块、线程与计时器

观察者

  • 键-值观察
    它不会维持观察对象、被观察对象以及上下文对象的强引用。如有必要,你需要自行维护对它们的强引用。
  • 通知中心
    一个对象可以注册为通知中心的观察者,并接收NSNotification对象。它不会对观察者持有强引用。

返回错误

当某个方法接收NSError**参数,并在发生错误时填充错误变量,则必须使用__autoreleasing限定符。

弱类型:id

在使用常规命名的方式时,应避免使用id。尽量使用具体的类取而代之。

合理使用全局变量与单例

推荐做法

  避免大量的单例
  对子对象使用__strong
  对父对象使用__weak
  对使引用图闭合的对象(如委托)使用__weak
  对数值属性,使用assign
  对块属性,使用copy限定符
  当声明使用NSError**参数的方法时,需要使用__autoreleasing。并注意用正确的语法: NSError*__autoreleasing *。
  避免在块内直接引用外部的变量。在外用weakify,在内strongify
  销毁计时器、移除观察者、解除回调(例如:委托设置为nil)

扩展

依赖注入(Typhoon和Objection框架)
Instruments进行内存分析

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容