Перемещение назад и вперед в UINavigationController вызывает сбой - PullRequest
0 голосов
/ 09 июня 2009

Я получаю постоянный сбой при создании простого приложения, использующего контроллер навигации.

В основном, выбор элемента в первой таблице успешно создает и выдвигает вспомогательный контроллер вида, и кнопка «назад» работает просто отлично. Но когда я пытаюсь выбрать предмет снова, я получаю странный сбой в GDB. Я не получаю ошибок, просто отладчик выплевывает некоторую информацию и приложение зависает.

Вот где я нажимаю контроллер вида:

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

    UIViewController *viewController;

    NSString *selection = [items objectAtIndex:indexPath.row];
    if([selection isEqualToString:@"Artists"]) {
        NSLog(@"Selected artists");
        if(artistsViewController == nil) {
            NSLog(@"creating ArtistsViewController");
            artistsViewController = [[ArtistsViewController alloc] init];   
        }

        viewController = artistsViewController;
    }

    if(viewController != nil) {
        [self.navigationController pushViewController:viewController animated:YES];
        [viewController release];
    }
}

Мне не нужно держать контроллер вида рядом, поэтому я просто создаю его каждый раз и отпускаю, когда я закончу.

Вот бесполезный консольный журнал. Обратите внимание, как в первый раз написано «Выбранные художники», а затем «Создано ArtistsViewController», затем во 2-й раз написано «Выбранные художники», и затем оно умирает:

[Session started at 2009-06-08 18:00:16 -0500.]
2009-06-08 18:00:18.856 Pocket Tabs[96726:20b] View did load
2009-06-08 18:00:18.862 Pocket Tabs[96726:20b] loading data for tableview
2009-06-08 18:00:20.265 Pocket Tabs[96726:20b] Selected artists
2009-06-08 18:00:20.265 Pocket Tabs[96726:20b] creating ArtistsViewController

[Session started at 2009-06-08 18:00:22 -0500.]
2009-06-08 18:00:22.061 Pocket Tabs[96726:20b] Selected artists
Loading program into debugger…
GNU gdb 6.3.50-20050815 (Apple version gdb-962) (Sat Jul 26 08:14:40 UTC 2008)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-apple-darwin".warning: Unable to read symbols for "/System/Library/Frameworks/UIKit.framework/UIKit" (file not found).
warning: Unable to read symbols from "UIKit" (not yet mapped into memory).
warning: Unable to read symbols for "/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics" (file not found).
warning: Unable to read symbols from "CoreGraphics" (not yet mapped into memory).
Program loaded.
sharedlibrary apply-load-rules all
Attaching to program: `/Users/ben/Library/Application Support/iPhone Simulator/User/Applications/F063AD87-BEFE-4CB9-AE26-E7149C8D7D4C/Pocket Tabs.app/Pocket Tabs', process 96726.
(gdb) 

Есть идеи? Я в тупике.

РЕДАКТИРОВАТЬ: Я понял это. Похоже, я был в середине назначения этой переменной экземпляра, чтобы избежать перераспределения вложенного представления, и я, должно быть, переключил передачи и забыл об этом. Устранение переменной экземпляра artistController решило это.

1 Ответ

2 голосов
/ 09 июня 2009

Я думаю, что это как-то связано с управлением памятью. Вместо использования viewController в качестве локальной переменной, установите его как свойство и избавьтесь от релиза.

@property(nonatomic, retain) UIViewController *viewController;

Синтез геттеров и сеттеров (в файле .m)

@synthesize viewcontroller;

и используйте точечный синтаксис для доступа к нему.

self.viewController

Это освободит старый контроллер, если таковой существует, и обеспечит, чтобы объект все еще был рядом, когда это необходимо для Nav Controller.

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