Ошибка EXC_BAD_ACCESS при запуске приложения - PullRequest
1 голос
/ 06 февраля 2012

У меня здесь странная вещь. У меня есть UITableViewController со всеми необходимыми методами из протоколов и данными, которые я буду использовать в нем. Тогда у меня есть этот код (упрощенно)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}

NSDictionary* cellData = [self.tableViewData objectAtIndex:indexPath.row];
// the rest of the code

return cell;
}

Этот TableViewController должен быть выполнен после нескольких щелчков, поэтому он не вызывается и не упоминается в AppDelegate или в любом месте ViewController, который загружается в начале. Но когда я строю (успешно) и запускаю приложение в симуляторе, оно завершается с ошибкой EXC_BAD_ACCESS, прежде чем что-либо отобразится. Я понял, что когда я комментирую строку:

NSDictionary* cellData = [self.tableViewData objectAtIndex:indexPath.row];

Все работает нормально. Почему это имеет что-нибудь с этим? Кроме того, tableViewData загружается в viewDidLoad и не выпускается до этой строки, а все остальное в порядке (я могу даже удалить строки ниже этого). В любом случае он даже не должен отправлять эту ошибку, но это происходит, и это делается при запуске приложения. Что дает?

EDIT: Вот метод viewDidLoad:

- (void)viewDidLoad {
[super viewDidLoad];

self.tableViewData = [self getABContactsWithMail]; //gets filtered contacts from addressbook, works fine
}

Вот другие части кода:

- (void)viewDidUnload {
[super viewDidUnload];
self.tableViewData = nil;
}

-(void)dealloc{
[tableViewData release];
[super dealloc];
}

EDIT: Это то, что я получаю из po tableViewData в tableView: cellForRowAtIndexPath:

<__NSArrayM 0xfdcfe30>(
{
email = "test@test.com";
firstName = test;
fullName = "test account";
id = 1;
lastName = account;
phone = "1 (231) 23";
},
{
email = "gmail@email.com";
firstName = nolast;
fullName = nolast;
id = 3;
lastName = "";
phone = "";
},
{
email = "asdkjf@sdfklja.com";
firstName = "";
fullName = nofirst;
id = 4;
lastName = nofirst;
phone = "";
},
{
email = "test@adsfk.com";
firstName = "";
fullName = "aaa.test@adsfk.com";
id = 5;
lastName = "";
phone = "";
}
)

EDIT: Я добавил метод:

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

и я получаю такое же поведение с фиктивными данными. Кажется, что-то не так с самим UITableViewController или мой xcode испорчен ...

Ответы [ 2 ]

0 голосов
/ 07 февраля 2012

Я наконец нашел его методом проб и ошибок. Очевидно, мой UITableViewController реализует некоторые протоколы, которые уже были реализованы в его родительском классе. И это была вся проблема ...

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

Также я помню, что делал это без проблем на Xcode 3 ...

Я отправил это как ошибку в Apple ...

0 голосов
/ 06 февраля 2012

Можете ли вы предоставить нам свой метод - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) section

Должно выглядеть следующим образом:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [tableViewData count];
}
...