почему мое приложение падает? UITable и контроллеры - PullRequest
5 голосов
/ 03 октября 2009

У меня есть большая таблица, которая работает без ошибок, даже если мне кажется, что она слишком медленная по сравнению с более сложными ячейками, которые я открыл из загруженных примеров. Проблема возникает, когда я щелкаю ячейку, затем возвращаюсь, через несколько секунд быстрой прокрутки приложение вылетает на линии: 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;

}

-(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;

}


Вот подробная ошибка: она ничего не говорит, но я уверен, что видел что-то за исключением

[Сессия началась в 2009-10-05 07:41:25 +0300.] GNU gdb 6.3.50-20050815 (версия Apple, gdb-967) (вторник, 14 июля, 02:11:58 UTC 2009) Copyright 2004 Free Software Foundation, Inc. GDB - это бесплатное программное обеспечение, на которое распространяется стандартная общественная лицензия GNU, и вы добро пожаловать изменить его и / или распространять его копии при определенных условиях. Введите «показать копирование», чтобы увидеть условия. На GDB нет абсолютно никаких гарантий. Тип "показать гарантию" для деталей. Эта 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

1 Ответ

5 голосов
/ 04 октября 2009

Что за "сбой"? EXC_BAD_ACCESS (разыменование указателя, который не указывает на правильное местоположение)? Или objc_exception_throw какой-то?

Предполагая, что вы имеете в виду EXC_BAD_ACCESS ...

Это может быть потому, что значение "ch", возвращаемое из [charsList objectAtIndex:row+section*26], не является допустимым объектом.

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

Иногда полезно установить NSZombieEnabled (command-option-x, перейти на вкладку «Аргументы» и добавить name = NSZombieEnabled и value = 1 к переменным окружения), поскольку это немедленно вызовет исключение, если вы попытаетесь использовать освобожденный объект .

-

Несвязанный стилистический момент: вы выделяете SqlQueries, но не инициализируете его. Если вы alloc, всегда, всегда init. т.е. [[SqlQueries alloc] init]. Если вас не волнует init, потому что у вас нет переменных экземпляра, тогда у вас не должно быть alloc, ваши методы должны быть методами класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...