выпуск после нажатия представления на стек навигации дает мне ошибку exc_bad_access - PullRequest
0 голосов
/ 26 ноября 2010

Следующий код находится в tableView didSelectRowAtIndexPath, если релиз не закомментирован, я получаю сообщение об ошибке:

ComicDetailsViewController * comicDetailsViewController = [[ComicDetailsViewController alloc] initWithNibName:@"ComicDetailsViewController" bundle:nil];
       comicDetailsViewController.comic = (Comic *)[arrayOfComics objectAtIndex:indexPath.row];
       comicDetailsViewController.bLoadPerformances = YES;
       [self.navigationController pushViewController:comicDetailsViewController animated:YES];
       //[comicDetailsViewController release];

Ошибка не возникает сразу же, это происходит, когда я нажимаю кнопку "Назад" в omicDetailsViewController.

т.е..) Я выбираю строку просмотра таблицы, следующий вид загружается и работает правильно.Как только я закончу с этим представлением и нажму кнопку «Назад», программа вылетает и выдает мне exc_bad_access.Почему это так?

РЕДАКТИРОВАТЬ:

#0  0x9682b176 in __kill
#1  0x9682b168 in kill$UNIX2003
#2  0x968bd89d in raise
#3  0x968d39bc in abort
#4  0x968c2164 in szone_error
#5  0x968c21e7 in free_small_botch
#6  0x000a7877 in -[NSConcreteMutableData dealloc]
#7  0x00006433 in -[ComicDetailsViewController dealloc] at ComicDetailsViewController.m:376
#8  0x003cbcc7 in -[UINavigationController setDisappearingViewController:]
#9  0x003c9219 in -[UINavigationController _clearLastOperation]
#10 0x003c9b62 in -[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:]
#11 0x0055224a in -[UINavigationTransitionView _notifyDelegateTransitionDidStopWithContext:]
#12 0x0055338a in -[UINavigationTransitionView _navigationTransitionDidStop]
#13 0x0034829d in -[UIViewAnimationState sendDelegateAnimationDidStop:finished:]
#14 0x0034812f in -[UIViewAnimationState animationDidStop:finished:]
#15 0x0244ca28 in run_animation_callbacks
#16 0x0244c8e9 in CA::timer_callback
#17 0x02688d43 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__
#18 0x0268a384 in __CFRunLoopDoTimer
#19 0x025e6d09 in __CFRunLoopRun
#20 0x025e6280 in CFRunLoopRunSpecific
#21 0x025e61a1 in CFRunLoopRunInMode
#22 0x02f0c2c8 in GSEventRunModal
#23 0x02f0c38d in GSEventRun
#24 0x00326b58 in UIApplicationMain
#25 0x000020f4 in main at main.m:14

Редактировать 2:

Вот блок освобождения comicDetailsViewController:

- (void)dealloc {
[comic release];
[xmlParser release];
[webData release];
[currentPerformanceObject release];
[arrayOfPerformances release];
[soapResults release];
[btnPerformances release];
[super dealloc];

}

Строка 376 - строка выпуска webData

РЕДАКТИРОВАТЬ 3:

    -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"ERROR with theConenction");
    [connection release];
    [webData release];
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"DONE. Received Bytes: %d", [webData length]);

    if(xmlParser)
    {
        [xmlParser release];
    }

    xmlParser = [[NSXMLParser alloc] initWithData: webData];
    [xmlParser setDelegate: self];
    [xmlParser setShouldResolveExternalEntities: YES];
    [xmlParser parse];

    [connection release];
    [webData release];
}

Ответы [ 3 ]

1 голос
/ 26 ноября 2010

Пожалуйста, покажите нам трассировку стека.

Но мое первоначальное предположение, что вы делаете что-то не так в - (void) dealloc вашего ComicDetailsViewController класса.

Пожалуйста, проверьте несколько вещей

  • Ваш dealloc блок в порядке
  • Вы не выпускаете comicDetailsViewController объект или ссылку на него откуда-либо еще.

Надеюсь, это поможет.

Спасибо, Madhup

0 голосов
/ 29 ноября 2010

Возможно, проблема еще в вашей сделке.

То, что объект находится в вашем @interface (.h файл), не означает, что вы можете / должны освободить переменную. У меня тоже была эта проблема

.h file

@interface PeopleViewController : UITableViewController {
NSArray *people;
}

@property (nonatomic, retain) NSArray *people;

@end

.m файл

@implementation PeopleViewController

@synthesize people;

- (void)viewDidLoad {
    people = [town.people allObjects];
}

...

- (void)dealloc {
    [people release];
}

@end

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

0 голосов
/ 26 ноября 2010

Прежде чем вывести вид из окна, отмените NSURLConnection, отправив сообщение об отмене соответствующему объекту.

Предполагается, что объект NSURLConnection имеет имя asyncConnection:

-(void)viewWillDisappear:(BOOL)animated
   [asyncConnection cancel];
}
...