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

iPhone/Mac Objective-C内存管理教程和原理剖析(四)系统自动创建新的autorelease pool

 
阅读更多

版权声明

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

版本1.1发表于2010-03-08

系统自动创建新的autorelease pool

在生成新的Run Loop的时候,系统会自动创建新的autorelease pool(非常感谢网友hhyyttneogui的提醒)。注意,此处不同于xcode在新建项目时自动生成的代码中加入的autorelease poolxcode生成的代码可以被删除,但系统自动创建的新的autorelease pool是无法删除的(对于无Garbage Collection的环境来说)。Objective-C没有给出实现代码,官方文档也没有说明,但我们可以通过小程序来证明。

在这个小程序中,我们先生成了一个autorelease pool,然后生成一个autoreleaseClassA的实例,再在一个新的run loop中生成一个autoreleaseClassB的对象(注意,我们并没有手动在新run loop中生成autorelease pool)。精简的示例代码如下,详细代码请见附件中的memman-run-loop-with-pool.m

int main(int argc, char**argv)

{

NSLog(@"create an autorelasePool/n");

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

NSLog(@"create an instance of ClassA and autorelease/n");

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

NSDate *now = [[NSDate alloc] init];

NSTimer *timer = [[NSTimer alloc] initWithFireDate:now

interval:0.0

target:obj1

selector:@selector(createClassB)

userInfo:nil

repeats:NO];

NSRunLoop *runLoop = [NSRunLoop currentRunLoop];

[runLoop addTimer:timer forMode:NSDefaultRunLoopMode];

[timer release];

[now release];

[runLoop run]; //在新loop中调用一函数,生成ClassBautorelease实例

NSLog(@"releasing autorelasePool/n");

[pool release];

NSLog(@"autorelasePool is released/n");

return 0;

}

输出如下:

create an autorelasePool

create an instance of ClassA and autorelease

create an instance of ClassB and autorelease

ClassB destroyed

releasing autorelasePool

ClassA destroyed

autorelasePool is released

注意在我们销毁autorelease pool之前,ClassBautorelease实例就已经被销毁了。

有人可能会说,这并不能说明新的run loop自动生成了一个新的autorelease pool,说不定还只是用了老的autorelease pool,只不过后来drain了一次而已。我们可以在main函数中不生成autorelease pool。精简的示例代码如下,详细代码请见附件中的memman-run-loop-without-pool.m

int main(int argc, char**argv)

{

NSLog(@"No autorelasePool created/n");

NSLog(@"create an instance of ClassA/n");

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

NSDate *now = [[NSDate alloc] init];

NSTimer *timer = [[NSTimer alloc] initWithFireDate:now

interval:0.0

target:obj1

selector:@selector(createClassB)

userInfo:nil

repeats:NO];

NSRunLoop *runLoop = [NSRunLoop currentRunLoop];

[runLoop addTimer:timer forMode:NSDefaultRunLoopMode];

[timer release];

[now release];

[runLoop run]; //在新loop中调用一函数,生成ClassBautorelease实例

NSLog(@"Manually release the instance of ClassA/n");

[obj1 release];

return 0;

}

输出如下:

No autorelasePool created

create an instance of ClassA

create an instance of ClassB and autorelease

ClassB destroyed

Manually release the instance of ClassA

ClassA destroyed

我们可以看出来,我们并没有创建任何autorelease pool,可是ClassB的实例依然被自动销毁了,这说明新的run loop自动创建了一个autorelease pool,这个pool在新的run loop结束的时候会销毁自己(并自动release所包含的对象)。

补充说明

在研究retain count的时候,我不建议用NSString。因为在下面的语句中,

NSString *str1 = @”constant string”;

str1retain count是个很大的数字。Objective-C对常量字符串做了特殊处理。

当然,如果你这样创建NSString,得到的retain count依然为1

NSString *str2 = [NSString stringWithFormat:@”123”];

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

分享到:
评论

相关推荐

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

    初学objectice-C的朋友都有一个困惑,总觉得对objective-C的内存管理机制琢磨不透,程序经常内存泄漏 或莫名其妙的崩溃。我在这里总结了自己对objective-C内存管理机制的研究成果和经验,写了这么一个由 浅入深的...

    oc内存管理.

    iPhone/Mac Objective-C 内存管理教程和原理剖析 初学 objectice-C 的朋友都有一个困惑,总觉得对 objective-C 的内存管理 机制琢磨不透,程序经常内存泄漏或莫名其妙的崩溃。我在这里总结了自己对 o bjective-C 内存...

    Objective-C 2.0 运行时系统编程指南

    这儿的运行时系统扮演的角色类似于Objective-C语言的操作系统,Objective-C基于该系统来工作。本文档将具体介绍NSObject类以及Objective-C程序是如何和运行时系统交互的。特别地,本文档还给出来怎样在运行时动态地加

    More iPhone Development with Objective-C(Apress,3ed,2015)

    More iPhone Development with Objective-C is an independent companion to Beginning iPhone Development with Objective-C. That is, it is a perfect second book, but it is also a great book for those ...

    Objective-C程序设计

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

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

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

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

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

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

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

    Objective-C基础教程

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

    Objective-C基础教程随书源码

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

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

    本书结合理论知识与示例程序,全面而系统地讲述Objective-C编程的相关内容,包括Objective-C在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解压...

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

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

    More.iPhone.Development.with.Objective-C.3rd.Edition

    Title: More iPhone Development with Objective-C, 3rd Edition Author: Alex Horovitz, David Mark, Jayant Varma, Jeff LaMarche, Kevin Kim Length: 512 pages Edition: 3 Language: English Publisher: Apress ...

    (学习Objective-C最新最好的稀缺图书,配示例代码)Learn Objective-C On The Mac, 2009

    elcome to Learn Objective- C on the Mac! This book is designed to teach you the basics of the Objective- C language. Objective- C is a superset of C and is the language used by many (if not most) ...

    objective-c语言教程

    objective-c语言教程。最新原版资料。内有基本语法,类对象使用,也有协议、线程等的介绍和使用等。是iphone开发的基础资料

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

    《Objective-C2.0程序设计(原书第2版)》是Objective-C领域的经典著作,对Objective-C进行了系统而全面的阐述,权威性毋庸置疑。全书共分为四大部分:第一部分全面讲解了Objective-C语言的基础知识,包括类、对象、...

    windows 下搭建 Objective-C 开发环境

    在windows系统下搭建Objective-C开发环境,由于公司要做iphone开发,个人学习objc(Objective-C)语法,所以在windows7下搭建了一个objc开发环境,现把自己整理的帮助文档拿来与大家分享,希望能对大家有所帮助。...

Global site tag (gtag.js) - Google Analytics