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方法导致出错。
我们都知道在程序面向对象的语言中,对象都是存储在堆内存中,一些临时的基本数据类型的变量是存储在栈中。然而我们在编程时堆的大小是一定的,所以我们在写程序时不得不考虑内存的管理,这样才能让程序更高效地运行。
在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方法导致出错。
相关文章推荐
- iOS(Objective-C语法)面试、笔试题目
- 线程函数的设计以及MsgWaitForMultipleObjects函数的使用要点
- iOS中Objective-C与JavaScript之间相互调用的实现(实现了与Android相同的机制)
- [Objective-C] 004_继承封装与多态
- Java基础 面向对象(3) 多态 Object类-equals() toString()
- JS性能方面--内存管理及ECMAScript5 Object的新属性方法
- C# 中object sender与EventArgs e
- Objective-C 测试框架 GHUnit 的使用
- objective c内存管理
- ?Object-C获取手机设备信息
- Swift 与 Object-C 交互 (Swift版本为:1.2)
- iOS开发(Objective-C)常用库索引
- objective-c第十六章练习题
- var object dynamic的区别
- Object sharing for Runnable vs. extends Thread
- Objective-C的内省(Introspection)机制
- Objective-C Autorelease Pool 的实现原理
- 说说MFC中CRuntimeClass和CObject之间的那点事
- 关于OC中消息转发机制的理解以及在项目中的实际应用
- Objective-C Runtime Programming Guide