2012-02-24 1 views
0

У меня есть объект NSMutableArray из QuoteMap. Когда я добавляю один, используя приведенный ниже код, и перехожу к другому представлению, в котором используются одни и те же данные, он запускает EXC_BAD_ACCESS при попытке доступа к этому массиву.Что это означает, что элемент NSArray отображается как NSObject вместо фактического класса?

Ниже вы можете видеть, что последним объектом в массиве является «NSObject» вместо «QuoteMap».

Screen Shot

Вот где я добавить quoteMap:

- (void)insertQuoteMap:(QuoteMap*)qm { 

// THEN TAKE THE QUOTE_MAP_ID, SUBJECT_ID AND QUOTE_ID AND INSERT INTO QUOTE_MAP TABLE 

NSInteger quoteMapId = [qm.quote_map_id intValue]; 
NSInteger subIdInt = [qm.subject_id intValue]; 
NSInteger quoteIdInt = [qm.quote_id intValue]; 

QuotesAppDelegate *appDelegate = (QuotesAppDelegate *)[[UIApplication sharedApplication] delegate]; 
FMDatabase *database = [FMDatabase databaseWithPath:appDelegate.getDBPath];  

if ([database open]) { 
    [database executeUpdate:@"insert into QUOTE_MAP(quote_map_id, quote_id, subject_id) values(?, ?, ?)", 
    [NSNumber numberWithInt:quoteMapId], [NSNumber numberWithInt:quoteIdInt], [NSNumber numberWithInt:subIdInt]]; 

    [database close]; 
} 

NSLog(@"QuoteMap inserted the quote_map_id of: %@", qm.quote_map_id); 

//Add the object 
[appDelegate addQuoteMap:qm]; 

[qm autorelease]; 
}; 

Это то, что вызывает вышеупомянутый метод:

QuotesAppDelegate *appDelegate = (QuotesAppDelegate *)[[UIApplication sharedApplication] delegate]; 
QuoteMap *qm = [[QuoteMap alloc] init]; 

NSInteger newQuoteMapId = [appDelegate getNextQuoteMapId]; 
NSLog(@"quote_map_id= %d subId = %@ quoteId = %@", newQuoteMapId, stringOfSubjectId, selectedQuote.quote_id); 

// INSERT INTO QUOTE_MAP TABLE 
NSString *stringOfId = [NSString stringWithFormat:@"%d", newQuoteMapId]; 

qm.quote_map_id = stringOfId; 
qm.subject_id = stringOfSubjectId; 
qm.quote_id  = selectedQuote.quote_id; 
//qm.isDirty  = YES; 

[qm insertQuoteMap:qm]; 

//Add it to the array. 
[qmv.quoteMaps addObject:qm]; 
[qmv.tableView reloadData]; 

if (tableAlert.type == SBTableAlertTypeMultipleSelct) { 
    UITableViewCell *cell = [tableAlert.tableView cellForRowAtIndexPath:indexPath]; 
    if (cell.accessoryType == UITableViewCellAccessoryNone) 
     [cell setAccessoryType:UITableViewCellAccessoryCheckmark]; 
    else 
     [cell setAccessoryType:UITableViewCellAccessoryNone]; 

    [tableAlert.tableView deselectRowAtIndexPath:indexPath animated:YES]; 
} 

//release 
[qm autorelease]; 
+1

Только боковое примечание, '- (void) insertQuoteMap: (QuoteMap *) qm' не принадлежит QuoteMap, который передан ему, поэтому он не должен автообновлять его в конце. –

+0

Это решило. Большое спасибо! Можете ли вы ответить на этот вопрос, чтобы я мог принять это? – jroyce

+0

О, хорошо, конечно. –

ответ

3

Ваш - (void)insertQuoteMap:(QuoteMap*)qm не является владельцем QuoteMap, который передается он, поэтому он не должен автообновлять его в конце.

Когда классы меняются во время выполнения таким образом, это часто является результатом чрезмерной регрессии, когда исходный объект больше не существует и область, в которой он занимал место в памяти, с тех пор был заполнен другим объектом.

Смежные вопросы