一方で、performSelectorInBackground:withObjectメソッドを利用する場合はオートリリースプールを用意する必要があります。
ARCを利用していない場合、@selectorに指定するメソッドは以下のように作成します。
- (void)doInBackground {
NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];
// バックグラウンドで実行するコード
[pool drain];
}
オンラインで見られるドキュメントは上のような(ARCを使っていない場合の)記述であることが多いのですが、ARCを有効にした状態だと以下のようなエラーが発生します。
Semantic Issue: 'NSAutoreleasePool' is unavailable: not available in automatic reference counting mode
そこでNSAutoreleasePoolに関連した部分を削除すると一見うまく動くのですが、メモリが不足した場合でもそれを開放できずにメモリリークが発生し、例えば以下のような警告が出ます。
__NSAutoreleaseNoPool(): Object 0x****** of class NSCFString autoreleased with no pool in place - just leaking
ARCが有効な状態でオートリリースプールを利用する場合は、main関数がそうしているように、@autoreleasepool{}を利用します。つまり、
- (void)doInBackground {
@autoreleasepool {
// バックグラウンドで実行するコード
}
}
このように記述すればエラーや警告なく、performSelectorInBackground:withObjectメソッドが使えるようになります。