下载此文档

Objective-C内存管理课件.docx


文档分类:IT计算机 | 页数:约9页 举报非法文档有奖
1/9
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/9 下载此文档
文档列表 文档介绍
Objective-C的内存管理机制琢磨不透初学objectice-C的朋友都有一个困惑,总觉得对objective-C的内存管理机制琢磨不透,程序经常内存泄漏或莫名其妙的崩溃。Objective-,包括属性和垃圾回收。那么,我们在学****Objective-,最好应该先了解,从前是什么样的,为什么Objective-。这一切都跟Cocoa内存的管理规则有关系,我们知道,Objective-C中所有变量都定义为指针。指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址,如果使用不当,就会出错或者造成内存的泄露。要了解这些,就需要看看其内存管理的规则到底是什么样的。Cocoa和Objective-C的类都是NSObject的子类。NSObject中有几个方法进行内存管理。alloc方法为对象分配一片内存空间。dealloc方法用于释放对象的空间。但是在我们的代码中将永远都不会使用dealloc方法(类似C++中的析构函数),因为运行时会为你调用此方法释放内存空间。而你需要做的只是引用计数。-C的对象在使用完成之后不会自动销毁,需要执行dealloc来释放空间(销毁),否则内存泄露。[obj1release];//release方法来自动调用对象的dealloc方法这带来了一个问题。下面代码中obj2是否需要调用dealloc?ClassA*obj1=[[ClassAalloc]init];ClassA*obj2=obj1;[obj1hello];//输出hello[obj1release];[obj2hello];//能够执行这一行和下一行吗?[obj2release];不能,因为obj1和obj2只是指针,它们指向同一个对象,[obj1dealloc]已经销毁这个对象了,不能再调用[obj2hello]和[obj2release]。obj2实际上是个无效指针。 Objective-C采用了引用计数(retaincount)。对象的内部保存一个数字,表示被引用的次数。例如,某个对象被两个指针所指向(引用)那么它的retaincount为2。需要销毁对象的时候,不直接调用dealloc,而是调用release。release会让retaincount减1,只有retaincount等于0,系统才会调用dealloc真正销毁这个对象。Foo * myFooOne = [[Foo alloc] init]; //retaincount 为1  Foo * myFooTwo = myFooOne; //myFooTwo 指向了这个对象  //retaincount 仍然为1  [myFooTwo retain]; //调用retain方法,运行时才知道myFooTwo指向了该对象,retaincount 为2 上面的代码中,myFooTwo通过调用retain方法,取得了Foo对象的拥有权。在这个对象的生命周期中,会有很多变量来指向和引用它。指向这个对象的变量也可以通过release方法来解除这种拥有权。release方法将会告诉运行时,我已经使用完这个变量了,已经不需要它了,retainCount计数减1。当对

Objective-C内存管理课件 来自淘豆网www.taodocs.com转载请标明出处.

非法内容举报中心
文档信息
  • 页数9
  • 收藏数0 收藏
  • 顶次数0
  • 上传人文库旗舰店
  • 文件大小40 KB
  • 时间2020-03-30