2012-01-12 24 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模擬器菜單發送內存警告和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; 

我不能找到爲什麼?

如果我添加上面這一個行斷點,滾動視圖不是殭屍或等於爲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; 

我設置在XIB滾動視圖(而不是在代碼)的代表。

+0

分析儀是否顯示任何潛在問題? – 2012-01-12 15:08:10

+0

分析儀沒有什麼0123最大 – Dabrut 2012-01-12 15:14:20

+0

你的問題是在你的對象已經被釋放之後,'-viewDidUnload'被調用*。當你將你的屬性設置爲零時,你的綜合setter方法試圖釋放舊值,這已經是垃圾了,因爲你已經在'-dealloc'中釋放了它。您需要了解爲什麼視圖管理系統仍將消息發送到您的釋放控制器,因爲這實際上是您的問題。 – 2012-01-12 15:32:19

回答

1

您需要在dealloc-

使用 - 正確釋放

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

     [super dealloc]; 
} 

ViewDidUnload也被用作將在低內存警告的情況下,樂於助人。

+0

另外,在'dealloc'和'viewDidUnload'中,'super'調用應該是方法中的最後一個調用。 – MishieMoo 2012-01-12 15:14:08

+0

是的。請參閱編輯的文章 – rishi 2012-01-12 15:14:59

+0

@RIP:這就是我的想法。但爲什麼在模板中有//例如self.myOutlet = nil; ??? – Dabrut 2012-01-12 15:15:13