`

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

阅读更多

版权声明

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

版本 1.1 发表于 2010-03-08

 

 

系统自动创建新的 autorelease pool

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

在这个小程序中,我们先生成了一个 autorelease pool ,然后生成一个 autorelease ClassA 的实例,再在一个新的 run loop 中生成一个 autorelease ClassB 的对象(注意,我们并没有手动在新 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 中调用一函数, 生成 ClassB autorelease 实例

 

         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 之前, ClassB autorelease 实例就已经被销毁了。

有人可能会说,这并不能说明新的 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 中调用一函数,生成 ClassB autorelease 实例

         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”;

str1 retain 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 内存...

    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 2.0 运行时系统编程指南

    Objective-C语言将决定尽可能的从编译和链接时推迟到运行时。只要有可能,Objective-C总是使用动态的方式来解决问题。这意味着Objective-C语言不仅需要一个编译器,同时也需要一个运行时系统来执行编译好的代码。这儿...

    Objective-C程序设计

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

    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基础教程+随书源代码

     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是扩展C的面向对象编程语言,也是iPhone开发用到的主要语言。本书结合理论知识与示例程序,全面而系统地讲述Objective-C编程的相关内容,包括Objective-C在C的基础上引入的特性和Cocoa工具包的功能及其中...

    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解压...

    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-C: 入门教程

    学习Objective-C: 入门教程

    iPhone 开发入门 从 C/C++ 语言到 Objective-C 语言

    Objective-C,通常写作ObjC和较少用的Objective C或Obj-C,是扩充C的面向对象编程语言。所以有一定C/C++语言基础理解和掌握Objective-C也会相应的快些。这回,我们将比较着学习 Objective-C语言,掌握其语法并理解其...

    windows 下搭建 Objective-C 开发环境

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

Global site tag (gtag.js) - Google Analytics