ojbect-c中,NSAutoreleasePool
来源:互联网 发布:正态分布 协方差矩阵 编辑:程序博客网 时间:2024/04/30 07:08
Next
Overview
The NSAutoreleasePool class is used to support Cocoa’s reference-counted memory management system. An autorelease pool stores objects that are sent arelease message when the pool itself is drained.
Important: If you use Automatic Reference Counting (ARC), you cannot use autorelease pools directly. Instead, you use@autoreleasepool blocks. For example, in place of:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Code benefitting from a local autorelease pool.
[pool release];
you would write:
@autoreleasepool {
// Code benefitting from a local autorelease pool.
}
@autoreleasepool blocks are more efficient than using an instance ofNSAutoreleasePool directly; you can also use them even if you do not use ARC.
In a reference-counted environment (as opposed to one which uses garbage collection), anNSAutoreleasePool object contains objects that have received anautorelease message and when drained it sends a release message to each of those objects. Thus, sendingautorelease instead of release to an object extends the lifetime of that object at least until the pool itself is drained (it may be longer if the object is subsequently retained). An object can be put into the same pool several times, in which case it receives a release message for each time it was put into the pool.
In a reference counted environment, Cocoa expects there to be an autorelease pool always available. If a pool is not available, autoreleased objects do not get released and you leak memory. In this situation, your program will typically log suitable warning messages.
The Application Kit creates an autorelease pool on the main thread at the beginning of every cycle of the event loop, and drains it at the end, thereby releasing any autoreleased objects generated while processing an event. If you use the Application Kit, you therefore typically don’t have to create your own pools. If your application creates a lot of temporary autoreleased objects within the event loop, however, it may be beneficial to create “local” autorelease pools to help to minimize the peak memory footprint.
You create an NSAutoreleasePool object with the usualalloc and init messages and dispose of it withdrain (or release—to understand the difference, see“Garbage Collection”). Since you cannot retain an autorelease pool (or autorelease it—seeretain and autorelease), draining a pool ultimately has the effect of deallocating it. You should always drain an autorelease pool in the same context (invocation of a method or function, or body of a loop) that it was created. See “Using Autorelease Pool Blocks” for more details.
Each thread (including the main thread) maintains its own stack ofNSAutoreleasePool objects (see “Threads”). As new pools are created, they get added to the top of the stack. When pools are deallocated, they are removed from the stack. Autoreleased objects are placed into the top autorelease pool for the current thread. When a thread terminates, it automatically drains all of the autorelease pools associated with itself.
Threads
If you are making Cocoa calls outside of the Application Kit’s main thread—for example if you create a Foundation-only application or if you detach a thread—you need to create your own autorelease pool.
If your application or thread is long-lived and potentially generates a lot of autoreleased objects, you should periodically drain and create autorelease pools (like the Application Kit does on the main thread); otherwise, autoreleased objects accumulate and your memory footprint grows. If, however, your detached thread does not make Cocoa calls, you do not need to create an autorelease pool.
Note: If you are creating secondary threads using the POSIX thread APIs instead ofNSThread objects, you cannot use Cocoa, including NSAutoreleasePool, unless Cocoa is in multithreading mode. Cocoa enters multithreading mode only after detaching its firstNSThread object. To use Cocoa on secondary POSIX threads, your application must first detach at least oneNSThread object, which can immediately exit. You can test whether Cocoa is in multithreading mode with theNSThread class method isMultiThreaded.
Garbage Collection
In a garbage-collected environment, there is no need for autorelease pools. You may, however, write a framework that is designed to work in both a garbage-collected and reference-counted environment. In this case, you can use autorelease pools to hint to the collector that collection may be appropriate. In a garbage-collected environment, sending adrain message to a pool triggers garbage collection if necessary;release, however, is a no-op. In a reference-counted environment,drain has the same effect as release. Typically, therefore, you should usedrain instead of release.
Tasks
Managing a Pool
- – release
- – drain
- – autorelease
- – retain
Adding an Object to a Pool
- + addObject:
- – addObject:
Class Methods
addObject:
Adds a given object to the active autorelease pool in the current thread.
+ (void)addObject:(id)object
Parameters
object
The object to add to the active autorelease pool in the current thread.
Discussion
The same object may be added several times to the active pool and, when the pool is deallocated, it will receive arelease message for each time it was added.
Normally you don’t invoke this method directly—you sendautorelease to object instead.
Availability
- Available in iOS 2.0 and later.
See Also
- – addObject:
Declared In
NSAutoreleasePool.h
Instance Methods
addObject:
Adds a given object to the receiver
- (void)addObject:(id)object
Parameters
object
The object to add to the receiver.
Discussion
The same object may be added several times to the same pool; when the pool is deallocated, the object will receive arelease message for each time it was added.
Normally you don’t invoke this method directly—you sendautorelease to object instead.
Availability
- Available in iOS 2.0 and later.
See Also
- + addObject:
Declared In
NSAutoreleasePool.h
autorelease
Raises an exception.
- (id)autorelease
Return Value
self.
Discussion
In a reference-counted environment, this method raises an exception.
drain
In a reference-counted environment, releases and pops the receiver; in a garbage-collected environment, triggers garbage collection if the memory allocated since the last collection is greater than the current threshold.
- (void)drain
Discussion
In a reference-counted environment, this method behaves the same asrelease. Since an autorelease pool cannot be retained (seeretain), this therefore causes the receiver to be deallocated. When an autorelease pool is deallocated, it sends arelease message to all its autoreleased objects. If an object is added several times to the same pool, when the pool is deallocated it receives arelease message for each time it was added.
Special Considerations
In a garbage-collected environment, release is a no-op, so unless you do not want to give the collector a hint it is important to usedrain in any code that may be compiled for a garbage-collected environment.
Availability
- Available in iOS 2.0 and later.
Related Sample Code
- AdvancedURLConnections
- CustomHTTPProtocol
- Large Image Downsizing
- ListAdder
- MVCNetworking
Declared In
NSAutoreleasePool.h
release
Releases and pops the receiver.
- (void)release
Discussion
In a reference-counted environment, since an autorelease pool cannot be retained (seeretain), this method causes the receiver to be deallocated. When an autorelease pool is deallocated, it sends arelease message to all its autoreleased objects. If an object is added several times to the same pool, when the pool is deallocated it receives arelease message for each time it was added.
In a garbage-collected environment, this method is a no-op.
Special Considerations
You should typically use drain instead of release.
See Also
- – drain
retain
Raises an exception.
- (id)retain
Return Value
self.
Discussion
In a reference-counted environment, this method raises an exception.
Next
Copyright © 2013 Apple Inc. All Rights Reserved.Terms of Use | Privacy Policy | Updated: 2013-08-08
Feedback
How helpful is this document?
*
Very helpful
Somewhat helpful
Not helpful
How can we improve this document?
Fix typos or links
Fix incorrect information
Add or update code samples
Add or update illustrations
Add information about...
*
* Required information
To submit a product bug or enhancement request, please visit theBug Reporter page.
Please read Apple's Unsolicited Idea Submission Policy before you send us your feedback.
- ojbect-c中,NSAutoreleasePool
- Ojbect C中内存管理漫谈.
- Ojbect-C学习
- iPhone中objective-c NSAutoreleasePool 的一些理解
- iPhone中objective-c NSAutoreleasePool 的一些理解
- Objective-C 之NSAutoreleasePool
- Objective-C NSAutoreleasePool
- 关于Object-C的NSAutoreleasePool的学习
- NSAutoreleasepool
- NSAutoreleasePool
- NSAutoReleasePool
- NSAutoReleasePool
- NSAutoreleasePool
- NSAutoreleasePool
- NSAutoReleasePool
- NSAutoreleasePool
- (1)objective c 入门之NSAutoreleasePool
- 关于 NSAutoreleasePool中 release 与 drain 区别
- HDU 1698 Just a Hook 线段树 成段替换
- MFC消息机制
- 第05章-可视化技术(1)
- H264中的SPS、PPS提取与作用
- VB.NET参数类型不符相关解决方法
- ojbect-c中,NSAutoreleasePool
- ubuntu查看占用某端口的程序
- tomcat端口被占用,如何找出并kill
- JavaScript事件 DOMNodeInserted DOMNodeRemoved
- Android 应用程序窗体显示状态操作(requestWindowFeature()的应用)
- hdu 4787 GRE Words Revenge(分块+AC自动机)
- 关于java的引用
- order by和group by的总结
- 分布式编译工具