NSAutoreleasePoolクラス

2012. 03. 16
●概要

NSAutoreleasePoolクラスは、Cocoaの参照カウントメモリ管理システムのサポートに使用されます。

自動解放プールは、プール自体が破棄された時にreleaseメッセージを送信するオブジェクトが格納されています。

重要
自動参照カウント(ARC:Automatic Reference Counting)を使用する場合、直接自動解放プールを使用することはできません。
代わりに@autoreleasepoolブロックを使用します。
例えば、

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init;
// Code benefitting from a local autorelease pool.
[pool release];

の代わりに次のように記述します。

@autoreleasepool {
    // Code benefitting from a local autorelease pool.
}

@autoreleasepoolブロックは、NSAutoreleasePoolのインスタンスを直接使用するより効率的です。
またARCを使用していない場合でも使用することができます。

(ガベージコレクションを使用する場合とは対照的に)参照カウント環境では、NSAutoreleasePoolオブジェクトはautoreleaseメッセージを受信するオブジェクトが含まれており、破棄する際にこれらの各オブジェクトにreleaseメッセージが送信されます。

したがってオブジェクトにreleaseの代わりにautoreleaseを送信すると、少なくともプール自身が破棄されるまでオブジェクトの存続期間が延長されます。
(オブジェクトが引き続いて保持されている場合は長くなる可能性があります)

オブジェクトがプールに入れられる度にreleaseメッセージを受信する場合は、同じプールに複数回オブジェクトを入れることができます。

参照カウント環境では、Cocoaは常に自動解放プールが利用可能であることを前提にしています。

プールが利用できない場合、自動解放されたオブジェクトは解放できないためメモリリークが発生します。

このような状況の場合、プログラムは通常、適切な警告メッセージをログに残します。

Application Kitはイベントループの各サイクルの開始時に、メインスレッド上に自動解放プールを生成して終了時に破棄し、それによってイベントの処理中に生成された自動解放オブジェクトを解放します。

したがってApplication Kitを使用する場合は、通常独自のプールを生成する必要はありません。

アプリケーションがイベントループ内で一時的な自動解放オブジェクトを大量に生成する場合、メモリのフットプリントのピークを最小にする助けるため、『ローカル』の自動解放プールを生成することが有益かもしれません。

NSAutoreleasePoolオブジェクトは通常allocとinitメッセージで生成し、drain(またはrelease)で破棄します。
drainreleaseの違いについては『ガベージコレクション』を参照してください)

自動解放プール(または自動解放の対象。retainautorelease参照)は保持できないので、プールを破棄すると最終的に解放する効果があります。

自動解放プールは常にそれを生成したものと同じコンテキスト(メソッドや関数の呼び出し、またはループ本体)で破棄する必要があります。

詳細については『Autorelease Pools』(日本語版は『高度なメモリ管理プログラミングガイト』の『自動解放プールブロックの利用(p.21)』)を参照してください。

(メインスレッドを含む)各スレッドは、NSAutoreleasePoolオブジェクトの固有のスタックを保持します。
(『スレッド』参照)

新しいプールが生成されると、それらはスタックの一番上に追加されます。

プールが開放された場合、それらはスタックから削除されます。

自動解放オブジェクトは現在のスレッドの自動解放プールの一番上に置かれます。

スレッドが終了した場合、自身に関連付けられた自動解放プールの全てが自動的に破棄されます。


スレッド

Application Kitのメインスレッド外でCocoaの呼び出しを行う場合、例えばFoundationのみのアプリケーションの生成やスレッドをデタッチする場合は、独自の自動解放プールを生成する必要があります。

アプリケーションまたはスレッドが長時間存続し、潜在的に大量の自動解放オブジェクトを生成する場合は、(Application Kitのようにメインスレッド上で)定期的に自動解放プールを破棄して生成する必要があり、そうしなければ自動解放オブジェクトが蓄積されてメモリのフットプリントが増大します。

ただしデタッチされたスレッドでCocoaの呼び出しを行う場合、自動解放プールを生成する必要はありません。

:NSThreadオブジェクトの代わりにPOSIXスレッドAPIを使用して別のスレッドを生成する場合、Cocoaがマルチスレッドモードでない限り、NSAutoreleasePoolを含むCocoaを使用することはできません。
Cocoaは最初のNSThreadオブジェクトをデタッチした後でのみマルチスレッドモードに入ります。
別のPOSIXスレッド上でCocoaを使用するには、アプリケーションはすぐに終了させることができる少なくとも一つのNSThreadオブジェクトをデタッチする必要があります。
Cocoaがマルチスレッドモードかどうかは、NSThreadクラスメソッドのisMultiThreadedでテストすることができます。


ガベージコレクション

ガベージコレクション環境では自動解放プールは必要ありません。

ただしガベージコレクションと参照カウント環境の両方で動作するように設計したフレームワークを記述することはできます。

その場合、コレクションすることが適切かもしれないとコレクタにヒントを与えるために、自動解放プールを使用することができます。

ガベージコレクション環境ではreleaseは何も処理を行わないため、プールにdrainメッセージを送信すると、必要に応じてガベージコレクションにトリガされます。

参照カウント環境では、drainreleaseと同じ効果があります。

したがって一般的にはreleaseの代わりにdrainを使用する必要はありません。



●タスク

●プールの管理


– release
– drain
– autorelease
– retain

●プールへのオブジェクトの追加


+ addObject:
– addObject:



●クラスメソッド

addObject:

+ (void)addObject:(id)object

現在のスレッド内のアクティブな自動解放プールに指定したオブジェクトを追加します。

アクティブなプールに同じオブジェクトが複数回追加されると、プールが解放された時に追加された各時間のreleaseメッセージを受信します。

通常はこのメソッドを直接呼び出さず、代わりにオブジェクトにautoreleaseを送信します。

object
:現在のスレッド内のアクティブな自動解放プールに追加するオブジェクトを指定します。



●インスタンスメソッド

addObject:

- (void)addObject:(id)object

レシーバに指定されたオブジェクトを追加します。

同じプールに同じオブジェクトが複数回追加される可能性があり、プールが開放された時、オブジェクトは追加された各時間のreleaseメッセージを受信します。

通常はこのメソッドを直接呼び出さず、代わりにオブジェクトにautoreleaseを送信します。

object:レシーバに追加するオブジェクトを指定します。


autorelease

- (id)autorelease

例外を発生させます。

戻り値はselfです。

参照カウント環境では、このメソッドは例外を発生させます。


drain

- (void)drain

参照カウント環境ではレシーバを解放してポップし、ガベージコレクション環境では最後にコレクションした時以降に割り当てられたメモリが現在の閾値より大きい場合、ガベージコレクションをトリガします。

参照カウント環境では、このメソッドはreleaseと同じように動作します。

自動解放プールは保持できないため(retain参照)、レシーバが解放されることになります。

自動解放プールが解放されていた場合は、全ての自動解放オブジェクトにreleaseメッセージが送信されます。

オブジェクトが同じプールに複数回追加されている場合、プールが開放された時に追加された各時間のreleaseメッセージを受信します。

ガベージコレクション環境では、このメソッドは最終的にobjc_collect_if_neededを呼び出します。

特別な考慮事項

ガベージコレクション環境ではreleaseは何も行わないため、コレクタにヒントを与えたくない場合を除いて、ガベージコレクション環境用にコンパイルされた任意のコード内でdrainを使用することが重要です。


release

- (void)release

レシーバを解放しポップします。

参照カウント環境では自動解放プールを保持できないため(retain参照)、このメソッドはレシーバを解放することになります。

自動解放プールが解放されていた場合は、全ての自動解放オブジェクトにreleaseメッセージが送信されます。

オブジェクトが同じプールに複数回追加されている場合、プールが開放された時に追加された各時間のreleaseメッセージを受信します。

ガベージコレクション環境では、このメソッドは何もしません。

特別な考慮事項

通常はreleaseの代わりにdrainを使用する必要があります。


retain

- (id)retain

例外を発生させます。

戻り値はselfです。

参照カウント環境では、このメソッドは例外を発生させます。



参考文献

NSAutoreleasePool Class Reference

高度なメモリ管理プログラミングガイド






Bose SoundLink around-ear wireless headphones II
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
06 | 2017/07 | 08
Sun Mon Tue Wed Thu Fri Sat
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

Bose SoundLink around-ear wireless headphones II
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR