iPhone-将nil设置为IBOutlet时执行错误访问-内存管理
我正面临一个恼人的问题,我不知道为什么 我有一个UIViewController,我在模态中呈现如下:iPhone-将nil设置为IBOutlet时执行错误访问-内存管理,iphone,memory-management,exc-bad-access,null,iboutlet,Iphone,Memory Management,Exc Bad Access,Null,Iboutlet,我正面临一个恼人的问题,我不知道为什么 我有一个UIViewController,我在模态中呈现如下: interviewsViewController *interviewsVC = [[interviewsViewController alloc] initWithNibName:nil bundle:nil]; [interviewsVC setManagedObjectContext:_managedObjectContext]; UINavigationController *nav
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];
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
self.scrollView = nil;
self.pageControl = nil;
}
一旦关闭view controller,我会通过iPhone Simulator菜单发送内存警告,并调用viewdidunload方法:
- (void)dealloc
{
[_managedObjectContext release];
[_interviewsArray release];
[scrollView release];
[pageControl release];
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
self.scrollView = nil;
self.pageControl = nil;
}
但是self.scrollView=nil上的EXC_BAD_ACCES总是有一个错误。。。更具体地说,在这一行:
@synthesize scrollView;
我不知道为什么
如果我在这一行上面添加一个断点,scrollView就不是僵尸或等于0x0
你有什么想法吗
注:这是标题:
#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;
#导入
@界面访谈VIEWCONTROLLER:UIViewController
{
NSManagedObjectContext*_managedObjectContext;
NSMutableArray*_访谈软件;
NSUInteger _fetchOffset;
CGFloat_lastXValue;
}
@属性(非原子,保留)NSManagedObjectContext*managedObjectContext;
@属性(非原子,保留)NSMutableArray*interviewsArray;
//IBOutlet
@属性(非原子,保留)IBMOutlet UIScrollView*scrollView;
@属性(非原子,保留)IBUIPageControl*pageControl;
我在XIB中设置了scrollview的委托(不在代码中)。您需要在dealloc中正确释放- 使用-
ViewDidUnload也可以使用,因为在内存不足警告的情况下,这将非常有用。分析仪是否显示任何潜在问题?分析仪没有任何问题您的问题是
-ViewDidUnload
在对象已解除分配后被调用。当您将属性设置为nil时,您的合成setter方法正试图释放旧值,因为您在-dealoc
中释放了旧值,所以旧值已经是垃圾。您需要找出为什么视图管理系统仍在向解除分配的控制器发送消息,因为这实际上是您的问题。此外,在dealloc
和viewDidUnload
中,super
调用应该是该方法中的最后一个调用。@RIP:我就是这么想的。但是为什么模板中有//例如self.myOutlet=nil???参考以下线程,您将得到您的答案-,@MishieMoo:我同意dealloc方法,但在Apple的示例中,他们在第一次调用中调用[super viewDidUnload]。调用顺序取决于super类正在执行的任务,如果您需要更多详细信息,则可以检查以下线程-