`
最初永远
  • 浏览: 6179 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

Objective-C内存管理

阅读更多

 

1.对象的生命周期包括诞生(通过alloc或new方法实现)、生存(接收消息和执行操作)、交友(借助方法的组合和参数)以  及当它们的生命结束时最终死去(被释放),当对象的生命周期结束时,它们的原材料(内存)将被回收以供新的对象使用。

 

2.引用计数:

当使用alloc、new方法或者通过copy消息(生成接收对象的一个副本)创建一个对象时,对象的保留计数器值被设置为1;

要增加对象的保留计数器值,可以给对象发送一条retain消息,

要减少对象的保留计数器值,可以发一条release消息。

当一个对象的保留计数器归0时自动向对象发送一条dealloc消息。dealloc是自动调用的,切记手动调用,此方法可以重写。

//返回一个id类型的值,可以增加保留计数器的同时并要求对象完成某种操作,
- (id) retain

 例如

[[car retain]setTire:tire atIndex:2]

- (void) release;

-(unsigned) retainCount;
 

 3.对象所有权

如果一个对象具有指向其他对象的实例变量,称该对象拥有这些对象,并意味着要负责确保对其拥有的对象进行清理。

 

Car类中engine setter方法

-(void) setEngine: (Engine *) newEngine;

main函数中调用该方法

Engine *engine = [Engine new];

[Car setEngine: engine];

 

main函数和car类同时拥有engine对象,car类正在使用engine对象,所以不能是main函数释放对象

main函数随后可能用到engine对象,所以也不可能是car类。

 

解决办法是让car类保留engine对象,将engine对象的保留计数器增加到2,

car类应该在setEngine方法中保留engine对象,而main函数运行结束时释放engine对象,当car类完成其任务时再释放engine对象(在其dealloc方法中),最后engine对象占用的资源被回收。

 

4.访问方法中的保留和释放

- (void) setEngine: (Enigne *) newEngine{
		[newEngine retain];
		[engine release];
		engine = newEngine;
}//setEngine
 

 如果首先保留新的newEngine,而newEngine与engine是同一个对象,保留计数器值将先增加然后立即减少,

但是不会归0,engine对象意外的未被销毁,从而导致错误。

在访问方法中如果先保留对象,然后再释放旧对象,则不会出问题。

 

 

5.自动释放

NSObject类提供了一个autoRelease方法:

- (id) autoRelease;

该方法预先设定了一条在将来某个时间发送的release消息,其返回值是接收消息的对象。当给一个对象发送autoRelease消息时实际上是该将该对象

添加到NSAutoreleasePool中,当自动释放池被销毁时会向该池中的所有对象发送release消息。

可按如下格式编写方法

- (NSString *)description{
		NSString *desc;
		desc = [[NSString alloc] initWithFormat: @"I am %d years old",4];

		return [desc autoRelease];
}
 

可以如下调用

NSLog(@"%@",[somoObject description]);
 

 6.自动释放池工作过程

int main(int argc, const char *argv[]){
		NSAutoreleasePool *pool;
		pool = [[NSAutoreleasePool alloc] init];

		RetainTracker *tracker;
		tracker = [RetainTracker new];//count 1

		[tracker retain];//count 2
		[tracker autorelease];//count still 2
		[tracker release];//count 1

		NSLog(@"releaseing pool");
		[pool release];

		return (0);	
}//main
 

7.内存管理规则

如果使用new,alloc或copy操作获得一个对象,则该对象的保留计数器值加1,release减1

如果通过任何其他方法获得一个对象,则假设该对象的保留计数器值为1,而且已经被设置为自动释放

如果保留了某个对象,则必须保持retain方法和release方法使用的次数相同

 

 

8.拥有对象

如果在多个代码行中一直拥有某个对象,常见的方法是在其他对象的实例变量中使用这些对象,将他们加入到诸如NSArray或NSDictionary等集合中,或者将其作为全局变量使用。

如果使用new alloc或copy方法获得一个对象,则不需要执行任何其他操作,该对象的保留计数器值为1,因此它一直被保留,只是一定要在拥有该对象的dealloc方法中释放该对象。

- (void) doStuff{
	//flonArray is an instance variable
	flonArray = [NSMutableArray new];
}//doStuff

- (void) dealloc{
	[flonArray release];
	[super dealloc];
}//dealloc
 

 使用其他的方法产生对象需要将计数器增加.

- (void) doStuff{
		//flonArray is an instance variable
		flonArray = [NSMutableArray arrayWithCapacity: 17];//count 1 ,autoreleased
		[flonArray retain];//count 2,1 autorelease
	}//doStuff

	- (void) dealloc{
		[flonArray release];//count 0
		[super dealloc];
	}//dealloc
 

9.清理自动释放池

  int i;
	       for(i=0; i<10000; i++){
		     id object = [someObject objectAtIndex: i];
		     NSString *desc = [object description];
		     //and do somethine with the description
	       }
 

 在上面程序中会产生很多个闲置的字符串,直到自动释放池被销毁才能最终得到释放,解决这类问题的方法是在循环中创建自己的自动释放池。

NSAutoreleasePool *pool;
	pool = [[NSAutoreleasePool alloc] init];
	int i;
	for(i=0;i<10000; i++){
		id object = [someObject objectAtIndex: i];
		NSString *desc = [object description];
		//and do somethine with the description
		if(i %1000 == 0){
			[pool release];
			pool = [[NSAutoreleasePool alloc] init]
		}
}
 

 自动释放池以栈的形式实现:当你创建一个新的自动释放池时,它将被添加到栈顶。接收autoreales消息的对象将被放入最顶端的自动释放池中。

 

10.注意:如果开发Iphone软件,则不能使用垃圾回收,实际上,在编写iphone程序时,苹果公司建议不要在代码中使用autorelease方法,同时还要避免使用创建自动释放对象的便利函数.

0
0
分享到:
评论

相关推荐

    objective-c内存管理

    Objective-C的内存管理机制与.NET和Java等语言中常见的自动垃圾回收机制不同,它更接近于C语言的手动管理方式,但在此基础上加入了一些自动化手段,使得开发人员能够在一定程度上简化内存管理的工作。 ##### 1. ...

    Objective-C内存管理课件.pdf

    Objective-C内存管理是iOS开发中非常重要的一部分。在早期的Objective-C中,内存管理是通过引用计数(Reference Counting)的方式进行的,开发者需要手动对对象的引用进行管理。内存管理的基本原则可以概括为“谁...

    《深入浅出发Objective-C》 内存管理.pdf

    Objective-C的内存管理是一种重要的编程技能,它对于创建出色的应用程序至关重要。在深入探讨Objective-C内存管理之前,让我们以日常生活中的比喻来形象说明内存管理的过程:当我们在家中自己做饭时,需要亲自处理...

    Objective-C高级编程 iOS与OS X多线程和内存管理_Objective-C_ios_

    《Objective-C高级编程:iOS与OS X多线程和内存管理》是一本深入探讨Apple平台开发中的关键技术的书籍。本书主要围绕Objective-C语言在iOS和OS X操作系统上的应用,特别是针对多线程和内存管理这两个核心主题进行...

    Objective-C基础教程(入门教程).pdf

    综上所述,本教程覆盖了Objective-C编程语言的基础知识点,不仅包括语法和结构,还包括与C语言的兼容性、内存管理机制、面向对象编程的核心概念、以及如何在不同操作系统平台上进行开发的介绍。通过这些内容的学习,...

    iPhoneMac_Objective-C内存管理教程和原理剖析.pdf

    ### Objective-C内存管理教程和原理剖析 #### 一、前言 Objective-C 是一种面向对象的编程语言,广泛应用于苹果的 macOS 和 iOS 开发中。由于 Objective-C 的内存管理机制与现代高级语言如 Java 或 .Net 的自动垃圾...

    objective-c 内存管理Demo

    在Objective-C中,内存管理主要依赖于引用计数(Reference Counting)机制,后来在iOS 5.0引入的ARC(Automatic Reference Counting)自动管理了大部分内存操作。以下是对`alloc`, `init`, `release`这三个关键字的...

    Objective-c语言学习-快速入门完整版完整版

    "第八讲 内存管理"是Objective-C开发中非常重要的一个环节,讲解了自动引用计数(ARC)和手动内存管理(MRC)的原理,以及如何避免内存泄漏。 最后,"第九讲 Foundation框架"介绍了苹果的基础框架,它提供了一系列...

    Objective-C编程全解最新版.pdf.zip

    7. **ARC(Automatic Reference Counting)**:ARC是Objective-C中的内存管理机制,自动处理对象引用计数,避免了内存泄漏和过早释放的问题。 8. ** Blocks **:Objective-C引入了Blocks,这是一种内联函数或闭包,...

    C语言主要知识点巩固(学习Objective-C 的前提)

    了解了C语言的基本语法后,还需关注内存管理,包括堆栈与堆的区别,以及如何正确地分配和释放内存以防止内存泄漏。 最后,良好的编程习惯和错误处理也是C语言学习中的重要环节。学会使用printf调试,理解并正确使用...

    Objective-C与Objective-C++的混用代码示例

    - **内存管理**:Objective-C使用ARC(Automatic Reference Counting),而C++使用自己的内存管理规则。在混用时要特别注意内存泄漏问题。 - **命名冲突**:C++的命名空间和Objective-C的类别可能会引起命名冲突,...

    Objective-C内存管理课件.doc

    内存管理是编程中至关重要的部分,Objective-C 在内存管理方面采用了引用计数(Reference Counting)策略,直到iOS 5.0后引入了ARC(Automatic Reference Counting),但这并不改变对旧版内存管理机制的理解。...

    Objective-C经典面试题

    此外,面试题还要求写出NSString类的实现方法,考察应聘者对Objective-C语言中字符串处理的掌握程度,包括内存管理、字符串编码转换等方面的知识。 总的来说,本次整理的“Objective-C经典面试题”涉及的知识点十分...

    Objective-C程序设计 第6版 pdf

    5. **内存管理**:Objective-C使用引用计数进行内存管理,书中会详细解释如何正确地持有和释放对象,以避免内存泄漏。 6. **NSObjects和协议**:Objective-C中的NSObject类是所有其他类的基类,书中会讲解它的方法...

    Objective-C 内存管理机制 - iOS知识库1

    Objective-C 是 iOS 开发中的主要编程语言,其内存管理机制对于优化应用性能和防止内存泄漏至关重要。内存管理主要关注如何有效地分配和释放内存,确保程序的稳定运行。 1. **值类型与引用类型:** - **值类型**...

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

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

    《Objective-C基础教程》中文版(含源代码)

    4. **Foundation框架**:介绍Objective-C开发中最常用的Foundation框架,包括字符串处理、集合类(NSArray, NSDictionary等)、内存管理等基础工具的使用。 5. **Cocoa Touch**:对于iOS开发,会讲解Cocoa Touch...

    Objective-C的语法与Cocoa框架.pdf

    Objective-C语法的基石是C语言的语法结构,这意味着所有的C语言代码都可以在Objective-C中直接使用。但是,Objective-C在C的基础上新增了消息传递机制,这是它与C语言的一个重要区别。在Objective-C中,方法调用是...

    Objective-C2.0程序设计第二版中文版及代码

    2. **内存管理**:Objective-C 2.0引入了自动引用计数(ARC),大大简化了内存管理。开发者不再需要手动调用`retain`、`release`和`autorelease`,而是由编译器自动处理。 3. **分类与协议**:Objective-C允许对已...

    iPhone Mac Objective-C内存管理教程和原理剖析

    //...} // obj1 会被自动释放,因为它是自动释放池内的对象```了解了这些基本概念后,你就能更好地理解 Objective-C 的内存管理机制,避免内存泄漏和意外崩溃。实践中,掌握好这些原则并结合 Xcode 的内存分析工具...

Global site tag (gtag.js) - Google Analytics