コンパイラはブロックプロパティを 'Strong'または 'copy'属性の下にあっても自動的にヒープにコピーしますか?コンパイラは自動的にブロックプロパティをヒープにコピーしますか?
一部の人はそれがルールだと言いますが、理由を伝えることはできません。詳細を知りたいのですが。最新版では
コンパイラはブロックプロパティを 'Strong'または 'copy'属性の下にあっても自動的にヒープにコピーしますか?コンパイラは自動的にブロックプロパティをヒープにコピーしますか?
一部の人はそれがルールだと言いますが、理由を伝えることはできません。詳細を知りたいのですが。最新版では
、AppleのWorking with Blocksの2014年9月、彼らはブロックの値を持つプロパティがcopy
を使用するべきであると述べたが、その後すぐに白状(強調が追加):
注:ます元のスコープの外部にキャプチャされた状態を追跡するためにブロックをコピーする必要があるため、copyをプロパティ属性として指定する必要があります。 これは自動参照カウントを使用するときに心配する必要があるものではありません。自動参照カウントが自動的に行われるためですが、プロパティ属性で結果の動作を表示するのがベストプラクティスです。
だからあなたの質問への答え:
コンパイラが自動的にヒープにブロックプロパティをコピーします、関係なく、それは「強い」または「コピー」属性の下のですか?
は、現在、標準であるARCを使用している限り、です。
議論の余地がある「ベストプラクティス」について:ブロックは、通常はコピーしない不変のオブジェクトです。 copy
は、Appleがもともと、ブロックオンザフライ最適化を目に見えるものと部分的にプログラマでサポートするように選択したときにのみ必要でした。コンパイラ最適化のための珍しい選択です。しかし、ARCユーザーの場合、その日は長くはかかりませんが、MRCユーザーはこの最適化を手動で管理する必要があります。
HTH