您的位置:首页 > 移动开发 > Objective-C

Objective-C的内存管理机制(非ARC)

2015-06-01 21:24 351 查看
Objective-C的内存管理机制

我们都知道在程序面向对象的语言中,对象都是存储在堆内存中,一些临时的基本数据类型的变量是存储在栈中。然而我们在编程时堆的大小是一定的,所以我们在写程序时不得不考虑内存的管理,这样才能让程序更高效地运行。

在C#和Java中是通过垃圾回收机制(GC)来释放内存,而在Objective -C中没有这种机制。必须是由程序员或者编译器给我们添加内存管理代码。

在Xcode4.2之后的 版本之后出现了Automatic Refence Count 机制(ARC);在之前的版本中,需要程序员手动地去写管理内存的代码,叫做MRC机制。其实两者都是在引用计数器的基础上的,并不是有了ARC 就没有了引用计数器。只是ARC 机制是编译器自动在编译时自动生成了管理内存的代码。

现在我们大家的Xcode的版本大多数是高于4.2版本的,所以现在我们为了学习ARC机制,我们把新建的项目要关掉ARC。虽然在新版Xcode引入了ARC,但是很多时候它并不能完全解决你的问题。在Xcode中关闭ARC:项目属性—Build
Settings--搜索“garbage”找到Objective-C Automatic Reference Counting设置为No即可。

我就简要介绍一下MRC ;

1. 一个类或者对象调用了 alloc ,retain,copy ,new方法之后 retainCount值会加1,必须调用一次release方法,对retainCount值减1。

2. 必须知道 谁创建,谁释放 的最基本原则。

3.如果retainCount的值为0时,系统会调用dealloc方法来销毁该对象。而我们可以重写该方法来释放我们在该对象中产生的一些对象,而且注意要调用父类的dealloc方法。

4.记得在释放了一个指针指向的对象之后,切记要对该指针赋值为nil,不然会出现野指针错误, 报错是
Thread 1:EXC_BAD_ACCESS(code=EXC_I386_GPFLT),而且需要注意的是在Object-C中给空对象发送消息是不会引发错误的。

属性修饰词



属性的修饰词有三类,也就是说我们要在写三个修饰词在括号中,如果不写的话系统会使用默认值,也就是(atomic,readwrite,assign) ;

如果我们在程序中涉及到多线程访问一个属性时,我们还是采用原子性吧。但是如果没有最好用非原子性,这样效率要高一点。

自动释放池的使用


1.autorelease的基本使用


1. 对象在创建时调用了autorelease方法后,会被添加到自动释放池中去;

2. 当自动释放池被销毁时,在对象释放池中的对象就会调用release方法;

3. 创建的时候并不会改变对象的引用计数器,而且返回的是该对象本身。

2.autorelease的优点

因为对象是在自动释放池被销毁的时候才被销毁,所以我们不用关心什么时候调用release方法,也就不用关心什么时候晓辉对象。

3.autorelease使用的注意事项

1.占用内存较大的对象不要调用autorelease方法,因为大内存后释放的 原则会使内存迟迟不能得到释放;

2.较小内存的对象可以使用

4.自动释放池是堆栈式的存储(先进后出原则)

5.常见错误

再一次调用release方法导致野指针错误;

调用两次autorelease方法导致出错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: