版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
内存管理范围:任何继承了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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2022幼儿园元旦活动总结范文5篇
- 2022年建筑施工工作总结三篇
- 豫满全球电商培训
- 石河子大学《足球》2022-2023学年第一学期期末试卷
- 石河子大学《食品工艺学实验》2022-2023学年第一学期期末试卷
- 石河子大学《心理测量学》2022-2023学年第一学期期末试卷
- 石河子大学《家畜环境卫生学》2023-2024学年第一学期期末试卷
- 石河子大学《法律文书》2023-2024学年期末试卷
- 沈阳理工大学《商务俄语翻译》2023-2024学年第一学期期末试卷
- 沈阳理工大学《建筑设计》2021-2022学年第一学期期末试卷
- 国开(内蒙古)2024年《创新创业教育基础》形考任务1-3终考任务答案
- 文旅深度融合绩效评估与反馈机制
- 手工木工(技师)技能认定理论考试题库大全-上(单选题)
- 2024-2030年国内水产饲料行业市场发展分析及竞争格局与发展策略研究报告
- 沪科版七年级上册数学期中考试试卷附答案
- 2023年中国铁路国际有限公司招聘笔试真题
- 《护理管理学》期末考试复习题库(含答案)
- 学习通尊重学术道德遵守学术规范课后习题答案
- 桩基检测规范
- 专项素养综合全练(八) 跨学科专题教学设计2024-2025学年北师大版物理八年级上册
- 2024年大学生村官考试题及参考答案
评论
0/150
提交评论