我正在使用以下代码在Iphone应用程序中显示下一个视图(tableview)。
有时候工作和应用程序崩溃没有任何异常日志
的NSLog(@ “OK”);每次都是日志 50%尝试应用程序崩溃
-(IBAction)statusInitiationButAction:(id)sender{
@try {
NSArray *tempArrIniId = [eventInitiationArray valueForKey:@"act_id"];
int s;
if([tempArrIniId containsObject:selectedInitiateId]){
s=[tempArrIniId indexOfObject:selectedInitiateId];
}
[tempArrIniId release];
NSString *selStatusId = [NSString stringWithString:[[eventInitiationArray objectAtIndex:s] objectForKey:@"status_id"]];
for (int i=0; i<[statusInitiationArray count]; i++) {
id statusDict = [statusInitiationArray objectAtIndex:i];
if ([selStatusId intValue] == [[statusDict objectForKey:@"id"] intValue]) {
[statusDict setValue:@"1" forKey:@"selected"];
[statusInitiationArray replaceObjectAtIndex:i withObject:statusDict];
}else {
[statusDict setValue:@"0" forKey:@"selected"];
[statusInitiationArray replaceObjectAtIndex:i withObject:statusDict];
}
}
NSLog(@"statusInitiationTable...%@",statusInitiationArray);
[statusInitiationTable.tableView reloadData];
[[self navigationController] pushViewController:statusInitiationTable animated:YES];
NSLog(@"ok");
}@catch (NSException * e) {
NSLog(@"statusInitiationButAction....%@",e);
}
}
任何人都可以指导我解决这个问题。
由于
Amit Battan
答案 0 :(得分:4)
你不应该这样做:
[tempArrIniId release];
因为在这一行......
NSArray *tempArrIniId = [eventInitiationArray valueForKey:@"act_id"];
...您没有创建tempArrIniId
您只是获取对它的引用。因此,您没有保留它,也没有必要释放它。
您正在进行间歇性崩溃,因为当该对象仍然是tempArrIniId
的成员时,您过度释放eventInitiationArray
指向的对象。当数组尝试访问该对象或甚至自己计数时,它会崩溃,因为没有一个它期望的对象。崩溃可能发生在应用程序中使用'eventInitiationArray'的任何地方。
过度释放导致的问题多于预防。如有疑问,请勿发布。如果你没有发布你应该拥有的东西,那么使用分析工具找到内存泄漏是微不足道的,修复它是微不足道的。
跟踪因过度释放其他对象(如阵列)所持有的对象而导致的崩溃要困难得多,因为后续崩溃可能发生在发生过度释放的地方。