【问题标题】:iPhone - EXC_BAD_ACCESS when setting nil to an IBOutlet - Memory ManagementiPhone - 将 nil 设置为 IBOutlet 时的 EXC_BAD_ACCESS - 内存管理
【发布时间】:2012-02-08 20:50:30
【问题描述】:

我遇到了一个烦人的问题,我不知道为什么。

我有一个 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;
}

但是在 self.scrollView = nil 上总是有一个错误 EXC_BAD_ACCES ... 更具体地说,在这一行:

@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;

我在 XIB 中设置了滚动视图的委托(不在代码中)。

【问题讨论】:

  • 分析器是否显示任何潜在问题?
  • Analyzer Max 什么都没有
  • 您的问题是-viewDidUnload 在您的对象已被释放后被调用。当您将属性设置为 nil 时,您的综合 setter 方法会尝试释放旧值,这已经是垃圾,因为您在 -dealloc 中释放了它。您需要找出为什么视图管理系统仍在向您释放的控制器发送消息,因为这实际上是您的问题。

标签: iphone memory-management exc-bad-access null iboutlet


【解决方案1】:

需要在dealloc中正确释放-

使用-

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

      [super dealloc];
}

也可以使用 ViewDidUnload,因为这在内存不足警告的情况下会很有帮助。

【讨论】:

  • 另外,在deallocviewDidUnload 中,super 调用应该是方法中的最后一个调用。
  • @RIP :这就是我的想法。但是为什么在模板中有 // 例如self.myOutlet = nil; ???
  • @MishieMoo :我同意 dealloc 方法,但在 Apple 的示例中,他们在第一次调用时调用 [super viewDidUnload]。
  • 调用顺序取决于超类正在执行的任务,如果您想了解更多详细信息,可以查看以下线程-stackoverflow.com/questions/2365440/…
猜你喜欢
  • 1970-01-01
  • 2017-05-20
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 2011-09-28
相关资源
最近更新 更多