好记性不如烂博客.
今天需要记录的是关于NSAutoReleasePool的理解.(大部分内容来自于iOS4.3 Library)
Cocoa的内存管理主要依赖于Reference Counting, 而NSAutoReleasePool就是用来支持它的. autorelease pool中存放的对象会在其自身干枯(drain)时被release.
我们都知道当一个object的release方法被触发时, 这个对象就被销毁了, 再也不能对它有任何引用, 否则就会出现异常. 但如果在销毁它时触发的是autorelease方法, 那这个object就进入了对应的autorelease pool, 它的生命就被延长了(当pool drain时才真正被销毁).
在Reference Counting的环境里, Cocoa总是期望在每一个thread都存在一个autorelease pool, 如果不存在, 那些被autoreleased的objects就不会被销毁, 从而产生memory leak. (印象中这种情况下xcode会在console打出warnning信息)
NSAutoReleasePool的初始化与普通的NSObject一样, 都是alloc+init, 不过pool不能被retain, 因为在drain的时候默认就销毁它自身了. 还有一点需要注意的是, 通常在销毁pool的时候用的不是它的release方法, 而是drain! 原因是为了让程序同时兼容Reference Counting内存管理环境 与 Garbge Collection环境, 因为在Garbage Colloection环境中drain的作用是触发collect garbage动作.
一般来说在应用的main thread中, 已经存在了一个autorelease pool. 有两种情况需要开发者自己新建autorelease pool:
- 在main thread中, 在某个方法中出现大量的autoreleased objects, 为了避免memory footprint的增大, 可以手动创建一些autorelease pool用来drain objects.
- 创建新的thread, 并在其中访问了Cocoa, 需要在访问的前创建autorelease pool, 访问结束后drain.
最后一点, 在每个thread中都会维持一个stack, 其中放置着所有在这个thread中创建但未销毁的pool, 每当一个新的pool创建后, 它就位于stack的最顶端, 相应autoreleased object就会放入其中. 当pool drain的时候, 它就会从stack的顶端移除, 并且release掉其包含的objects.
@end
发表评论
-
IOS开发 多线程 一
2013-11-19 11:46 508原文:http://blog.csdn.net/develo ... -
IOS 学习 Key-value coding
2013-11-19 10:56 833原文:http://blog.csdn.net/develo ... -
IOS block dispatch_queue
2012-11-05 15:04 933研究了3天的block使用,今天终于写出了自己的第一个b ... -
socket编程 详解
2012-08-28 08:57 1102对TCP/IP、UDP ... -
iOS ASIHTTPRequest详解 非常强大
2012-08-27 13:20 2440ASIHTTPRequest对CFNetwork API ... -
今天看了ps的简介,决定一定要把它给学会,首先了解一下基础知识
2012-08-22 00:01 7671.位图图像的概念 位图图像使用像素来表示图像,因此也 ... -
SDWebImage使用,图片加载和缓存
2012-07-04 11:44 2434SDWebImage托管在github上。https:/ ... -
coredata 理解
2012-06-15 13:08 1403昨天开始认真的看coredata的用法,今天终于明白的其中的 ... -
#ifndef、#def、#endif说明
2012-06-13 13:43 898你所遇到的这几个 ... -
ios 数据存储的四种常用方式NSKeyedArchiver/NSUserDefaults/Writ
2012-06-13 10:49 1374OK,今天Himi介绍游戏 ... -
AVAudioPlayer 音频播放器 使用 教程
2012-06-05 14:33 1247IOS中有三种播放音频的方式:AVAudioPlaye ... -
使用iOS手势UIGestureRecognizer
2012-06-05 10:10 1247UIKit中包含了UIGestureRecognizer ... -
NSLocalizedString 实现国际化
2012-05-28 11:23 855一、获取系统所支持的国际化信息 在国际化之前,你可以在ip ... -
自定义 UIColor baseView 父类子类方法名 不能重复
2012-05-24 11:04 862原来是因为方法名字重复了,因为baseview的方法名和 ... -
Android图片处理(Matrix,ColorMatrix)
2012-05-22 09:24 875在编程中有时候需要 ... -
objectForKey与valueForKey在NSDictionary中的差异
2012-05-18 15:38 807从 NSDictionary 取值的时候有两个方法,ob ... -
symbol(s) not found for architexture i386 路径错误
2012-05-16 09:55 1573昨天这个错误又出现 ... -
symbol(s) not found for architexture i386 报错
2012-05-15 18:40 771我靠啊,今天下午出现了个这个错误,找了好多资料,发现让添加li ... -
symbol(s) not found for architexture i386 报错
2012-05-15 18:40 0我靠啊,今天下午出现了个这个错误,找了好多资料,发现让添加li ... -
推送 证书 联机调试
2012-05-15 15:16 853联机调试出现问题, ...
相关推荐
尝试将 NSAutoreleasepool(或 @autoreleasepool{...})从 Objective-C 和 Cocoa 中完全用 C 实现到 C 语言中。 我认为这对某人有用并在周末左右实施。 我还没有找到任何可比较的项目,但如果你有更好的项目,请告诉...
在本文中,我们将深入探讨一种特定的内存管理技术,即`autorelease`机制,以及它如何与`NSAutoreleasePool`相关联。 标题所提到的“有时侯我们需要延迟一个对象的引用计算减一操作”,指的是在某些情况下,我们不...
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; ClassA *obj = [[[ClassA alloc] init] autorelease]; // 使用 obj [pool release]; // 在这里,obj的引用计数减1,如果为0,则对象被释放 ``` 工厂...
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; // insert code here... NSLog(@"你好,世界!"); [pool drain]; return 0; } ``` 恭喜,你已经创建了你的第一个Objective-C程序,它会打印出...
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retVal; } ``` - **自动释放池**: - `NSAutoreleasePool`...
通常在线程开始时创建`NSAutoreleasePool`,在适当的时候(如任务完成后)进行drain,以释放自动释放的对象。 3. **线程与autoreleasepool** - 主线程默认有一个autorelease pool,但在自定义线程中,程序员需要...
- **创建**: `NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];` 创建一个自动释放池,用于管理自动释放的对象。 - **释放**: `[pool drain];` 释放自动释放池及其所有对象。 #### 二、数据类型 ...
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; int integerVar = 100; NSLog(@"integerVar=%i", integerVar); [pool drain]; return 0; } ``` **整型变量混用示例**: ```objective-c ...
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSString *fName = @”testfile”; // 假设存在的文件名 NSFileManager *fm = [NSFileManager defaultManager]; NSDictionary *attr; if ([fm ...
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; ``` 在程序执行过程中,Xcode通常会在`main`函数中自动创建一个自动释放池。该池在运行结束时会自动销毁所有`autorelease`对象,但仅调用`release`...
4. NSAutoreleasePool类:在自动引用计数(ARC)出现之前,NSAutoreleasePool类用于管理内存,帮助自动释放那些不再需要的对象。它会创建一个自动释放池,并在适当的时候释放池中的对象,以避免内存泄漏。虽然ARC...
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSLog(@"Hello, world!"); [pool drain]; return 0; } ``` 这段代码首先导入了Foundation框架,这是Objective-C中处理基本数据类型和常用...
NSAutoreleasePool *releasePool = [[NSAutoreleasePool alloc] init]; // 执行你的任务... [releasePool drain]; } ``` NSOperation和NSInvocationOperation是更高级的多线程工具,它们提供了更好的任务管理和...
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSLog(@"Hello, World!"); [pool drain]; return 0; } ``` 4. 使用`gcc`编译源文件,确保添加了Objective-C的特定标志和库: ``` gcc `gnustep-...
4. 使用NSStackBlock和NSAutoreleasePool:对于那些生命周期短暂的Block,可以在Block内部创建一个NSAutoreleasePool,然后将Block从栈复制到池中,当池被释放时,Block也会随之释放,从而避免循环引用。 在实践中...
NSAutoreleasePool用于临时存储并适时释放那些被autorelease的对象,特别是在循环或并发环境中。 面试题.zip可能会涵盖更广泛的iOS面试问题,除了内存管理,还可能包括: 4. KVO(Key-Value Observing)和KVC(Key...
//retain count = 1[NSAutoreleasePool drain]; //此时,如果没有其他 retain,obj1 将被释放,因为它被自动释放池标记为待释放的。在 iOS 应用程序中,每个事件循环(如触摸事件或定时器触发)都有一个自动释放池...