オブジェクトのシーケンスを生成し、一度に 1 つずつアプリケーションに戻さなければならない状況があります (ブロックベースまたは高速列挙を考えてください)。
ただし、各オブジェクトの生成には比較的コストがかかるため、このコストを回避する方法を探しています。
シーケンスの 1 つのオブジェクトが与えられた場合、前者を単純に変更するだけで次のオブジェクトを効率的に生成できる場合があります。このため、1 つのオブジェクトのみを作成し、その同じオブジェクトをアプリケーションに渡し続け、シーケンスの各ステップで「舞台裏」で「安価な」変更のみを実行することによって「ごまかす」ことが魅力的です。 .
もちろん、問題は、アプリケーションが一部またはすべてのオブジェクトへの参照を別の場所に保存することを選択する可能性があることです (そして、それを許可する必要があります)。そうなると、一意のオブジェクトの真のシーケンスの「幻想」が崩壊します。
Objective-C が許可する場合、この問題を解決するための巧妙な方法は、アプリケーションが実際に別の場所に参照を格納するタイミングを検出し、それが発生した場合はいつでも、次の要素を生成する変更を適用する前に、オブジェクトをそれ自体のコピーで置き換えることです。シーケンスで。
このイディオムの正式名称はわかりませんが、「copy on write if leaked」、「copy on write if shared」、または単に「copy on write」と呼ぶことができます。
私の質問は次のとおりです。ARC が有効になっている Objective-C では、そのようなイディオムを実装できますか?
そして、Objective-C でこの種の問題を解決する正しい方法はありますか?
ARC を有効にすると、オブジェクトから参照カウントを抽出したり、それをインクリメントおよびデクリメントするメソッドをオーバーライドしたりできないことに気付きました。
編集:プロパティに適用できる属性があることに気付きましたがcopy
、それを理解するのに苦労しています。それがどのように機能するか説明できる人はいますか?
http://clang.llvm.org/docs/AutomaticReferenceCounting.html#property-declarations