ここでは、「値渡し」と「参照渡し」という用語を誤用しています。あなたが本当に話しているのはですconst
。const
C ++では、可変クラスのインスタンスを参照できます。ObjCオブジェクトには同様の概念はありません(または、RubyではObjCよりもRubyに精通していませんが、私は信じています)。ObjCは、Cを介してconst
ポインターの概念を持っていますが、これらははるかに弱い約束です。
ObjCでこれを解決する最善の方法は、可能な限り値(不変)クラスを優先することです。詳細については、Objective-cのImutabilityを参照してください。
次善の解決策は、設計の問題として、この状況を回避することです。名前から明らかではないメソッドの副作用を避けてください。設計上の問題としてこれを回避することにより、発信者はそれについて心配する必要がなくなります。発信者と被呼者は同じチームに所属していることを忘れないでください。どちらも、他から自分自身を保護しようとしてはなりません。優れた命名と優れたAPI設計は、開発者がコンパイラを強制せずにエラーを回避するのに役立ちます。ObjCにはコンパイラの強制がほとんどないため、適切な命名と適切なAPI設計が絶対に重要です。Rubyについても同じことが言えますが、Rubyでの経験は限られていますが、Rubyは非常に動的な言語でもあります。
最後に、オブジェクトを変更すべきでないときに変更する動作の悪いAPIを扱っている場合は、オブジェクトを渡すことに頼ることができますcopy
。
ただし、これを最初から設計する場合は、可能な限り不変のクラスを使用することを検討してください。