Objective C内存管理的核心思想
2014-03-16 22:23
260 查看
刚从其他开发语言转到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,后果无外乎多占用点系统内存
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,后果无外乎多占用点系统内存
相关文章推荐
- Java中的四个核心技术思想
- 各语言设计思想的独特之处:C/C++、Java、Python、Objective C、Groovy
- 用简单的实例来实践TDD的核心思想
- 【小知识】小例子说明Spring的核心思想之一:控制反转。
- iOS开发核心语言 Objective C —— 语言简介及特性
- Hibernate核心思想—ORM机制(一)
- 核心游记之 内存管理paging_init
- 10位管理学大师及其核心重要思想
- [转]代理模式——代理模式的核心思想
- Java四个核心思想
- objective c 内存管理
- 《BREW进阶与精通――3G移动增值业务的运营、定制与开发》连载之17---BREW核心思想之电子商务
- 利用perl从大量数据中筛选我们我们需要的数据,核心思想就是根据格式的一致性,将每一行利用split转换成数组,然后输出对应的数组
- Win32 核心 DPC 设计思想和实现思路浅析
- 定义 范围与核心思想 IT服务管理及其价值
- 我对页面重构的核心思想的见解
- iOS开发核心语言Objective C —— 面向对象思维、setter和getter方法及点语法
- pageRank算法核心思想
- 有限元方法的核心思想是什么?