UIPickerView:排序&显示值数组会导致移动时崩溃?

时间:2012-08-30 04:00:44

标签: objective-c sorting nsmutablearray nsarray uipickerview

我正在尝试将字符串的NSMutableArray按字母顺序排序,并在UIPickerView中显示已排序的列表。我正在使用另一个NSArray来创建一个排序列表。

我正在使用PickerView委托方法并将它们包含在我的.h设置中:并连接了dataSource&委托出口到filesOwner。在我的.h文件中,我还创建了一个IBOutlet UIPickerView * pickerView;并为它创建了一个合成属性:

@property (nonatomic, retain) IBOutlet UIPickerView *pickerView;

尝试解决问题,我首先通过执行以下操作将未分类的NSMutableArray作为源:

- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {

return [pickerArray objectAtIndex:row];
}

我未分类的MutableArray没有问题,并且在PickerView中显示数据(未排序)没有问题但是当我将数组更改为我的排序NSArray时,我试图移动PickerView后发生崩溃!两个数组中的项目的NSLog显示相同数量的项目,相同的数据(显示不同)但Xcode报告EXC_BAD_ACCESS ??我无法想出这一个??

这是我的代码:(注意:sortedPickerArray是NSArray,pickerArray是我的.h文件中声明的NSMutableArray)

- (void)viewDidLoad{

[super viewDidLoad];

sortedPickerArray = [[NSArray alloc] init];

pickerArray = [[NSMutableArray alloc] initWithObjects:
               @"ObjectA",
               @"ObjectB",
               @"ObjectC",
               @"ObjectD",
               nil];

sortedPickerArray = [pickerArray sortedArrayUsingSelector: @selector(caseInsensitiveCompare:)];
[pickerView selectRow:0 inComponent:0 animated:NO];
pickerView.showsSelectionIndicator = YES;}


-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView{

return 1;
}

-(NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component{

return [sortedPickerArray count];
}

-(NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
return [sortedPickerArray objectAtIndex:row];
}

-(void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{

NSLog(@"Row %d was selected", row);
}

对此的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我在这个答案中假设你没有使用ARC,因为你有一个保留的属性。您可以使用以下语句为实例变量分配一个自动释放的值:

sortedPickerArray = [pickerArray sortedArrayUsingSelector: @selector(caseInsensitiveCompare:)];

稍后访问sortedPickerArray时,它已被解除分配。因此,再次假设您没有使用ARC,请在其中添加retain。并删除该行 sortedPickerArray = [[NSArray alloc] init];因为你现在正在泄漏这个数组。