文档章节

Objective C内存管理的核心思想

whj
 whj
发布于 2014/03/16 22:23
字数 817
阅读 250
收藏 3

刚从其他开发语言转到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

whj

whj

粉丝 20
博文 32
码字总数 6865
作品 0
海淀
私信 提问
加载中

评论(2)

yoyoso
yoyoso
零指针访问比内存泄露更可怕,这个没看懂,OC里面nil指针访问完全没有问题
yoyoso
yoyoso
零指针访问比内存泄露更可怕,这个没看懂,OC里面nil指针访问完全没有问题
iOS开发CoreGraphics核心图形框架之一——CGPath的应用

iOS开发CoreGraphics核心图形框架之一——CGPath的应用 一、引言 CoreGraphics核心图形框架相较于UIKit框架更加偏于底层。在Objective-C工程中,CoreGraphics其中方法都是采用C语言风格进行编...

珲少
2016/10/11
16.6K
0
collection element of type 'CGColorRef _Nullable' (aka'stuct CGColor*')is not an Objective-C object

类型转换为ID解决问题: “Collection element of type 'CGColorRef' (aka 'struct CGColor *') is not an Objective-C object” 编译器理解Objective-C方法返回的核心基础类型遵循历史可命名......

秦无炎
2016/10/18
29
0
iOS开发之Object-C和Cocoa [转]

Objective-C Objective-C,是扩充C的面向对象编程语言。是在C的基础上,加入面向对象特性扩充而成的编程语言。目前,Objective-C主要应用于Mac OS X和iOS开发,而在NeXTSTEP和OpenStep中它更...

ilscott
2012/12/13
0
0
代码等静态分析(Clang/LLVM,Hades)

> Clang/LLVM 针对 C/Objective-C 主流的静态分析开源项目包括:Static Analyzer、Infer、OCLint 等。 对于 C/Objective-C 而言,主流编译器是 Clang/LLVM(Low Level Virtual Machine)的,...

desaco
2018/11/25
0
0
这些年我们爱着的 Objective-C

Objective-C是开发OS X和iOS应用的标准语言。即便是天天跟它打交道的开发者,有些也会误以为Objective-C就是Apple公司创建出来的语言,但实际上它并不是Apple的亲骨肉,而是从别人家过继过来...

oschina
2016/06/26
4.3K
12

没有更多内容

加载失败,请刷新页面

加载更多

JWT学习总结

官方 https://jwt.io 英文原版 https://www.ietf.org/rfc/rfc7519.txt 或 https://tools.ietf.org/html/rfc7519 中文翻译 https://www.jianshu.com/p/10f5161dd9df 1. 概述 JSON Web Token(......

冷基
39分钟前
3
0
AOP的学习(1)

AOP 理解AOP编程思想(面向方法、面向切面) spring AOP的概念 方面 -- 功能 目标 -- 原有方法 通知 -- 对原有方法增强的方法 连接点 -- 可以用来连接通知的地方(方法) 切入点 -- 将用来插入...

太猪-YJ
今天
4
0
一张图看懂亮度、明度、光度、光亮度、明亮度

亮度、明度、光亮度,Luminance和Brightness、lightness其实都是一个意思,只是起名字太难了。 提出一个颜色模型后,由于明度的取值与别人的不同,为了表示区别所以就另想一个词而已。 因此在...

linsk1998
昨天
8
0
Python应用:python链表示例

前言 python链表应用源码示例,需要用到python os模块方法、函数和类的应用。 首先,先简单的来了解下什么是链表?链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是...

python小白1
昨天
4
0
Source Insight加载源码

Source Insight是一个图形化的源代码查看工具(当然也可以作为编译工具)。如果一个项目的源代码较多,此工具可以很方便地查找到源代码自建的依赖关系。 1.创建工程 下图为Snort源代码的文件...

天王盖地虎626
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部