Objective C-内存管理.docx

上传人:李医生 文档编号:8915530 上传时间:2021-01-24 格式:DOCX 页数:24 大小:16.28MB
返回 下载 相关 举报
Objective C-内存管理.docx_第1页
第1页 / 共24页
Objective C-内存管理.docx_第2页
第2页 / 共24页
Objective C-内存管理.docx_第3页
第3页 / 共24页
Objective C-内存管理.docx_第4页
第4页 / 共24页
Objective C-内存管理.docx_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《Objective C-内存管理.docx》由会员分享,可在线阅读,更多相关《Objective C-内存管理.docx(24页珍藏版)》请在三一文库上搜索。

1、OC内存管理11年7月14日星期四ios需要开发者管理内存 很高高级语言都有垃圾回收机制,但ios开发却没有垃圾回收机制。 虽然ios没有垃圾回收机制,但是mac os有垃圾回收机制。 ios没有垃圾回收机制是因为它没有能力做垃圾回收吗? ios将内存管理的任务交给了开发者。11年7月14日星期四所有权机制(1) 在OC中,对象不断的被其它创建、使用和销毁 为了保证程序不产生额外的内存开销,当对象不再被需要以后,应当被立即销毁。 拥有对一个对象的使用权,我们称为是”拥有”这个对象。 对象的拥有者个数至少为1,对象才得以存在,否则它应当被立即销毁。11年7月14日星期四所有权机制(2) 为了确定

2、你(一个对象)何时具有对另外一个对象的所有权,以及明确对象所有者的权利和义务,Cocoa设立了一套标准。 只有当你对一个对象做了alloc,copy和retain等操作之后,你才拥有它的所有权。 当你不再需要这个对象的时候,你应该释放你对它的所有权。 千万不要对你没有所有权的对象进行释放。11年7月14日星期四引用计数 Cocoa中提供了一个机制来实现上面提到的这个逻辑模型,它被称为”引用计数”。 每个对象都有一个引用计数(retainCount),对象被创建的时候引用计数为1; 当引用计数值为0的时候,对象将被系统销毁。11年7月14日星期四引用计数Cocoa中提供了一个机制来实现上面提到的

3、这个逻辑模型,它被称为”引用计数”。 每个对象都有一个引用计数(retainCount),对象被创建的时候引用计数为1; 当引用计数值为0的时候,对象将被系统销毁。11年7月14日星期四dealloc方法 dealloc方法会在对象引用计数为0的时候被系统调用。 dealloc不要手动调用,而是让系统自动调用(对象引用计数为0时); 对象释放的时候需要把自己所包含的对象变量也一并释放掉。-(void) deallocname release;super dealloc; 在dealloc方法中对变量的释放顺序应与初始化的顺序相反,最后调用super dealloc;11年7月14日星期四内存管

4、理 alloc:为一个新对象分配内存,并且它的引用计数为1。调用alloc方法,你便有对新对象的所有权。 copy:制造一个对象的副本,改副本的引用计数为1,调用者具有对副本的所有权。 retain:使对象的引用计数加1,并且获得对象的所有权。 release:使对象的引用计数减1,并且放弃对象的所有权。 autorelease:也能使对象的引用计数减1,只不过是在未来的某个时间使对象的引用计数减1。11年7月14日星期四示例1 使用alloc创建对象,则需要在使用完毕后进行释放。 Person *person1 = Person alloc initWithName:”张三”; NSLog(

5、”name is %”,person1.name);/假设从这往后,我们一直都不使用person1了,应该把对象给释放了。person1 release;11年7月14日星期四示例2 Person *person2 = Person alloc initWithName:”李四”; NSString *name = person2.name; NSLog(”%”,name);/假设从这以后,我们也不使用person2了。person2 release; 我们不应该释放name,因为name是我们间接获得的,所以没有它的所有权,也不应该对它进行释放。11年7月14日星期四便利构造器的管理 有时我

6、们会通过便利构造器来获得一个新的对象,由便利构造器产生的对象不应当由使用者销毁,而是由便利构造器本身完成。 便利构造器通过在实现中调用autorelease来实现上述功能。11年7月14日星期四错误示例1 +(id) personWithName:(NSString *)aNamePerson *person = Person alloc initWithName:aName;return person; 它是错误的,因为它返回了新创建的对象以后,类就失去了释放这个对象的机会。11年7月14日星期四错误示例2 +(id) personWithName:(NSString *)aNamePers

7、on *person = Person alloc initWithName:aName;person release;return person; 它也是错误的,因为在返回对象的时候,对象已经被销毁,从而不能使用了。11年7月14日星期四正确示例 +(id) personWithName:(NSString *)aNamePerson *person = Person alloc initWithName:aName;person autorelease;return person; 它是正确的,因为对新对象的销毁延迟进行,从而使用者有时间去使用它,而不必对对象的释放负责。11年7月14日星

8、期四简单的使用示例 使用便利构造器创建对象,则使用完毕后不需要进行释放。 -(void) printHelloNSString *str = NSString stringWithFormat:”Hello”;NSLog(”%”,str);11年7月14日星期四设置器、访问器内存管理 以下是一个经典的把内存管理结合在设置器中的实现: 接口文件interface Person : NSObject NSString *name;11年7月14日星期四设置器的实现 在设置器中,保持对新传入对象的所有权,同时放弃旧对象的所有权。 -(void) setName:(NSString *) aName

9、if(name != aName)name release;name = aName retain;/or copy11年7月14日星期四访问器的实现 在访问器中,不需要retain或release. -(NSString *)namereturn name;11年7月14日星期四示例 用访问器获得的对象,使用完毕后不需要释放。 -(void) printNameNSString *name = person.name; NSLog(”%”,name);11年7月14日星期四内存管理的常见错误1 为使用设置器 -(void) resetNSString *newName = NSString

10、alloc initWithFormat:”theNew”;name = newName;newName release; 注意:name是实例变量11年7月14日星期四内存管理常见错误2 内存泄露 -(void) resetNSString *newName = NSString alloc initWithFormat:”theNew”;self setName:newName; 少了一次释放,导致内存泄露11年7月14日星期四内存管理常见错误3 释放了没有所有权的对象 -(void) resetNSString *newName = NSString stringWithFormat:”

11、theNew”;self setName:newName;newName release; 便利构造器已经为newName设置了autorelease,newName便没有权利和义务再去release,下次再来访问这个变量的时候一定会出现运行错误。11年7月14日星期四原则总结 凡是你通过retain、alloc、copy等手段获得了所有权的对象,都必须在你不再使用的时候,由你来调用release、autorelease等手段进行释放。 在一定的代码断内,对同一个对象所做的copy、retain和alloc的操作次数应当与release、autorelease的操作次数相等。 可以在类的dealloc方法中释放你占有的实例变量。 对于便利构造器和访问器来说,你没有通过上面的这些手段获得对象的所有权,因此在这些情况下你无需对获得的对象进行额外的释放操作。autorelease只是意味着延迟发送一条release消息。11年7月14日星期四作业 检查以前的作业有没有内存管理方面的问题,有的话给予改正。 SDK里面有一个Instrument工具,可以检测内存泄露,查阅资料学习一下(google或者进博看论坛)。11年7月14日星期四

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1