虽然ARC引入之后NSAutoReleasePool的使用有了很大变化,但是了解NSAutoReleasePool的机制还是十分必要的,下面主要说一下:
NSAutoReleasePool * pool = [NSAutoReleasePool alloc] init];
//do something
之后,
[pool drain] 和 [pool release] 的区别:
release,在引用计数环境下,由于NSAutoReleasePool是一个不可以被retain的类型,所以release会直接dealloc pool对象。当pool被dealloc的时候,pool向所有在pool中的对象发出一个release的消息,如果一个对象在这个pool中autorelease了多次,pool对这个对象的每一次autorelease都会release。在GC环境下release是一个no-op操作(代表没有操作,是一个占据进行很少的空间但是指出没有操作的计算机指令)。
drain,在引用计数环境下,它的行为和release是一样的。在GC的环境下,这个方法调用objc_collect_if_needed出发GC。
因此,重点是:在GC环境下,release是一个no-op,所以除非你不希望在GC环境下出发GC,你都应该使用drain而不是使用release来释放pool。
1. NSAutoreleasePool实际上是个对象引用计数自动处理器。NSAutoreleasePool可以同时有多个,它的组织是个栈,总是存在一个栈顶pool,也就是当前pool,每创建一个pool,就往栈里压一个,改变当前pool为新建的pool,然后,每次给pool发送drain消息,就弹出栈顶的pool,改当前pool为栈里的下一个 pool。
2. 在程序的入口main函数就调用NSAutoreleasePool,这样保证程序中不调用NSAutoreleasePool,但在退出时自动释放。新开线程最好实现NSAutoreleasePool
3. NSAutoreleasePool的管理范围是在NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];与[pool release];之间的对象
4. NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
当执行[pool autorelease]的时候,系统回进行一次内存释放,把autorelease的对象释放掉,如果没有NSAutoreleasePool , 那这些内存不会释放
注意,对象并不是自动被加入到当前pool中,而是需要对对象发送autorelease消息,这样,对象就被加到当前pool的管理里了。当当前pool接受到drain消息时,它就简单的对它所管理的所有对象发送release消息。
例如
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString* nsstring;
char* cstring = "Hello CString";
nsstring = [NSString stringWithUTF8String:cstring];
[pool release];
5. alloc的对象必须显示释放
例如:
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString* string = [[NSString alloc] init];
[string stringByAppendingString:@"Hello World!"];
[pool release];
[nsstring release];
相关推荐
总的来说,`autorelease`机制和`NSAutoreleasePool`是Objective-C内存管理中的重要组成部分,它们协同工作以确保对象在合适的时间被释放,同时避免内存泄漏。理解并正确使用这些概念对于编写高效、稳定的iOS应用至关...
8. @autoreleasepool:在 ARC 中,使用 @autoreleasepool 替代了手动创建和管理 NSAutoreleasePool。这使得在代码块内部创建的对象会在块结束时自动释放。```objc@autoreleasepool { ClassA *obj1 = [[ClassA alloc]...
[releasePool drain]; } ``` NSOperation和NSInvocationOperation是更高级的多线程工具,它们提供了更好的任务管理和并发控制。NSOperationQueue可以管理多个NSOperation实例,允许你设置依赖关系、限制并发数量等...
ARC 自动管理对象的引用计数,开发者不再需要手动发送 `retain` 和 `release` 消息来增加或减少对象的引用计数。 #### 五、对象的初始化 Objective-C 中的对象可以通过多种方式初始化,最常见的是使用 `-init` 方法...
- **布尔类型**:Objective-C中使用`BOOL`类型来表示逻辑值,`YES`和`NO`分别代表真和假,与C++不同,C++中的任何非零值都被视为真。 - **基础代码结构**:典型的Objective-C程序包括导入必要的框架、声明和初始化...
Objective-C中使用`@try`、`@catch`和`@throw`关键字来处理异常。 ```objective-c @try { // 可能抛出异常的代码 } @catch (NSException *exception) { NSLog(@"捕获到异常: %@", exception); } ``` ### 面向...
- Objective-C早期版本中使用`retain`和`release`来管理对象的生命周期。 - 示例: ```objective-c id object = [[NSObject alloc] init]; [object retain]; [object release]; ``` - **Dealloc**: - 当...
- 内存管理的基础:`retain`, `release`, `drain`, `autorelease`, `NSAutoreleasePool` - 深复制与浅复制的概念:`NSCopying` - 常用的`NSFoundation`类掌握:`NSData`, `NSString`, `NSDictionary`, `NSArray`,...