2009-10-03 17 views
5

Ich habe diese große Tabelle, die ohne Fehler funktioniert, auch wenn mir im Vergleich zu komplexeren Zellen, die ich von heruntergeladenen Beispielen geöffnet habe, zu langsam scheint. Das Problem kommt, wenn ich eine Zelle klicken, kam dann zurück, in wenigen Sekunden Scrollen schnell der App auf der Linie abstürzt: charImage.image = [self imageForIndex:ch.charId];Warum stürzt meine App ab? UITable und Controller

Wenn ich es löschen wird in der nächsten Zeile Absturz: titleLabel.text = ch.title;

Ist jemand damit vertraut? Vielen Dank.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
//NSLog(@"add a new cell at index path %@", indexPath); 
// Each subview in the cell will be identified by a unique tag. 
static NSUInteger const kTitleLabelTag = 2; 
static NSUInteger const kCharImageTag = 3; 
static NSString *kCellID = @"CellID"; 

// Configure the cell 


// Declare references to the subviews which will display the char data. 
UILabel *titleLabel = nil; 
UIImageView *charImage = nil; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellID]; 

if (cell == nil) { 
    // No reusable cell was available, so we create a new cell and configure its subviews. 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellID] autorelease]; 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    [cell setBackgroundColor:[UIColor clearColor]]; 
    // 
    charImage = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"glyphs/a/1.png"]] autorelease]; 
    charImage.tag = kCharImageTag; 
    charImage.autoresizingMask = UIViewAutoresizingNone; 
    [cell.contentView addSubview:charImage]; 

    titleLabel = [[[UILabel alloc] initWithFrame:CGRectMake(60, 10, 215, 20)] autorelease]; 
    titleLabel.tag = kTitleLabelTag; 
    titleLabel.font = [UIFont systemFontOfSize:16]; 
    titleLabel.textColor = [UIColor whiteColor]; 
    titleLabel.backgroundColor = [UIColor clearColor]; 
    titleLabel.adjustsFontSizeToFitWidth = YES; 
    [cell.contentView addSubview:titleLabel]; 

} else { 
    // A reusable cell was available, so we just need to get a reference to the subviews using their tags. 
    charImage = (UIImageView *)[cell.contentView viewWithTag:kCharImageTag]; 
    titleLabel = (UILabel *)[cell.contentView viewWithTag:kTitleLabelTag]; 
} 


// Get the specific info for this row. 
NSUInteger section = [indexPath section]; 
NSUInteger row = [indexPath row]; 
Char *ch = (Char *)[charsList objectAtIndex:row+section*26]; 

// Set the relevant data for each subview in the cell. 
// Set the image in the cell 
charImage.image = [self imageForIndex:ch.charId]; 
[charImage sizeToFit]; 

int centerX = 30; 
int centerY = 23; 
CGSize size = charImage.frame.size; 
charImage.frame = CGRectMake((int)(centerX - size.width/2), 
          (int)(centerY - size.height/2), 
          size.width, size.height); 

titleLabel.text = ch.title; 

return cell; 

}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

InstantInsightAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
NSUInteger section = [indexPath section]; 
NSUInteger row = [indexPath row]; 
Char *ch = (Char *)[charsList objectAtIndex:row+26*section]; 

SqlQueries *db = [SqlQueries alloc]; 
NSArray *glyphsList = [db readGlyphsFromDatabaseAtId: ch.charId]; 
NSArray *charDescription = [db readMoreInfoFromDatabaseAtId: ch.charId]; 
Char *charDetails = [db readInstructionsAndQuotesFromDatabaseAtId: ch.charId]; 
[db release]; 
[ch release]; 

// Navigation logic -- create and push a new view controller 
self.glyphsView = [[GlyphsViewController alloc] initWithStyle:UITableViewStyleGrouped]; 

self.glyphsView.glyphsList = glyphsList; 
self.glyphsView.charDetails = charDetails; 
self.glyphsView.charDescription = charDescription; 
[delegate.navController pushViewController:self.glyphsView animated:YES]; 
[self.glyphsView release]; 
self.glyphsView = nil; 

}


Hier ist ein detaillierter Fehler: es sagt nichts, aber ich bin sicher, dass ich etwas mit einer Ausnahme gesehen habe

[Sitzung gestartet am 2009-10-05 07:41:25 +0300.] GNU gdb 6.3.50-20050815 (Apple-Version gdb-967) (Di Jul 14 02:11:58 UTC 2009) Urheberrecht 2004 Free Software Foundation, Inc. GDB ist freie Software, die von der GNU General Public License abgedeckt wird, und Sie sind willkommen, es zu ändern und/oder Kopien davon unter bestimmten zu verteilen Bedingungen. Geben Sie "show copying" ein, um die Bedingungen zu sehen. Es besteht keinerlei Garantie für GDB. Geben Sie "show guarantee" für Details ein. Diese GDB wurde konfiguriert als "i386-apple-darwin" .sharedlibrary gelten lasteten Regeln alle Anbringen 96464. (GDB)^C wo

#0 0x95fd5688 in objc_msgSend() 
#1 0x00002f60 in -[IndexViewController tableView:cellForRowAtIndexPath:] (self=0xd19610, _cmd=0x319a6b9c, tableView=0x101be00, indexPath=0xd2e890) at /Users/Cristi/Documents/xcode - iPhone/Instant Insight/InstantInsight/Classes/IndexViewController.m:115 
#2 0x30944bd0 in -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:]() 
#3 0x3093e1fc in -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:]() 
#4 0x309501f1 in -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow]() 
#5 0x30947715 in -[UITableView layoutSubviews]() 
#6 0x00b3dd94 in -[CALayer layoutSublayers]() 
#7 0x00b3db55 in CALayerLayoutIfNeeded() 
#8 0x00b3d3ae in CA::Context::commit_transaction() 
#9 0x00b3d022 in CA::Transaction::commit() 
#10 0x00b452e0 in CA::Transaction::observer_callback() 
#11 0x30245c32 in __CFRunLoopDoObservers() 
#12 0x3024503f in CFRunLoopRunSpecific() 
#13 0x30244628 in CFRunLoopRunInMode() 
#14 0x32044c31 in GSEventRunModal() 
#15 0x32044cf6 in GSEventRun() 
#16 0x309021ee in UIApplicationMain() 
#17 0x00002718 in main (argc=1, argv=0xbfffee50) at /Users/Cristi/Documents/xcode - iPhone/Instant Insight/InstantInsight/main.m:14 
+0

Zeichen * ch = (Zeichen *) [ZeichenListe ObjektAtIndex: Zeile + Abschnitt * 26]; sieht sehr komisch aus. Welche Art von Objekten stellst du in charsList ein? – diederikh

+0

Ich setze Char Objekte. Char enthält nur wenige NSS-Strings, die aus der Datenbank gefüllt werden. Wenn ich diese Werte einfach NSLogle, sind sie in Ordnung, sogar zu der Zeit stürzt ab. –

Antwort

5

Welche Art von "Absturz" zu verarbeiten? Ein EXC_BAD_ACCESS (Dereferenzierung eines Zeigers, der nicht auf einen gültigen Ort zeigt)? Oder ein objc_exception_throw irgendeiner Art?

Sie bedeuten Unter der Annahme, ein EXC_BAD_ACCESS ...

Dies wäre, weil der „ch“ Wert von [charsList objectAtIndex:row+section*26] zurück kein gültiges Objekt ist.

Der genaue Grund dafür müssen Sie herausfinden, aber die wahrscheinlichste Ursache ist, dass Sie das Objekt zu oft freigegeben haben. Es besteht auch die Möglichkeit, dass das Objekt kein gültiges Objective-C-Objekt war, als es in das NSArray eingefügt wurde.

Manchmal hilft es, NSZombieEnabled zu setzen (command-option-x, gehe zur Registerkarte Argumente und füge name = NSZombieEnabled und value = 1 zu den Umgebungsvariablen hinzu), da dies sofort eine Exception auslöst, wenn du eine Freigabe nimmst Objekt.

-

Unrelated stilistische Punkt: Sie SqlQueries Zuweisung aber initialisiert es nicht. Wenn Sie alloc, immer, immer init. d.h. [[SqlQueries alloc] init]. Wenn Sie sich nicht um init kümmern, weil Sie keine Instanzvariablen haben, dann sollten Sie sowieso keine alloc haben, Ihre Methoden sollten stattdessen Klassenmethoden sein.

+0

Vielen Dank für die ausführlichen Erklärungen. Ich denke, ich kann etwas in die Init der SqlQueries setzen. Nun, ich bin sicher, dass mein Fehler ist, dass man mit der Ausnahme, weil es dort ist, wo ich die Idee, einen Versuch zu fangen fangen, und leider immer noch abstürzt, wird der Nslog aus dem Fang nicht aufgerufen. Ich bin mir nicht sicher, was ich noch über meinen Code erzählen soll. –

+0

Sie können keine EXC_BAD_ACCESS abfangen. Sie müssen herausfinden, warum Ihre Objekte in der charList ungültig sind. Verwenden Sie Haltepunkte im Debugger oder NSLog die ganze charList regelmäßig, um zu sehen, wenn es schief geht (NSLog wird das Programm abstürzen, sobald ein CharList-Objekt ungültig wird). Wahrscheinlich haben Sie irgendwo Code, der eines der Char-Objekte freigibt (oder automatisch weiterleitet), wenn es es nie zugewiesen oder behalten hat - dies verursacht, dass das Char-Objekt ungültig gemacht wird, obwohl es immer noch von der charList benötigt wird Array. –

+0

Also ja, ich habe genauer hingeschaut, um zu sehen, ob ich das Char-Objekt aus dem Array entferne, wie du gesagt hast, und ich habe es getan. Die Antwort ist, diese Zeile zu löschen: [ch release]; Danke nochmal. –

Verwandte Themen