在UIPickerView中的numberOfRowsInComponent中返回[anArray count]时出错

时间:2011-07-28 18:01:38

标签: objective-c ios cocoa-touch uiviewcontroller uipickerview

我有一个UIViewController,它有一个UIPickerView和UITableView。 UIPicker有3个组件。

当我尝试通过返回[anArray count]来定义每个数组中的组件数时,程序冻结而不会在加载UIViewController时抛出错误。

当我将viewDidLoad:中的NSLog放入[self.hours count][self.minutes count][self.meridiem count]时,会返回正确数量的值。

- (void)viewDidLoad {

[super viewDidLoad];

NSMutableArray *tempHours = [NSMutableArray array];
for (NSInteger i = 0; i < 12; i++) [tempHours addObject:[NSNumber numberWithInteger:(i+1)]];
self.hours = [NSArray array];
hours = tempHours;
[tempHours release];

NSMutableArray *tempMinutes = [NSMutableArray array];
for (NSInteger i = 0; i <= 59; i++) [tempMinutes addObject:[NSNumber numberWithInteger:i]];
self.minutes = [NSArray array];
minutes = tempMinutes;
[tempMinutes release];

NSMutableArray *tempMeridiem = [NSMutableArray array];
for (NSInteger i = 0; i <= 1; i++) [tempMeridiem addObject:[NSNumber numberWithInteger:i]];
self.meridiem = [NSArray array];
meridiem = tempMeridiem;
[tempMeridiem release];

}

现在,在pickerView:numberOfRowsInComponent:Component:中,如果我尝试输出[anArray count](其中anArray是占位符数小时,分钟和meridiem),代码会冻结而不会出现错误。如果我将numberOfRows设置为整数值,或者设置为component+1,一切正常。

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

NSInteger numberOfRows;

if (component == 0) {
    // numberOfRows = component+1;
    numberOfRows = [self.hours count];
}
else if(component == 1) { 
    // numberOfRows = component+1;
    numberOfRows = [self.minutes count];
}
else { 
    // numberOfRows = component+1;
    numberOfRows = [self.meridiem count];
}

return numberOfRows;

}

我感觉我的NSArrays(小时,分钟,meridiem)没有被保留,但运行分析器并没有告诉我该ViewController中有任何内存泄漏。

非常感谢任何和所有帮助!

3 个答案:

答案 0 :(得分:1)

您正在创建不必要的数组,而不是保留那些重要的数组。看你的代码:

self.hours = [NSArray array]; 
hours = tempHours; 
[tempHours release];

在这里,您创建了一个自动释放的数组,并将其设置为您的self.hours属性(希望附加retain关键字)。但是下一行你直接访问ivar并将其设置为tempHours。然后,您发送一条发布消息给tempHours,而不保留它。由于tempHours是自动释放的,它会神奇地消失在自动释放池的下一个排水管上。我相信你想做的是:

self.hours = tempHours;

同样适用于其他数组集合。

答案 1 :(得分:0)

这些行错了:

self.hours = [NSArray array];
hours = tempHours;

你应该使用

self.hours = tempHours;

原始代码中发生了什么:

  1. self.hours设置为[NSArray array]创建的数组。称之为a。正确保留a

  2. 现在,hours设置为tempHours。这直接访问ivar,而不使用setter。因此,它不会保留tempHoursa在没有正确释放的情况下丢失了。

  3. tempHours已发布。它不会被任何人保留,所以它也被解除了。

  4. 所以,不要这样做。您想阅读the memory management guide。我无法相信分析器(在Build命令下面)没有发现这个错误...也许您想向LLVM团队提交有关此案例的错误。

答案 2 :(得分:0)

问题出在我试图显示的ViewController中。我只是将界面和实现文件复制到一个新的项目中,一旦我编译它,一切都像梦一样。

问题在于我的项目的RootViewController,它使用UIPickerView以模态方式调用控制器。显然,我有一个内存泄漏。应该是微不足道的修复。

感谢大家的帮助!