2010-12-05 76 views
0

我有我的工作计划,这是什么情况:EXC_BAD_ACCESS我不知道如何找到问题

我有一个视图控制器(NewGameViewController)调用的对象。该对象将一个.txt文件读入数组,然后执行一个while循环来填充核心数据数据库。我在填充数据库时遇到了问题,但最终能够将其排除。不过,我现在得到EXC_BAD_ACCESS后返回到NewGameViewController。

我一直在试图追查问题,但一直没有成功(我是新来的)。但是我确实相信这个问题是在while循环中的某个地方。我只是无法弄清楚如何识别错误,甚至不知道它在哪里崩溃。

顺便说一句,它似乎像数据库的实际加载效果很好,只是记录最后的.txt记录包含“99999”。

- (void)populateTheDatabase { 
NSLog(@"\n \n >>>>> START populateTheDatabase <<<<< \n \n"); 
NSLog(@">>populateTheDatabase<<"); 
// 
// Init parameters 
NSError *error = nil; 
int xx = 0;   // Loop number 
int eOF;   // Keep track of EOF in array 
int keyNumber = 0; 
NSString *qNr = [[NSString alloc] init]; 
int myInt; 
// 
//=========PREPARE CORE DATA DB===========// 
if (managedObjectContext == nil) { managedObjectContext = [(FamQuiz_v2AppDelegate *) 
                  [[UIApplication sharedApplication] delegate] managedObjectContext]; } 
// Define qContext 
NSManagedObjectContext *qContext = [self managedObjectContext]; 
//===============DELETE ALL RECORDS================// 
NSLog(@"\n \n Delete all records"); 
NSFetchRequest * allQzs = [[NSFetchRequest alloc] init]; 
[allQzs setEntity:[NSEntityDescription entityForName:@"questions" inManagedObjectContext:qContext]]; 
[allQzs setIncludesPropertyValues:NO]; //only fetch the managedObjectID 
// 
error = nil; 
NSArray * qZs = [qContext executeFetchRequest:allQzs error:&error]; 
[allQzs release]; 
//error handling goes here 
for (NSManagedObject * rZ in qZs) { 
    [qContext deleteObject:rZ]; 
} 
// 
//=========COUNT ENTITIES IN DB BEFORE INSERT DATA=========== 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity: [NSEntityDescription entityForName: @"questions" inManagedObjectContext: qContext]]; 
// 
error = nil; 
NSUInteger countE = [qContext countForFetchRequest: request error: &error]; 
NSLog(@"#entities in DB before insert: %i", countE); 
[request release]; 
// 
// 
// Fill myString with questions from the .txt file and then read .txt file 
NSString *filePath = @"/Users/PeterK/Documents/FamilyQuiz/FamQuiz_v2_02/loadq101023v2.txt"; 
NSString *myString = [[NSString alloc] initWithContentsOfFile:filePath]; 
// 
// Load array 
NSArray* myArray = [myString componentsSeparatedByString:@"\r"]; 
//NSLog (@"\n \n Number of elements in myArrayX = %i", [myArrayX count]); 
NSLog (@"\n \n Number of elements in myArray = %i", [myArray count]); 
// 
//NSLog(@"myArray: %@", myArray); 
// 
while (eOF != 99999) { 
    NSLog(@"xx: %i", xx); 
    qNr = [myArray objectAtIndex:xx]; 
    eOF = [qNr intValue]; 
    // 
    if (eOF != 99999) { 
     NSManagedObject *famQuizInfo = [NSEntityDescription 
             insertNewObjectForEntityForName:@"questions" 
             inManagedObjectContext:qContext]; 
     // index = 0 : 'record number' 
     [famQuizInfo setValue:[NSNumber numberWithInt:keyNumber] forKey:@"idQ"]; 
     keyNumber = keyNumber++; 
     NSLog(@"nr: %i - myArray 0: %@", xx, [myArray objectAtIndex:xx]); 
     xx = xx++; 
     // index = 1 : 'difficulties level' 
     NSString *myObject1 = [[NSString alloc] init]; 
     myObject1 = [myArray objectAtIndex:xx]; 
     myInt = [myObject1 intValue]; 
     [famQuizInfo setValue:[NSNumber numberWithInt:myInt] forKey:@"qDiff"]; 
     NSLog(@"nr: %i - myArray 1: %@", xx, [myArray objectAtIndex:xx]); 
     xx = xx++; 
     [myObject1 release]; 
     // index = 2 : 'category' not existing in the DB anymore, but exist in the .txt 
     NSLog(@"nr: %i - myArray 2: %@", xx, [myArray objectAtIndex:xx]); 
     xx = xx++; 
     // index = 3 : 'question' 
     [famQuizInfo setValue:[myArray objectAtIndex:xx] forKey:@"question"]; 
     NSLog(@"nr: %i - myArray 3: %@", xx, [myArray objectAtIndex:xx]); 
     xx = xx++; 
     // index = 4 : 'right answer' 
     [famQuizInfo setValue:[myArray objectAtIndex:xx] forKey:@"qRightAnswer"]; 
     NSLog(@"nr: %i - myArray 4: %@", xx, [myArray objectAtIndex:xx]); 
     xx = xx++; 
     // index = 5 : 'wrong answer #1' 
     [famQuizInfo setValue:[myArray objectAtIndex:xx] forKey:@"qWrongAnswer1"]; 
     NSLog(@"nr: %i - myArray 5: %@", xx, [myArray objectAtIndex:xx]); 
     xx = xx++; 
     // index = 6 : 'wrong answer #2' 
     [famQuizInfo setValue:[myArray objectAtIndex:xx] forKey:@"qWrongAnswer2"]; 
     NSLog(@"nr: %i - myArray 6: %@", xx, [myArray objectAtIndex:xx]); 
     xx = xx++; 
     // placeholder for number of times the question is asked 
     [famQuizInfo setValue:[NSNumber numberWithInt:0] forKey:@"qNrAccess"]; 
     // date when the question was registred 
     [famQuizInfo setValue:[NSDate date] forKey:@"qRegDate"]; 
     // 
     NSLog (@"\n ============== \n"); 
     // 
     // 
     if (![qContext save:&error]) { 
      NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); 
      error = nil; 
      if (![qContext save:&error]) { 
       NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); 
       // 
       if(![[famQuizInfo managedObjectContext] save:&error]) { 
        NSLog(@"Failed to save to data store: %@", [error localizedDescription]); 
        NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey]; 
        if(detailedErrors != nil && [detailedErrors count] > 0) { 
         for(NSError* detailedError in detailedErrors) { 
          NSLog(@" DetailedError: %@", [detailedError userInfo]); 
         } 
        } 
        else { 
         NSLog(@" %@", [error userInfo]); 
        } 
       } 
      } 
     } 
    } 
} 
// 
// 
//=========COUNT ENTITIES IN DB AFTER INSERT DATA=========== 
NSFetchRequest *request2 = [[NSFetchRequest alloc] init]; 
[request2 setEntity: [NSEntityDescription entityForName: @"questions" inManagedObjectContext: qContext]]; 

error = nil; 
NSUInteger count2 = [qContext countForFetchRequest: request2 error: &error]; 
NSLog(@"#entities in DB after insert: %i", count2); 
[request2 release]; 
// 
// 
[qNr release]; 

}

回答

4

如果有碰撞,有一个回溯。发表它。

崩溃发生在哪里?您应该能够从调试器获得回溯,或者应该有可用的崩溃报告。


这里是一个问题:

NSString *qNr = [[NSString alloc] init]; 
... later .... 
qNr = [myArray objectAtIndex:xx]; 
... even later ... 
[qNr release]; 

即泄漏(不释放第一串中的分配)和崩溃(释放一个从未保持的对象)。

而另一个问题:

NSString *myObject1 = [[NSString alloc] init]; 
    myObject1 = [myArray objectAtIndex:xx]; 
    ... 
    [myObject1 release]; 

在这两种情况下,无论是alloc/init,也不是release是必要的。


memory management guide可能会很有帮助。

+0

谢谢,解决了这个问题。我将读取alloc/init,需要。 – PeterK 2010-12-05 19:54:48

0

你正在发布一些已经发布的东西(可能)。

尝试取出线条 [qNr release]; [request2 release]; [请求发布];

看看会发生什么。

通过请求命令,您通常可以执行自动释放,防止泄漏。

0

更好地使用NSZombie来找出实际问题。通常是因为你释放了两次相同的内存。

干杯, Raxit

+0

Raxit,非常感谢。以前从未听说过NSZombie。看着它,它看起来像一个非常好的使用:-) – PeterK 2010-12-06 16:24:22