この SO の質問に対する Bavarous の回答に基づいて、LLVM/clang でビルドする場合、@autoreleasepool は現在、Objective-C 言語の機能であると信じるに至りました。
正しい。
この場合、非 ARC 環境で NSAutoreleasePool の代わりに @autoreleasepool を使用するように次のコードをどのように書き直しますか?
[NSAutoreleasePool addObject:anObject]; // (*)
Doc: 通常、このメソッドを直接呼び出すことはありません。代わりに autorelease を object に送信します。
@autoreleasepool {
id anObject = ...;
[anObject autorelease];
}
背景: 私は基本的に、NSAutoreleasePool クラスとはまったく対話しない -autorelease のカスタム実装を書きたいと思っています。
もはやサブクラス化することさえできませNSAutoreleasePool
ん (意味のある方法で)。自由に自動解放できる他の API にオブジェクトを渡さない限り、オブジェクトは現在の自動解放プールに格納されてしまいます。今日のこのメカニズムは、オブジェクトベースでさえありません。
これが不可能な場合は、NSAutoreleasePool を使用しない回避策の提案を受け付けます。
どのような問題を解決しようとしているのかは定かではありませんが、以下を使用して寿命を延ばすことができます:
NSMutableArray * fauxAutoreleasePool = NSMutableArray.new;
id anObject = ...;
[fauxAutoreleasePool addObject:anObject];
...
[fauxAutoreleasePool removeAllObjects]; // << explicitly drain, which also happens when the array is destroyed
もちろん、独自の実装を作成することもできます。なぜ独自のコードを作成するのかはまだ謎であり、製品コード (@autoreleasepool
うまく動作) には適していません。