为什么我的应用程序崩溃了?UITable和控制器

Cri*_*uță 6 iphone cocoa-touch objective-c

我有这个大表没有错误的工作,即使我看起来比从下载的例子打开的更复杂的单元格太慢了.问题来自我点击一个单元格,然后回来,在几秒钟内快速滚动应用程序崩溃在该行:charImage.image = [self imageForIndex:ch.charId];

如果我删除它会在下一行崩溃: titleLabel.text = ch.title;

有人熟悉这个吗?谢谢.

- (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;
Run Code Online (Sandbox Code Playgroud)

}

-(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;
Run Code Online (Sandbox Code Playgroud)

}


这是一个详细的错误:它没有说什么,但我确定我看到了一些异常

[会话开始于2009-10-05 07:41:25 +0300.] GNU gdb 6.3.50-20050815(Apple版gdb-967)(2009年7月14日星期二02:11:58)版权所有2004自由软件基金会, Inc. GDB是GNU通用公共许可证所涵盖的免费软件,欢迎您在特定条件下更改和/或分发它.输入"show copying"查看条件.GDB完全没有保修.输入"show warranty"了解详情.此GDB配置为"i386-apple-darwin".sharedlibrary apply-load-rules all附加到进程96464.(gdb)^ C其中

#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
Run Code Online (Sandbox Code Playgroud)

Mat*_*her 5

什么样的"崩溃"?一个EXC_BAD_ACCESS(解引用指针不指向一个有效的位置)?还是objc_exception_throw某种?

假设你的意思是EXC_BAD_ACCESS......

这是因为返回的"ch"值[charsList objectAtIndex:row+section*26]不是有效对象.

确切原因是你需要发现自己,但最可能的原因是你已经多次释放了这个对象.当对象插入NSArray时,对象可能不是有效的Objective-C对象.

有时它有助于设置NSZombieEnabled(command-option-x,转到Arguments选项卡并将name = NSZombieEnabled和value = 1添加到环境变量),因为如果您尝试使用释放的对象,这将立即引发异常.

-

无关的风格点:您正在分配SqlQueries但不初始化它.如果你alloc,永远,永远init.即[[SqlQueries alloc] init].如果你不关心init因为你没有任何实例变量,那么你不应该有alloc,你的方法应该是类方法.