0

永続的である必要があるivarへの参照を保持している状況があります。あるオブジェクトには、別のオブジェクトのivarへのポインターの配列があり、プログラムの存続期間全体にわたって使用されます。言い換えれば、私は値を取得するために参照を渡すだけではありません-私はポインタを保持しています。

これは有効ですか?ivarsが動く可能性はありますか?オブジェクトのインスタンス化されたオブジェクトが実行時にプログラムに認識されずに移動される場合がありますか?または、オブジェクトは作成された場所に正確にとどまりますか。後者の場合、私のように参照を使用しない理由はありますか?

ARCを使用しています。

注:これは、最初からこれを設計するための良い方法ではなかったかもしれませんが、...すべて完了し、99%機能しています!(電話全体を再起動する厄介なクラッシュを除いて...)

4

3 に答える 3

3

オブジェクトとそのインスタンス変数は、一度作成されると移動しません。ただし、ivarを保持するオブジェクトへの強力な参照も保持する必要があります。そうしないと、オブジェクトの割り当てが解除され、ダングリングポインタが残る可能性があります。

一般に、別のオブジェクトのインスタンス変数へのポインタを使用することは非常に悪い考えであることに注意してください。

于 2012-08-24T18:42:51.330 に答える
0

クラスAのオブジェクトがクラスBのオブジェクトのivarに永続的にアクセスしたいとします(あなたの例では)。

通常は、クラスAにプロパティ(のstrongような注釈を付けて@property (strong) ClassB *myBVar)を作成し、クラスBのオブジェクトを参照します。Bのプロパティを設定または読み取る場合は、ドット表記を使用するか、getter/setterメソッドを呼び出します。

myBVar.name = @"Jim";
NSLog(@"Name:%@",myBVar.name);

[myBVar setName:@"Jim"];
NSLog(@"Name:%@",[myBVar name]);

実装が変更される可能性があるため、ivarを直接呼び出すことはありません。

于 2012-08-24T19:18:16.630 に答える
0

(robが述べたように)外部からivarにアクセスすることに技術的な問題はありませんが、考慮すべきアーキテクチャ設計はまだあります。あなたが採用したアプローチはカプセル化を破ります。さらに、Objective-Cでは非常にまれです。

したがって、コードの保守性に関しては、コードをリファクタリングすることをお勧めします。Objective-CfriendではC++のように宣言がないため、宣言クラスの外部からivarにアクセスすることは珍しいことです。

于 2012-08-24T18:52:49.010 に答える