0

手動参照カウントと Xcode 4.5 を使用しています。

ivar を宣言しました。

UIAccelerometer *accelerometer;

加速度計はプロパティではありませんでした。そして、私は1つの方法でこのコードを持っていました:

accelerometer = [UIAccelerometer sharedAccelerometer];
accelerometer.delegate = self;

私が持っていた2番目の方法では:

accelerometer.delegate = nil;

後で実行する別の方法では、次のことがありました。

accelerometer.delegate = self;

このセットアップでは、時折 (めったに、一見ランダムに) 次の中断が発生しました。

'NSInvalidArgumentException'、理由: '-[NSPathStore2 setDelegate:]: 認識されないセレクターがインスタンス xxx に送信されました

この中断の理由を探して多くのフラストレーションを感じた後、加速度計を最初に使用したときに保持を試みましたが、その後中断はありませんでした。しかし、保持が実際の問題を解決していないのではないかと心配しています。この「解決策」を考える理由は、中止メッセージがsetDelegateの呼び出しについて不平を言っていて、関連していると思われるコードのセクションで、設定していた唯一のデリゲートが加速度計にあったためです。しかし、なぜこれで修正する必要があるのか​​ わかりません.retainが問題を隠すためにコードを移動しているだけなのではないかと心配しています.

私がそれを理解する方法はそれです

accelerometer = [UIAccelerometer sharedAccelerometer];

インスタンスの期間中同じアドレスを持つシングルトン インスタンスを作成し、そのアドレスが加速度計に割り当てられます。これもインスタンスの期間中存在します。その場合、保持によって何かが変わるのはなぜですか?

インスタンスの割り当てが解除される前に、sharedAccelerometer シングルトンの割り当てが解除されることはありますか?

4

1 に答える 1

0

加速度計がivarの場合、そこに置いたオブジェクトを保持することは正しいです...したがって、このコード

accelerometer = [UIAccelerometer sharedAccelerometer];
accelerometer.delegate = self;

する必要があります

accelerometer = [ [ UIAccelerometer sharedAccelerometer ] retain ] ;
accelerometer.delegate = self;

-dealloc、追加します

[ accelerometer release ] ;
accelerometer = nil ;
于 2012-10-12T18:12:59.637 に答える