Iphone App崩溃 - 但有时可行(50%-50%)

时间:2010-03-04 14:24:22

标签: iphone cocoa-touch cocos2d-iphone

我正在使用以下代码在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

1 个答案:

答案 0 :(得分:4)

你不应该这样做:

 [tempArrIniId release];

因为在这一行......

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

...您没有创建tempArrIniId您只是获取对它的引用。因此,您没有保留它,也没有必要释放它。

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

过度释放导致的问题多于预防。如有疑问,请勿发布。如果你没有发布你应该拥有的东西,那么使用分析工具找到内存泄漏是微不足道的,修复它是微不足道的。

跟踪因过度释放其他对象(如阵列)所持有的对象而导致的崩溃要困难得多,因为后续崩溃可能发生在发生过度释放的地方。