0

xibファイルには、次のようにヘッダーファイルで参照しているスライダーがたくさんあります。

@property (nonatomic, retain) IBOutlet UISlider *slider1;
@property (nonatomic, retain) IBOutlet UISlider *slider2;
@property (nonatomic, retain) IBOutlet UISlider *slider3;

次に、ヘッダーファイルでNSArrayをそのように宣言します。

@property (nonatomic, retain) NSArray *sliders;

今私の実装では、viewDidLoadハンドラーの間にスライダーを配列に入力します

sliders = [NSArray arrayWithObjects:slider1, slider2, slider3, nil];

もちろん、プロパティは統合されています。これまでのところ、すべてうまく機能しています。ブレークポイントを使用すると、配列が正しく設定されていることがわかり、NSLogを使用してスライダーの値を取得できます。

問題は、ボタン送信イベントを処理するときに、その配列が空のように見えることです。この行は実行中止エラーを生成します。

id obj = [sliders objectAtIndex:0];

誰かが私が間違っているところを指摘するのを手伝ってもらえますか?これは、スライダーのコレクションまたはその問題に関するコントロールを操作する正しい方法ですか?文字列キーで参照できるように、理想的には辞書を使用してそれらを繰り返し処理したいと思いますが、単純な配列に落ち着きます。

4

3 に答える 3

3

交換

sliders = [NSArray arrayWithObjects:slider1, slider2, slider3, nil]; 

self.sliders = [NSArray arrayWithObjects:slider1, slider2, slider3, nil]; 

ivarに直接アクセスすることで、プロパティのメモリ管理を回避しているため、設定後に配列が解放されます。次に、リリースされたオブジェクトにメッセージを送信しているため、クラッシュが発生します。

于 2012-05-01T13:29:33.900 に答える
1

交換できますか:

   id obj = [sliders objectAtIndex:0];

  UISlider *obj = [sliders objectAtIndex:0];

また、電話してみてください

  self.sliders //instead of just sliders

それでもクラッシュするかどうかを確認し、配列がゼロ以外の場合に条件を作成してみてください...コンセントを接続しましたか?あなたはリリースを上回っていますか、それとも下回っていますか?あなたはARCにいますか?

重要な質問...

于 2012-05-01T13:26:17.997 に答える
0

コードを見ずに推測するのは難しいですが、私は次のものを探します:

  • NSLOGを使用してobjectAtIndexを使用する前に、行に配列を表示できますか
  • プロパティを使用してスライダー(self.sliders)に割り当てていますか?そうでない場合は、割り当て解除された配列にアクセスすることになります。
  • ARCを使用していない場合、NSZombiesを使用して問題を追跡しようとしましたか?
于 2012-05-01T13:28:10.750 に答える