2012-01-12 3 views
2

У меня возникла раздражающая проблема, и я не могу понять, почему.iPhone - EXC_BAD_ACCESS при настройке ноль на IBOutlet - Управление памятью

У меня есть UIViewController я представляю в модальных так:

interviewsViewController *interviewsVC = [[interviewsViewController alloc] initWithNibName:nil bundle:nil]; 
[interviewsVC setManagedObjectContext:_managedObjectContext]; 

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:interviewsVC]; 
[interviewsVC release]; 
[self presentModalViewController:navigationController animated:YES]; 
[navigationController release]; 

Затем, когда я распускать контроллер представления, как это:

- (void)dismissViewController 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
} 

dealloc получает под названием:

- (void)dealloc 
{ 
    [_managedObjectContext release]; 
    [_interviewsArray release]; 
    [scrollView release]; 
    [pageControl release]; 
} 

Как только диспетчер просмотра уволен, я посылаю предупреждение о памяти через меню iPhone Simulator и метод viewdidunload вызывается:

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
    self.scrollView = nil; 
    self.pageControl = nil; 
} 

Но всегда есть EXC_BAD_ACCES ошибка на self.scrollView = ноль ... Более конкретно на этой линии:

@synthesize scrollView; 

И я не могу найти Зачем ?

Если добавить точку останова на предыдущей строке, то Scrollview не зомби или равно 0x0 ...

У вас есть идея?

PS: Вот заголовок:

#import <UIKit/UIKit.h> 

@interface interviewsViewController : UIViewController <UIScrollViewDelegate> 
{ 
    NSManagedObjectContext *_managedObjectContext; 

    NSMutableArray *_interviewsArray; 

    NSUInteger _fetchOffset; 

    CGFloat _lastXValue; 
} 

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext; 
@property (nonatomic, retain) NSMutableArray *interviewsArray; 

//IBOutlet 
@property (nonatomic, retain) IBOutlet UIScrollView *scrollView; 
@property (nonatomic, retain) IBOutlet UIPageControl *pageControl; 

И я поставил делегат Scrollview в XIB (не в коде).

+0

Анализатор обнаруживает какие-либо потенциальные проблемы? –

+0

Ничего с анализатором Max – Dabrut

+0

Ваша проблема в том, что '-viewDidUnload' получает вызов * после * ваш объект уже освобожден. Когда вы устанавливаете свое свойство в nil, ваш синтезированный метод setter пытается выпустить старое значение, которое уже является мусором, потому что вы выпустили его в '-dealloc'. Вам нужно выяснить, почему система управления просмотром по-прежнему отправляет сообщения на ваш освобожденный контроллер, потому что это на самом деле ваша проблема. –

ответ

1

Вам необходимо правильно выпустить в dealloc-

потребительных

- (void)dealloc { 
     [_managedObjectContext release]; 
     [_interviewsArray release]; 
     self.scrollView = nil; 
     self.pageControl = nil; 

     [super dealloc]; 
} 

ViewDidUnload также использоваться как это будет полезно в случае низких предупреждений памяти.

+0

Кроме того, в 'dealloc' и' viewDidUnload' вызов 'super' должен быть последним вызовом метода. – MishieMoo

+0

Да. См. Отредактированный пост. – rishi

+0

@ RIP: Вот что я подумал. Но почему в шаблоне есть // например. self.myOutlet = nil; ??? – Dabrut

Смежные вопросы