`

objective-c内存管理基础

    博客分类:
  • IOS
 
阅读更多

手动的进行内存管理

    Cocoa和Objective-C的类都是NSObject的子类。NSObject中有几个方法进行内存管理。alloc方法为对象分配一片内存空间。dealloc方法用于释放对象的空间。但是在我们的代码中将永远都不会使用dealloc方法,因为运行时会为你调用此方法释放内存空间。而你需要做的只是引用计数,稍后介绍什么是引用计数。

    除了alloc和dealloc,NSObject的还有retain和release方法两个方法用于引用计数。retain方法给retainCount变量加1,release方法给retainCount变量减1。当使用alloc为对象分配一片内存空间的时候,retainCount会为1。在这个对象的生命周期内,这个对象可能继续被其它变量引用。但有新的变量指向这个对象的时候,你应该调用retain方法,这样运行时才会知道有新的引用指向了这个变量,在这个对象生存期中拥有它的使用权。这个被Objective-C开发人员称之为“拥有”。例如:

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。

    当对象的retainCount的计数大于或者等于1的时候,运行时会继续维持这个对象。当对象的retainCount为0的时候,运行时会释放这个对象,并回收它占得内存空间。

    下图展示了一个Foo对象的生命周期。Foo对象首先在内存中分配一个内存空间,并且被myFooOne引用。在这个时候Foo对象的retaincount为1。

Foo * myFooOne = [[Foo alloc] init];

   第二个引用变量指向Foo对象,这个引用变量接着调用retain方法,其实也是调用Foo对象的retain方法。Foo对象的retaincount变成2。

Foo * myFooTwo = myFooOne;
[myFooTwo retain];

   接着当myFooOne引用不需要的时候,通过调用release方法,解除与Foo对象的拥有权,Foo对象的retaincount变成1。

[myFooOne release];

    但myFooTwo不在需要的时候,同样通过调用release方法,解除与Foo对象的拥有权,Foo对象的retaincount变成0。

   内存泄露

    我们经常会在一个方法中声明对象,看下面这个例子:

-(void) myMethod {
//incorrect method
NSString * myString = [[NSString alloc] init]; //retainCount = 1
Foo * myFoo = [[Foo alloc] initWithName:myString]; //retainCount = 1
NSLog(@"Foo's Name:%@", [myFoo getName]);
}

    这上面这个方法中,我们为myString 和myFoo分配了内存空间。方法执行结束之后,两个变量超出了作用域的范围,所以不再有效。但是这个方法并没有releases这两个对象。所以运行时没有释放这两个变量占据的内存空间。除非你的应用程序结束,否则这两个变量占据的内存空间一直都是不可用的。我们把它称之为内存泄露。

    为了防止内存泄露。无论什么时候,我们创建一个对象,或者创建一个对象的拷贝,我们都必须通过release方法释放。

-(void) myMethod {
NSString 
* myString = [[NSString alloc] init]; //retainCount=1
Foo * myFoo = [[Foo alloc] initWithName:myString]; //retainCount=1
NSLog("Foo's Name:%@", [myFoo getName]);
[myFoo release]; 
//retainCount=0 so deallocate
[myString release]; //retainCount=0 so deallocate
}

  弱引用

   看下面的例子:

-(void) myMethod {
//an incorrect method
Foo * myFooOne = [[Foo alloc] initWithName:@"James"]; //retainCount=1
Foo * myFooTwo = myFooOne; //retainCount still 1
[myFooOne release]; //retaincount=0 so deallocated
NSLog("Name:%@", [myFooTwo printOutName]); //runtime error
}

nyFooTwo指向了Foo对象,但是没有调用retain方法,就是一种弱引用,上面的代码会在运行时报错。因为myFooOne调用release方法。retaincount变成0,运行时,回收了对象的内存空间。然后myFooTwo调用printPutName自然就报错了,见下图说明。

总结:本文简单的介绍了一下手动的进行内存管理、内存泄露、弱引用等objective-c的知识。

分享到:
评论

相关推荐

    Objective-C程序设计

    第7章到第10章讲述objective-c的基础框架,以及文件操作、内存管理、数据保存等内容。第11章讲述了应用工具框架。第12、13章分别讲述了如何开发iphone/ipad应用程序。第14章讲述了objective-c++和访问mysql数据库的...

    Objective-C基础教程+随书源代码

     本书全面而系统地讲述Objective-C语言的基础知识和面向对象编程的重要概念,结合实例介绍了Cocoa工具包的优秀特性和其中的框架,以及继承、复合、源文件组织、内存管理、对象初始化和类别创建等众多重要的面向对象...

    Objective-C程序设计(第4版)(全球最畅销Objective-C编程书籍)

     《Objective-C 程序设计(第4版)》已经为iOS 5和Xcode4.2中的重大变更做了全面更新,最大的改动是引入了自动引用计数(ARC),并详细说明了如何在Objective-C编程过程中使用ARC提升和简化内存管理。

    Objective-C基础教程

    《Objective-C基础教程》全面而系统地讲述Objective-C语言的基础知识和面向对象编程的重要概念,结合实例介绍了Cocoa工具包的优秀特性和其中的框架,以及继承、复合、源文件组织、内存管理、对象初始化和类别创建等...

    Objective-C基础教程随书源码

    《Objective-C基础教程》全面而系统地讲述Objective-C语言的基础知识和面向对象编程的重要概念,结合实例介绍了Cocoa工具包的优秀特性和其中的框架,以及继承、复合、源文件组织、内存管理、对象初始化和类别创建等...

    《Objective-C2.0程序设计(原书第2版)》_中文完整版

    全书共分为四大部分:第一部分全面讲解了Objective-C语言的基础知识,包括类、对象、方法、数据类型、表达式、程序结构、继承、多态、动态类型和动态绑定、函数、数组、结构和指针等;第二部分详细阐述了Foundation...

    Objective-C 2.0程序设计

    书共分为四大部分:第一部分全面讲解了Objective-C语言的基础知识,包括类、对象、方法、数据 类型、表达式、程序结构、继承、多态、动态类型和动态绑定、函数、数组、结构和指针等;第二 部分详细阐述了Foundation...

    《Objective-C 2.0程序设计(原书第2版)》[PDF]

    全书共分为四大部分:第一部分全面讲解了objective-c语言的基础知识,包括类、对象、方法、数据类型、表达式、程序结构、继承、多态、动态类型和动态绑定、函数、数组、结构和指针等;第二部分详细阐述了foundation...

    Objective-C基础教程清晰版pdf和随书源码.zip

    清晰的Objective-C基础教程和随书源码,本书全面而系统地讲述Objective-C语言的基础知识和面向对象编程的重要概念,结合实例介绍了Cocoa工具包的优秀特性和其中的框架,以及继承、复合、源文件组织、内存管理、对象...

    Objective-C基础教程(第2版)

    本书三位作者是顶级苹果专家,书中以苹果最新的Xcode 4.x工具为基础,详细讲述了Objective–C的全部基础知识,涵盖了块、GCD、ARC、类扩展、继承、组合、对象初始化、分类、协议、内存管理和组织源文件等新主题,...

    Programming in Objective-C, 4th Edition

    全书共分为四大部分:第一部分全面讲解了Objective-C语言的基础知识,包括类、对象、方法、数据类型、表达式、程序结构、继承、多态、动态类型和动态绑定、函数、数组、结构和指针等;第二部分详细阐述了Foundation...

    [Objective-c程序设计].杨正洪等.扫描版

    第7章到第10章讲述Objective-C的基础框架,以及文件操作、内存管理、数据保存等内容。第11章讲述了应用工具框架。第12、13章分别讲述了如何开发iPhone/iPad应用程序。第14章讲述了Objective-C++和访问Mysql数据库的...

    objective-c基础教程(第2版)

    本书全面系统地讲述了objective-c的基础知识和面向对象编程的重要概念,结合实例介绍了cocoa工具包的优秀特性和框架,以及继承、复合、对象初始化、类别、协议、内存管理和源文件组织等重要编程技术

    Objective-C 程序设计(第4版)

    这是一本Objective-C编程领域最畅销的书籍,...本书已经为iOS5HE Xcode4.2中的重大变更做了全面更新,最大的改动是引入了自动引用计数(ARC),并详细说明了如何在Objective-C编程过程中使用ARC提升和简化内存管理。

    Objective-C Programming The Big Nerd Ra - Hillegass, Aaron

    接着对Objective-C和Foundation做了简单明了的介绍,其中包括Objective-C的语法知识,Foundation的常用类,还有内存管理、常用的设计模式等知识。在读者具备了一定的Objective-C知识后,作者用了两章的篇幅,...

Global site tag (gtag.js) - Google Analytics