- 浏览: 29164 次
- 性别:
- 来自: 成都
文章分类
最新评论
版权声明
此文版权归作者 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
发表评论
-
UITextField字数限制[中文按2个字符算, Emoji按4个字符算]
2016-04-07 14:55 11831, 使用NSNotification监控变化: [[NS ... -
iOS中浅拷贝与深拷贝
2015-07-27 15:48 623详情见: http://www.cnblogs.com/s ... -
IOS Core 系列教程
2014-07-22 09:14 570https://developer.apple.com/l ... -
消息转发: methodSignatureForSelector + forwardInvocation
2014-02-20 11:04 1774在object-C中,我们可以向一个实例发送消 ... -
iOS AutoLayout 基础--Visual Format Language - 2
2013-10-12 17:49 854Visual Format Language Visu ... -
iOS AutoLayout 基础--Visual Format Language
2013-10-12 17:47 1613转自:http://commandshift.co.uk/b ... -
iPhone OS编程指南
2012-06-26 14:50 553http://www.apple.com.cn/develop ... -
UINavigationController视图切换
2011-12-13 12:48 3131实现UINavigationController视图切换 ... -
IOS多线程
2011-10-21 16:44 1352iOS多线程 iPhone 中的 ... -
IOS环境搭建
2011-10-19 09:03 0http://search.51job.com/job/462 ... -
iPhone/Mac Objective-C内存管理教程和原理剖析 3
2011-10-08 14:55 732版权声明 此文版权归作者 Vince Yuan (vi ... -
iPhone/Mac Objective-C内存管理教程和原理剖析 2
2011-10-08 14:54 631版权声明 此文版权归作者 Vince Yuan (vi ... -
iPhone/Mac Objective-C内存管理教程和原理剖析 1
2011-10-08 14:49 674版权声明 此文版权归作者 Vince Yuan (vi ... -
IOS环境搭建
2011-10-18 23:07 011 http://bbs.weiphone.com/rea ...
相关推荐
//...} // obj1 会被自动释放,因为它是自动释放池内的对象```了解了这些基本概念后,你就能更好地理解 Objective-C 的内存管理机制,避免内存泄漏和意外崩溃。实践中,掌握好这些原则并结合 Xcode 的内存分析工具...
Objective-C是一种面向对象的编程语言,由ANSI C语言扩展而来,主要用于苹果公司的Mac OS X和iOS操作系统上应用程序的开发。它结合了C语言的高效性与Smalltalk语言的对象导向特性,使开发者能够构建复杂且功能丰富的...
Objective-C是一种强大的面向对象编程语言,它在Apple的Mac OS X和iOS操作系统中广泛使用,是开发iPhone、iPad应用的主要工具。本基础案例集旨在帮助初学者深入理解Objective-C的语法特性,通过实际代码示例来提升...
Objective-C是一种面向对象的编程语言,它是Apple的iOS和macOS操作系统的核心开发语言。深入学习Objective-C对于想要成为iOS或macOS应用开发者的人来说至关重要。以下是对这个主题的详细阐述: 一、Objective-C基础...
4. 内存管理:Objective-C使用引用计数(Reference Counting)机制来管理内存,包括alloc, retain, release, 和autorelease等内存管理方法。为了简化内存管理,iOS 5.0之后引入了ARC(自动引用计数)。 5. ...
《在Mac上学习Objective-C》是一本面向开发者介绍如何使用Objective-C语言为Mac OS X和iOS平台开发应用程序的书籍。Objective-C是苹果公司用来开发iOS和OS X应用程序的原生编程语言,它基于C语言并加入了面向对象的...
4. **内存管理:**Objective-C使用引用计数的方式进行内存管理,后来在ARC(Automatic Reference Counting)的支持下,内存管理变得更加自动化。 5. **语法简洁:**尽管Objective-C具有丰富的功能,但其语法仍然保持...
- **定义**: Objective-C是一种通用、面向对象的编程语言,由Molly and Steve Jobs在20世纪80年代初开发,后被苹果公司采纳作为其操作系统Mac OS X及其设备(如iPhone、iPad等)的应用程序开发标准语言之一。...
全面涵盖最新技术和新增工具.iPhone、iPad、Mac开发必备.Objective-C是一门面向对象、通用、高级、强大的编程语言。它有着优雅的编程环境,并发扬了C语言的优秀特性,是苹果的iOS和OS X操作系统的主要编程语言。全面...
4. 内存管理:Objective-C中的内存管理包括引用计数机制以及自动引用计数(ARC)的介绍和使用,这是保证iOS应用稳定运行的关键技术之一。 5. 文件操作:如何在Objective-C中读写文件,包括使用标准C库函数以及利用...
- **在线资源**: Apple Developer官方网站提供了大量的Objective-C文档和教程。 以上是对Objective-C入门指南中提到的关键知识点的详细解释和扩展,旨在帮助初学者更好地理解和掌握Objective-C的核心概念和技术细节...
Objective-C是一种面向对象的编程语言,它是在标准C的基础上发展起来的,主要用于苹果公司的Mac OS X和iOS操作系统上的应用程序开发。Objective-C不仅继承了C语言的基础特性,还引入了许多面向对象的概念和技术,如...
Parsekit是一个Mac OS X的框架,基于Objective-C提供类似ANTLR的功能.可以对Objective-C的语法进行词法分析. 以下软件已经使用Parsekit开发: Base: Mac SQLite 工具 TaskPaper for iPhone: 简单的TO-...
通过大量的实例和练习,读者可以逐步建立起对Objective-C的理解,并能够应用于实际的iOS和Mac应用程序开发中。此外,书中还介绍了Foundation框架和Cocoa/Cocoa Touch框架的关键概念,为读者提供了从理论到实践的全...