2010-12-05 18 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