刚从其余开发语言转到mac开发上的工程师,对苹果release/retain机制都有些不适应,若是你以前用c写过python模块,就没有什么障碍:python
Py_DECREFios
Py_DECREF程序员
也是同样的效果算法
在llvm引入ARC机制以后,基本上不须要你们手写release/retain了,只有在对象property声明的时候还会出现retain。须要强调的是:ARC是编译器的自动代码生成功能,并非自动垃圾回收。ARC并非放弃release/retain计数机制,只是不须要程序员手写,编译器帮你自动插入相关代码。编程
Objective C全部对象都是创建在heap上,声明的变量都是指针,C++能够在栈上分配一个object,这里的堆和栈不是算法数据结构上的通用概念,是特指程序运行时的特定内存区域,stack在函数返回时,数据会被自动倒序清除,heap中的对象的销毁由程序员决定数组
对象都是创建heap上有3个好处:服务器
能够加快编译速度,这是delphi当初的一个大卖点数据结构
优化性能/减低程序员写错代码的概率,在函数中new一个object并返回,若是这个对象创建在stack上,后续就会出现零指针访问错误编程语言
把object集中放置能够优化内存管理,这个是很天然的,现代编程语言都会对 诸如小对象分配作优化函数
Objective C的release/retain 核心在于苹果工程师的工程哲学: 零指针访问比内存泄露更可怕
这条哲学说明ios的设计者有很是丰富的工程经验:零指针访问程序必然挂掉,这是cpu控制的。内存泄露并非漏气漏水,其实上是内存占用速度超过内存释放速度,除非极端状况,基本上影响不大,并不致命,实在不行,重启一次程序就能够,网游服务器按期要停机维护就是这个缘由
理解release/retain 机制:每一个对象有一个计数器,retain加一,release减一,计数器减到0,再销毁对象并释放内存
把对象A交给对象B,若是B须要确保A的一直可用,那么就须要对A执行一次retain
例如:把 一个NSObject 放入到到一个 NSArray里面,retain一次以后,不管NSObject何时被release(固然只能release一次),NSArray保存的对象指针指向的NSObject是不会被真正销毁的,你遍历这个数组的时候,还能够用,不会出现bad pointer错误
一样的,一个对象若是定义了一个property是retain的,那说明它很在乎这个property,须要这个property一直伴随该对象
说简单点,release/retain机制就是在于:你是个人一部分,我须要你的时候 对象别被销毁了,要确保这点,retain之。
因此release/retain的用法诀窍在于:retain调用次数多点不碍事,你拿不许的状况均可以retain,后果无外乎多占用点系统内存