1

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

我使用 PickerView 委托方法并将它们包含在我的 .h 设置中:并将数据源和委托出口连接到 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);
}

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

4

1 回答 1

1

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

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

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

于 2012-08-30T04:12:02.523 回答