EXC_BAD_ACCESS получает доступ к NSArray на приложении Delegate - PullRequest
1 голос
/ 27 мая 2011

Я занимаюсь разработкой приложения для iPhone, и у меня возникла проблема с доступом к одному NSArray, определенному для делегата.

Мое приложение имеет две вкладки.Эти две вкладки имеют UITableView.У меня есть источник данных этих таблиц на одном NSArray, определенном в делегате.

Когда я загружаю приложение, первая вкладка корректно загружает все содержимое.Это одна часть кода первого контроллера вкладок:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    mainAppDelegate *delegate = [[UIApplication sharedApplication]delegate];
    return [delegate.dataArray count];
}

Когда отладчик находится в операторе возврата, я вижу, что dataArray имеет 9 элементов.Код работает отлично.

Когда я нажимаю на вторую вкладку, тот же код выполняется в контроллере второй вкладки.Но пока отладчик находится в операторе возврата, я вижу, что делегат не равен нулю, и dataArray показывает

{(int) [$ VAR count]} объекты

На следующем шаге происходит сбой программы, давая EXC_BAD_ACCESS

Я думаю, что на этом этапе dataArray был выпущен, но я не знаю когда.Я удалил вызовы выпуска dataArray для функций dealloc.

Это определение свойства dataArray:

@property (nonatomic, retain) NSArray *dataArray;

У кого-нибудь есть идеи?Я полностью потерян на этом.Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 27 мая 2011

В своих комментариях вы только что сказали, что dataArray - это ответ сервлета, и вы анализируете его с помощью json-framework.

Похоже, ваш объект dataArray просто хранит ссылку на объект внешнего массива, являющийсяпрошел.

Вы не опубликовали много кода.Не могли бы вы показать, где инициализирован ваш объект dict?

Возможно, ваш внешний объект освобождается, вызывая EXC_BAD_ACCESS

0 голосов
/ 27 мая 2011

Согласно вашему комментарию, вы инициализируете свой массив следующим образом:

 dataArray = [dict objectForKey:@"data"];

Это не сохраняет массив, так как вы обращаетесь к ivar напрямую, а не к свойству. Вы должны сделать это вместо:

self.dataArray = [dict objectForKey:@"data"];

Некоторые программисты предпочитают синтезировать свои свойства с другим именем ivar, чтобы избежать таких ошибок.

@synthesize dataArray = dataArray_;
...