0

私が理解しているように、デリゲートまたはデータソースであるコントローラーを保持するべきではありません。プロパティアクセサーで作成されたUIPickerViewを次のように作成しました。

-(UIPickerView *)projectPicker {
  if (_projectPicker != nil) {
      return _projectPicker;
  }

  //Create Picker View
  UIPickerView *picker = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 185, 0, 0)];
  picker.showsSelectionIndicator = YES;
  //Create source and delegate
  NSString *titleForRow0 = NSLocalizedString(@"<<Make Selection>>", @"projectPicker nil Label 0");
  NSArray *titlesForFirstRows = [[NSArray alloc] initWithObjects:titleForRow0, nil];
  ProjectPickerDatasource *pickerSource = [[ProjectPickerDatasource alloc] initWithManagedObjectContext:self.managedObjectContext
                                                                                      selectedProject:self.currentProject
                                                                                andTitlesForFirstRows:titlesForFirstRows];
  [titlesForFirstRows release];
  picker.delegate = pickerSource;
  picker.dataSource = pickerSource;

  self.projectPicker = picker;

  [pickerSource release];
  [picker release];


  return _projectPicker;

}

これにより、pickerSource の未割り当てのインスタンスにアクセスしようとするとクラッシュします。pickerSource コンポーネントを別のプロパティとして分割して、このコントローラー内に保持すると、完全に機能します。それが適切な実装だとは思いませんでした。pickerView は、破棄されるまでデリゲートとデータソースを保持しませんか?

4

2 に答える 2

1

ほとんどの場合 (私の知る限り)、デリゲートはクラスによって保持されません。このように割り当てられているだけで、

@property(nonatomic, assign) id <TheDelegateClass> delegate;

デリゲートのジョブが終了するまで、デリゲートを保持するのは呼び出し元の責任です。

あなたの質問に対する答えは、 UIPickerView がデリゲートを保持しないことです。代わりにそれを保持することを期待しています。

于 2011-10-02T14:13:05.210 に答える
1

ピッカーがデータソースをインスタンス化する場合、それを保持しても問題ありません。どこかに保持する必要があります。必ずリリースしてください。

データソースはデリゲートとは異なる方法で処理されることに注意してください。

于 2011-10-02T14:04:38.000 に答える