2010-03-04 51 views
0

我正在使用以下代码在Iphone应用程序中显示下一个视图(表格视图)。Iphone应用程序崩溃 - 但有时可以使用(50%-50%)

这一段时间的工作,并没有任何异常一段时间的应用程序崩溃日志

的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); 
    } 
} 

任何人都可以指导我这个问题。

感谢

阿米特Battan

+0

为什么你想这个问题是一个“社区维基”?!? – Meltemi 2010-03-04 15:03:06

回答

4

你不应该这样做:因为在这一行

[tempArrIniId release]; 

...

NSArray *tempArrIniId = [eventInitiationArray valueForKey:@"act_id"]; 

...你是不是创造tempArrIniId你只是获得对它的引用。因此,你没有保留它,也没有必要释放它。

由于在释放由tempArrIniId指向的对象时,您正在发生间歇性崩溃,而该对象仍是eventInitiationArray的成员。当数组尝试访问该对象或甚至自行计数时,它会崩溃,因为没有它期望的对象。该崩溃可能发生在使用'eventInitiationArray'的应用程序中的任何地方。

过度释放导致更多的问题比它阻止。如有疑问,请勿放行。如果你没有发布你应该拥有的东西,而且修复它是微不足道的,那么用分析工具找到内存泄漏是很简单的。

由于过度释放由其他对象(例如数组)所持有的对象而导致崩溃很难追踪,因为后续崩溃可能发生在远离释放发生的地方。