Ошибка EXC_BAD_ACCESS при переключении между представлениями таблицы - PullRequest
0 голосов
/ 01 сентября 2011

Краткое описание того, что я пытаюсь сделать.

Я использую tableView: didSelectRowAtIndexPath: метод внутри моего подкласса UITableViewController, который перехватывает выбор строки из этого представления следующим образом ...

//..... inside tableView:didSelectRowAtIndexPath:
if (indexPath.section == 0) {
        //--- Get the subview ready for use
        VehicleSearchResponseTableViewController *vehicleSearchResponseTableViewController = [[VehicleSearchResponseTableViewController alloc] initWithNibName:@"VehicleSearchResponseTableViewController" bundle:nil];
        // ...
        //--- Sets the back button for the new view that loads
        self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Back" style: UIBarButtonItemStyleBordered target:nil action:nil] autorelease];
        // Pass the selected object to the new view controller.
        [self.navigationController pushViewController:vehicleSearchResponseTableViewController animated:YES];

        if(indexPath.row == 0) {
            vehicleSearchResponseTableViewController.title = @"Mans";

            EngineRequests *engineRequest = [[EngineRequests alloc] init];
            [engineRequest getMans]; 
            [engineRequest release]; 
        }
        if(indexPath.row == 1) {
//.... etc etc

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

Внутри моего NSObject у меня есть несколько различных методов для разных ячеек, которые вы можете выбрать в UITableViewController, в основном они задают разные строки, которые будутзатем инициализируйте мою оболочку ASIHTTPRequest, чтобы установить соединение со сценарием php и перехватить все данные, которые будут возвращены из базы данных. NSObject выглядит следующим образом.

//.... NSObject.m
- (IBAction) getMans
{
    NSString *mansString = [[NSString alloc] initWithString:@"mans.php"];
    [self grabURLInBackground:mansString];
    [manusString release];
}
//....cont....
//--- Connect to server and send request ---------------->>
- (IBAction)grabURLInBackground:(NSString *)setUrlString
{
    NSString *startURL = [NSString stringWithFormat:@"http://127.0.0.1:8888/CodeTest/%@", setUrlString];
    NSURL *url = [NSURL URLWithString:startURL];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setDelegate:self];
    [request startAsynchronous];
}

- (void)requestFinished:(ASIHTTPRequest *)request
{
    NSString *responseString = [request responseString]; //Pass request text from server over to NSString 
    NSData *responseData = [responseString dataUsingEncoding:NSUTF8StringEncoding]; //Create NSData object for Parser Delegate and load with responseString
    NSLog(@"stuff %@",responseData);

}

- (void)requestFailed:(ASIHTTPRequest *)request
{
    NSError *error = [request error];
    NSLog(@"%@", error);
}

Отсюда я хотел бы передать данныеЯ получаю от метода requestFinished обратнок недавно выдвинутому UITableView .. Однако у меня есть ошибка, прежде чем я смог получить это далеко, что мне нужно решить ... если я запустил симулятор и щелкаю вперед и назад между представлениями (основной UITableViewController с ячейками, а затемнедавно появившееся представление, в которое я хочу поместить данные) приложение падает и выдает ошибку в main.m Thread 1: программа получает сигнал EXC_BAD_ACCESS .. Я просто не знаю, что вызывает, потому что изчто я могу сказать, мой код не так уж плох.

Также, когда я отлаживаю свое приложение, я замечаю, что, как только метод grabURLInBackground завершил его, он возвращается обратно к методу getMans, затем возвращается к UITableViewController и продолжается черезЕсли операторы, полностью игнорируя методы requestFinished и requestFailed, и я просто не могу понять, почему.

Я думаю, я не уверен, что я вызываю методы и функции, которые мне нужно использовать в нужных местах, так что если выесть какие-либо предложения или ответы о том, как я могу имдокажите или, если вы знаете, откуда исходит моя ошибка, это будет высоко оценено.

Ответы [ 3 ]

1 голос
/ 01 сентября 2011

Есть несколько проблем с кодом выше, но я предполагаю, что ваше исключение из-за неправильного доступа связано с обработкой ваших EngineRequests и использованием AsiHttpRequest.

код здесь

EngineRequests *engineRequest = [[EngineRequests alloc] init];
[engineRequest getMans]; 
[engineRequest release]; 

эффективно создает объект, а затем освобождает его, как только завершается работа getMans.

Тогда внутри объекта engineRequest этот код

[request setDelegate:self];
[request startAsynchronous];

просит, чтобы AsiHttpRequest уведомил почти наверняка освобожденный объект , как только запрос завершится.

Здесь могут быть другие проблемы, но я бы начал с реструктуризации, чтобы попытаться сохранить этот объект как минимум до тех пор, пока он не получит ответ от AsiHttpRequest.

0 голосов
/ 01 сентября 2011

Кто получает ваш запрос?

Объект отправителя (и получателя) - engineRequest. Но вы освобождаете Engine Request в тот же самый момент после того, как вы выполнили асинхронный запрос (с помощью метода getMans.

Я бы предложил вам 1. переместить код

    vehicleSearchResponseTableViewController.title = @"Mans";

    EngineRequests *engineRequest = [[EngineRequests alloc] init];
    [engineRequest getMans]; 
    [engineRequest release]; 

из вашего UITableViewController's didSelectRowAtIndexPath метода в ваш vehicleSearchResponseTableViewController viewDidLoad метод. 2. сохранить ваш объект EngineRequests и сохранить его в некоторой переменной экземпляра в пределах vehicleSearchResponseTableViewController и не освобождать его до полной обработки запроса, ни успешно, ни по ошибке.

0 голосов
/ 01 сентября 2011

Трудно сказать из краткого обзора, но, как правило, когда вы bad_access и попадаете в основной метод приложения, обычно это происходит потому, что вы автоматически что-то высвободили, а затем отпустили, и оно исчезает, когда пул авто-выпуска истощается.Возможно, захотите включить NSZombiesEnabled и искать проблемы с памятью.

...