4

LLVM(iOS上)で問題なくビルドされる既存のコードを修正して、llvm-gcc-4.2でもビルドできるようにする必要があります。いくつかの場所で見られるこのパターンを除いて、私はほとんどすべてを終えました:

@property (nonatomic, retain) __block id myProperty;

ここでの目的は、を保持せずにブロック内からプロパティにアクセスできるようにすることだと思いますself。gccがここでサポートしていない属性を削除するにはどうすればよい__blockですか?それでも同じ効果を達成できますか?

4

2 に答える 2

13

コンパイラのバグ、宣言を見つけたことをお勧めします。

@property (nonatomic, retain) __block id myProperty;

無意味です。修飾子は__blockローカル(スタック割り当て)変数で使用されるため、ブロックへの参照によって渡されるため、更新でき、通常はスタックではなくヒープに[*]格納されます。

したがって、修飾子__blockは、Obj-Cで常にヒープに割り当てられるオブジェクトインスタンスに関係するプロパティ宣言では意味がありません。

__blockすべてのコンパイラについて、プロパティ宣言からを削除するだけです。

[*]ブロックがヒープにコピーされない場合、コンパイラーは__block変数を最適化し、それらをヒープに移動しない場合があります。

于 2012-07-17T05:19:24.740 に答える
5

ブロックで変数を使用する直前に、タイプのローカルポインタを作成します__block。宣言には使用__blockしないでください。@property

例えば:TypeOfVariable __block *bock_pointer = self.property;

^{ inside the block use bock_pointer }

于 2012-07-17T04:17:42.960 に答える