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

Posted

技术标签:

【中文标题】UIPickerView:排序和显示值数组会导致移动时崩溃?【英文标题】:UIPickerView: Sorting & displaying an array of values causes crash when moved? 【发布时间】:2012-08-30 04:00:43 【问题描述】:

我正在尝试将 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);

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

太棒了!我非常感谢你 - 这成功了!你是对的,我没有使用ARC!我错过了自动发布的价值,这绝对是问题所在。哎呀,当我在 Xcode 和 *** 之间切换时,我忘了删除那一行(sortedPickerArray alloc)——我的错 :-) 酷!很高兴我帮了忙!请接受答案并投票,这将非常感谢!

以上是关于UIPickerView:排序和显示值数组会导致移动时崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

UIPickerView 中的 JSON 数组按父标签排序

如何让我的 UIPickerView 显示数组的所有元素

需要帮助显示排序的数组值

数组中的数据未显示在第二个 UIPickerView 中

延迟一段时间后显示 uipickerview

Swift UIPickerView 最后一列数据导致致命崩溃