EXC_BAD_ACCESS Попытка загрузить UITableView внутри контроллера UIView - PullRequest
0 голосов
/ 05 августа 2011

Это начинает сводить меня с ума, так как я следовал всем инструкциям, которые я могу найти в Интернете, и до сих пор не могу заставить это работать - все, что я пытаюсь сделать, это иметь контроллер представления с представлением, которое содержит tableview, и заставить контроллер представления обрабатывать операции tableview (т.е. быть делегатом и источником данных для него).

Я настроил свой контроллер представления и его представление, добавил представление таблицы к представлению в IB, создал и подключил IBOutlet из контроллера представления к представлению таблицы, а также установил источник данных представления таблицы и делегировал его контроллеру представления. Я также убедился, что контроллер представления реализует протоколы UITableViewDelegate и UITableViewDataSource в файле интерфейса.

Проблема возникает, когда я иду, чтобы добавить представление моего контроллера представления в окно. Я получаю ошибку EXC_BAD_ACCESS в строке return UIApplicationMain...:

#import <UIKit/UIKit.h>

#import "ClareStreamsAppDelegate.h"

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([ClareStreamsAppDelegate class]));
    }
}

Так что в основном мне интересно, что я здесь делаю неправильно. Насколько я вижу, я подключил все в Интерфейсном Разработчике, но есть ли какая-то другая инициализация, которую я должен сделать в коде? И еще один интересный момент - если я не подключу источник данных и делегирую выходы из табличного представления в IB, ошибка не возникает, и представление загружается нормально (хотя, очевидно, я тогда ничего не могу сделать с табличным представлением).

Спасибо за любую помощь!

Ответы [ 4 ]

3 голосов
/ 07 января 2012

Я думаю, я знаю, что вызывает ваши проблемы. У меня была такая же проблема некоторое время назад. То, что происходило, было то, что мои UIViews были освобождены ARC. Например, попробуйте добавить это в .m-файл вашего UIView и посмотреть, будет ли он вызван:

- (void)dealloc
{
    NSLog(@"This bitchass ARC deleted my UIView.");
}

Разрешение довольно простое. Вместо того, чтобы выделять ваш UIView как переменную экземпляра, как это ...

- (IBAction)buttonTouchedUpInside
{
    ViewWithTableView *viewWithTableView = [[ViewWithTableView alloc] init];
    [self.view addSubview:viewWithTableView.view];
}

... вы должны выделить свой UIView в родительском UIView, который загружает ваш UIView:

- (IBAction)buttonTouchedUpInside
{
    self.viewWithTableView = [[ViewWithTableView alloc] init];
    [self.view addSubview:viewWithTableView.view];
}
0 голосов
/ 05 августа 2011

EXC_BAD_ACCESS означает, что вы перевыпустили некоторую переменную.Сначала посмотрите на вывод журнала и проверьте сообщения.Наиболее распространенной причиной этого является неправильное управление вашими иварами.Убедитесь, что вы всегда получаете доступ к ивару через ваши средства доступа, за исключением init и dealloc.

. Наиболее распространенный способ, которым люди путают это, - код, подобный этому, где foo - это ивар:

foo = [NSString stringWithFormat:...]; // Or any method that returns an autorelease

Правильный код:

self.foo = [NSString stringWithFormat:...];

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

0 голосов
/ 05 августа 2011

Попробуйте:

@autoreleasepool {
    return UIApplicationMain(argc, argv, nil, [NSStringFromClass([ClareStreamsAppDelegate class]) autorelease]);   
}

Вызов NSStringFromClass возвращает вам автоматически освобожденную строку NSString, но не обязательно в вашем пуле автоматического выпуска.Если NSStringFromClass устанавливает свой собственный пул, возвращаемая строка освобождается, поэтому, когда код вашего UIApplicationMain отправляет ему сообщение, вы получаете EXC_BAD_ACCESS.

0 голосов
/ 05 августа 2011

Источник данных для просмотра таблицы редактируется без перезагрузки просмотра таблицы.

Наилучшее предположение.

...