3

@autoreleasepool { }ARC を有効にしてブロックを使用すると、コンパイラがコードを生成して、ブロックの先頭と末尾で呼び出されるobjc_autoreleasePoolPush()と関数をそれぞれ取得することをどこかで読みました。objc_autoreleasePoolPop()

ただし、Objective-C ファイルを@autoreleasepoolブロックでコンパイルすると、これらの 2 つの関数は呼び出されません-fobjc-arcNSAutoreleasePool代わりに、コンパイラは、最初に新しいオブジェクト ( と同等のもの)を割り当て、ブロックの最後にプールを (呼び出しで)[[NSAutoreleasePool alloc] init]排出するコードを生成します。-drain

では、objc_autoreleasePoolPush()およびobjc_autoreleasePoolPop()関数は本当に ARC を有効にして呼び出す必要があるのでしょうか? はいの場合、どのコンパイラ オプションが欠落していますか?

4

2 に答える 2

3

objc_autoreleasePoolPush()そしてOSX 10.7/ iOS 5.0 以降、コンパイラーによって生成されたコードから、それぞれブロックobjc_autoreleasePoolPop()の最初と最後に呼び出されることになっています。@autoreleasepool不足しているコンパイラ オプションは-fobjc-runtime=macosx-10.7.

ところで、ARC はこれらすべてとは関係がないため、@autoreleasepoolARC が有効になっていない場合でも、ブロックによってコンパイラはこれら 2 つの関数の呼び出しを生成します。

于 2013-02-21T23:43:47.530 に答える
2

展開ターゲットは何に設定されていますか? 新しい方法を使用するには、OSX 10.8/iOS 6 が必要になる場合があります。

于 2013-02-21T23:24:19.787 に答える