刚从其他开发语言转到mac开发上的工程师,对苹果release/retain机制都有些不适应,如果你之前用c写过python模块,就没有什么障碍:

Py_DECREF

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,后果无外乎多占用点系统内存

本文地址: http://lutaf.com/95.htm 鲁塔弗原创文章,欢迎转载,请附带原文链接