`
javasogo
  • 浏览: 1835429 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

iPhone/Mac Objective-C内存管理教程和原理剖析(二)口诀与范式

 
阅读更多

版权声明

此文版权归作者Vince Yuan (vince.yuan#gmail.com)所有。欢迎非营利性转载,转载时必须包含原始链接http://vinceyuan.cnblogs.com,且必须包含此版权声明的完整内容。

版本1.1发表于2010-03-08

口诀与范式

1口诀。

1.1谁创建,谁释放(类似于“谁污染,谁治理”)。如果你通过allocnewcopy来创建一个对象,那么你必须调用releaseautorelease。换句话说,不是你创建的,就不用你去释放。
例如,你在一个函数中alloc生成了一个对象,且这个对象只在这个函数中被使用,那么你必须在这个函数中调用releaseautorelease。如果你在一个class的某个方法中alloc一个成员对象,且没有调用autorelease,那么你需要在这个类的dealloc方法中调用release;如果调用了autorelease,那么在dealloc方法中什么都不需要做。

1.2除了allocnewcopy之外的方法创建的对象都被声明了autorelease

1.3retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release。有时候你的代码中明明没有retain,可是系统会在默认实现中加入retain。不知道为什么苹果公司的文档没有强调这个非常重要的一点,请参考范式2.7和第三章。

2范式。
范式就是模板,就是依葫芦画瓢。由于不同人有不同的理解和习惯,我总结的范式不一定适合所有人,但我能保证照着这样做不会出问题。

2.1创建一个对象。

ClassA *obj1 = [[ClassA alloc] init];

2.2创建一个autorelease的对象。

ClassA *obj1 = [[[ClassA alloc] init] autorelease];

2.3Release一个对象后,立即把指针清空。(顺便说一句,release一个空指针是合法的,但不会发生任何事情)

[obj1 release];

obj1 = nil;

2.4指针赋值给另一个指针。

ClassA *obj2 = obj1;

[obj2 retain];

//do something

[obj2 release];

obj2 = nil;

2.5在一个函数中创建并返回对象,需要把这个对象设置为autorelease

ClassA *Func1()

{

ClassA *obj = [[[ClassA alloc]init]autorelease];

return obj;

}

2.6在子类的dealloc方法中调用基类的dealloc方法

-(void) dealloc

{

[super dealloc];

}

2.7在一个class中创建和使用property

2.7.1声明一个成员变量。

ClassB *objB;

2.7.2声明property,加上retain参数。

@property (retain) ClassB* objB;

2.7.3定义property。(property的默认实现请看第三章)

@synthesize objB;

2.7.4除了dealloc方法以外,始终用.操作符的方式来调用property

self.objB或者objA.objB

2.7.5dealloc方法中release这个成员变量。

[objB release];

示例代码如下(详细代码请参考附件中的memman-property.m,你需要特别留意对象是在何时被销毁的。):

@interface ClassA : NSObject

{

ClassB* objB;

}

@property (retain) ClassB* objB;

@end

@implementation ClassA

@synthesize objB;

-(void) dealloc

{

[objB release];

[super dealloc];

}

@end

2.7.6给这个property赋值时,有手动releaseautorelease两种方式。

void funcNoAutorelease()

{

ClassB *objB1 = [[ClassB alloc]init];

ClassA *objA = [[ClassA alloc]init];

objA.objB = objB1;

[objB1 release];

[objA release];

}

void funcAutorelease()

{

ClassB *objB1 = [[[ClassB alloc]init] autorelease];

ClassA *objA = [[[ClassA alloc]init] autorelease];

objA.objB = objB1;

}

示例代码文件链接:http://files.cnblogs.com/VinceYuan/objective-c-memman.zip

分享到:
评论

相关推荐

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

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

    Objective-C基础教程.pdf(Learn Objective-C on the Mac中文版)Part002

    Objective-C基础教程.pdf(Learn Objective-C on the Mac中文版) 中文扫描版 + 英文电子书 + 源码 该资源在Mac下用BetterZIP压缩,共三个分卷,其他分卷在我的资源中找。 更新: Windows下使用7zip对part1解压...

    windows 下搭建 Objective-C 开发环境

    尽管Objective-C主要与Apple的平台(如iOS和macOS)相关联,但有时候,出于某些原因(比如团队协作或个人偏好),开发者可能需要在非Apple的操作系统(如Windows)上构建Objective-C应用程序。本文将详细介绍如何在...

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

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

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

     Objective-C是创建Mac OS应用和iPhone应用的主要语言,优雅的面向对象编程环境与C语言特性珠联璧合,造就了它的不俗表现。  本书全面而系统地讲述Objective-C语言的基础知识和面向对象编程的重要概念,结合实例...

    Objective-C基础教程 中文 PDF 清晰版 [31M]

    中文名: Objective-C基础教程 作者: Mark Dalrymple Scott Knaster译者: 高朝勤 杨越 刘霞图书 分类: 软件 资源格式: PDF 版本: 扫描版 出版社: 人民邮电出版社 书号: ISBN: 9787115208774 发行时间: 2009...

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

    本书结合理论知识与示例程序,全面而系统地讲述Objective-C编程的相关内容,包括Objective-C在C的基础上引入的特性和Cocoa工具包的功能及其中的框架,以及继承、复合、源文件组织等众多重要的面向对象编程技术。...

    学习Objective-C: 入门教程

    Objective-C是一种面向对象的编程语言,由ANSI C语言扩展而来,主要用于苹果公司的Mac OS X和iOS操作系统上应用程序的开发。它结合了C语言的高效性与Smalltalk语言的对象导向特性,使开发者能够构建复杂且功能丰富的...

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

    《Objective-C高级编程:iOS与OS X多线程和内存管理》是一本深入探讨Objective-C在iOS和OS X平台上的核心特性的书籍。本书重点聚焦于多线程和内存管理两个关键领域,对于iOS和macOS应用开发人员来说,这是理解和优化...

    Objective-C基础教程随书源码

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

    Objective-C基础教程

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

    Objective-C基础教程.pdf(Learn Objective-C on the Mac中文版)Part001

    Objective-C基础教程.pdf(Learn Objective-C on the Mac中文版) 中文扫描版 + 英文电子书 + 源码 该资源在Mac下用BetterZIP压缩,共三个分卷,其他分卷在我的资源中找。 更新: Windows下使用7zip对part1解压...

    iPhone开发:Objective-C语法入门.pdf

    ### iPhone开发:Objective-C语法入门 #### 一、Objective-C简介 Objective-C是一种面向对象的编程语言,它是在C语言的基础上扩展而成的。Objective-C主要应用于苹果公司的操作系统上,包括macOS、iOS、watchOS以及...

    Objective-C基础教程.pdf(Learn Objective-C on the Mac中文版)Part003

    Objective-C基础教程.pdf(Learn Objective-C on the Mac中文版) 中文扫描版 + 英文电子书 + 源码 该资源在Mac下用BetterZIP压缩,共三个分卷,其他分卷在我的资源中找。 更新: Windows下使用7zip对part1解压...

    Objective-C基础教程源码

    《Objective-C基础教程(第2版)》结合理论知识与示例程序,全面而系统地介绍了Objective-C编程的相关内容,包括Objective-C在C的基础上引入的特性、Cocoa工具包的功能及框架,以及继承、复合、源文件组织等众多重要的...

    iPhone游戏编程 Objective-c 教程

    ### iPhone游戏编程Objective-C教程知识点解析 #### 一、Objective-C简介及在iPhone游戏开发中的应用 Objective-C是一种面向对象的编程语言,它基于C语言并添加了面向对象的特性。Objective-C是苹果公司用于iOS和...

    objective-c语言教程

    - **内存管理**:介绍了Objective-C中的内存管理机制,包括引用计数和垃圾回收(如果适用)的概念。 - **对象与类**:详细讲解了对象、类以及它们之间的消息传递机制。 - **对象基础**:定义了对象的基本概念及其在...

    Objective-C程序设计

    读者在阅读《objective-c程序设计》后,可以掌握objective-c语言的基本内容,并进行实际的iphone/ipad和mac应用开发。《objective-c程序设计》共分成11章。前6章讲述objective-c语言,包括数据类型、运算符、表达式...

Global site tag (gtag.js) - Google Analytics