技术狗传智播客ios开发零基础教程源代码和-07-内存管理_第1页
技术狗传智播客ios开发零基础教程源代码和-07-内存管理_第2页
技术狗传智播客ios开发零基础教程源代码和-07-内存管理_第3页
技术狗传智播客ios开发零基础教程源代码和-07-内存管理_第4页
技术狗传智播客ios开发零基础教程源代码和-07-内存管理_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

内存管理范围:任何继承了NSObject的对象,对基本数据类型无效都保存了一个与之相关联的整数,称为、ew或者copy创建一个对象时,对象的原理:每个对象当使用被设置为1计数器计数器计数器值+1计数器值-1给对象发送一条retain消息,可以使给对象发送一条release消息,可以使当一个对象的

计数器值为0时,那么它将被销毁,其占用的内存被系统回收,系统也会自对象发送一条dealloc消息。一般会相关资源。一定不要直接调用重写dealloc方法,在这里dealloc方法可以给对象发送retainCount消息获得当前的

计数器值内存管理原则1.谁创建,谁(“谁污染,谁治理”)。如果你通过、ew或(mutable)copy来创建一个对象,那么你必须调用release或autorelease。换句话说,不是你创建的,就不用你去一般来说除了、ew或copy之外的方法创建的对象都被了autorelease3.谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用releaseStudent.h#import

<Foundation/Foundation.h>#import

"Book.h"@interfaceStudent@property

Book

*book;@endStudent.m#import

"Student.h"@implementation

Student@synthesize

book

=_book;(void)setBook:(Book

*)book{if

(book

!=

_book)

{[_bookrelease];_book

=

[book

retain];}}(void)dealloc

{[_book

release];[superdealloc];}@end@class通常 一个类有两种办法一种是通过#import方式引一种是通过@class引入两种方式的区别:1、#import方式会包含被 类的所有信息,包括被引用类的变量和方法;@class方式只是告诉编译器在A.h文件中

B*b

只是类的 ,具体这个类里有什么信息,这里不需要知道,等实现文件中真正要用到时,才会真正去查看B类中信息@class2、使用@class方式由于只需要知道被类(B类)的名称就可以了,而在实现类由于要用到被类中的实体变量和方法,所以在.m文件中需要使用#import来包含被 类的头文件3、如果有上百个头文件都#import了同一个文件,或者这些文件依次被#improt,那么一旦最开始的头文件稍有改动,后面到这个文件的所有类都需要重新编译一遍,这样的效率也是可想而知的,而相对来讲,使用@class方式就不会出现这种问题了@class4、对于循环依赖关系来说,比方A类

B类,同时B类也引用A类,B类的代码:当程序运行时,编译会报错。当使用@class在两个类相互 ,就不会出现编译报错。由上可知,@class是放在.h中的,只是在

一个类,将这个被

类作为一个类型,在.m实现文件中,如果需要

到被

类的实体变量或者方法时,还需要使用#import方式引入被

类。Student.h改进#import

<Foundation/Foundation.h>@class

Book;@interfaceStudent@property

(retain)

Book

*book;@endStudent.m改进#import

"Student.h"#import

"Book.h"@implementationStudent//@synthesize会自动展开setter和getter,隐藏了内存管理细节@synthesize

book

=

_book;-

(void)dealloc

{[_book

release];[super

dealloc];}@end自动 池(autorelease

pool)自动 池是OC里面的一种内存自动回收机制,一般可以将一些临时变量添加到自动 池中,

回收释放当自动

池销毁时,池里面的所有对象都会调用一次release方法autoreleaseOC对象只需要发送一条autorelease消息,就会把这个对象添加到最近的自动 池中(栈顶的 池)autorelease实际上只是把对release的调用延迟了,对于每一次autorelease,系统只是把该对象放入了当前的autorelease

pool中,当该pool被 时,该pool中的所有对象会被调用Release自动池的创建ios5.0后@autoreleasepool{//....}ios5.0前NSAutoreleasePool

*pool

=

[[NSAutoreleasePool

alloc]init];//

.....[poolrelease];//或[pool

drain];使用autorelease以前:Book*book=[[Book

alloc]init];[studentsetBook:book];[book

release];现在:Book

*book=

[[[Book

alloc]

init]autorelease];[studentsetBook:book];//不要再调用[book

release];使用autorelease返一般可以为类添加一个快速创建对象的静态方法+(id)book

{return

[[[Book

alloc]

init]

autorelease];}外界调用[Book

book]时,根本不用考虑在什么时候回的Book对象autorelease

pool疑问在项目中,main()中有一个默认的Autorelease

Pool,程序开始时创建,程序退出时销毁,按照对Autorelease的理解,岂不是Autorelease

Pool里的所有对象在程序退出时才release,这样跟内存有什么区别?对于每一个Runloop,系统会隐式创建一个Autoreleasepool,并且把创建好的pool放在栈顶,所有的pool会构成一个栈式结构。在每一个

Runloop结束时,当前栈顶的pool会被销毁,这样这个pool里的每个对象会执行release操作autorelease

pool注意1.

在ARC下,不能使用[[NSAutoreleasePool

alloc]init],而应当使用@autoreleasepool2.大量循环操作放到同一个NSAutoreleasePool之间,这样会造成内存峰值的上升机制,还是尽尽量避免对大内存使用该方法,对于这种延迟量少用sdk中一般利用静态方法创建并返回的对象都是已经autorelease的,不需要再进行release操作如[NSNumber

numberWithInt:10];返回的对象是不需要再release的。但是通过[[NSNumber

alloc]initWithInt:10]创建的对象需要release@property格式:@property(参数1,参数2)类型名字;参数可有可无,比如:@property

int

age;@property(nonatomic,retain)

UIButton*

btn;参数主要分为3类读写属性:readwrite/readonlysetter处理:assign/retain/copy原子性:atomic/nonatomic@property参数-atomic@property属性默认为atomic,提供多线程安全在多线程环境下,原子操作是必要的,否则有可能引起错误的结果加了atomic,setter/getter是一个原子操作。如果有多个线程同时调用setter的话,不会出现某一个线程执行

setter全部语句之前,另一个线程开始执行setter的情况,相当于函数头尾加了锁一样@property参数-nonatomic多线程,变量保护,提高性能atomic是OC使用的一种线程保护技术,防止在写入未完成的时候被另外一个线程 ,造成数据错误。而这种机制是耗费系统资源的,所以在 这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择如果不需要多线程支持的话,用nonatomic就够了,另外由于不涉及锁操作,所以它执行相对快点@property其他参数readwrite:产生setter\getterreadonly:只产生简单的getter,没有setter。assign:默认类型,setter方法直接赋值,而不进行retain操作retain:setter方法release旧值,再retain新值copy:setter方法release旧值,再copy新值循环分析下面一种情景:(假设都是retain

)对象A

了对象B,对象B

了对象C,对象C了对象B.计数分别是2和1.当A不再使用B,调用release这时候B和C的,因为C还对B的所了B,所以B的 计数为1,B不会被 。B不

,C的

计数就是1,C也不会被 。从此,B和C

留在内存中,B和C互相时,应该一端使用ratain,另一端为了打断上面这种循环使用assignARC(Automatic

Reference

Counting)ARC,就是由编译器代码中自动加入了retain/release。要注意的是,ARC并不是GC,它只是一种代码静态分析工具从iOS5/Mac

OS

X10.7开始导入,利用Xcode4.2可以使用该机制优点:不需要担心烦人的内存管理和内存代码的总量变少了代码效率高,由于使用编译器管理缺点:要记住新的ARC规则、关键字、特性计数,减少了低效代码的可能性使用一些旧代码、第

代码的时候比较麻烦,可能要修改编译开关,XCode

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论