我有一个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中有任何内存泄漏。
非常感谢任何和所有帮助!
答案 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;
原始代码中发生了什么:
self.hours
设置为[NSArray array]
创建的数组。称之为a
。正确保留a
。
现在,hours
设置为tempHours
。这直接访问ivar,而不使用setter。因此,它不会保留tempHours
。 a
在没有正确释放的情况下丢失了。
tempHours
已发布。它不会被任何人保留,所以它也被解除了。
所以,不要这样做。您想阅读the memory management guide。我无法相信分析器(在Build命令下面)没有发现这个错误...也许您想向LLVM团队提交有关此案例的错误。
答案 2 :(得分:0)
问题出在我试图显示的ViewController中。我只是将界面和实现文件复制到一个新的项目中,一旦我编译它,一切都像梦一样。
问题在于我的项目的RootViewController,它使用UIPickerView以模态方式调用控制器。显然,我有一个内存泄漏。应该是微不足道的修复。
感谢大家的帮助!