【问题标题】:What properties should I set to nil in viewDidUnload?我应该在 viewDidUnload 中将哪些属性设置为 nil?
【发布时间】:2012-09-15 11:10:31
【问题描述】:

我不知道我是否正确使用了 viewDidUnload。我应该释放我在 .h 文件中声明的所有内容吗?

这是我现在的做法:

@property (strong, nonatomic) Readability *wrapper;
@property (strong, nonatomic) ArticleModel *article;
@property (strong, nonatomic) Woho *wohoItem;
@property (strong, nonatomic) FeedItem *item;
@property (unsafe_unretained, nonatomic) IBOutlet UIScrollView *scrollView;
@property (strong, nonatomic) NSMutableArray *picturesArray;
@property (unsafe_unretained, nonatomic) IBOutlet UILabel *headTitleLabel;

在 viewDidUnload 中:

- (void)viewDidUnload
{
    [self setHeadTitleLabel:nil];
    [self setScrollView:nil];
    self.picturesArray = nil;
    self.item = nil;
    self.article = nil;
    self.wohoItem = nil;
    self.wrapper = nil;
}

这是正确的做法吗?

可能不会,因为我的应用在每次内存警告时都会崩溃。

谢谢!

【问题讨论】:

  • 如果你崩溃了,你打开僵尸了吗?你遇到了什么错误?您的viewDidUnload 没有明显问题。所有这些都在viewDidLoad 中重新创建吗?它是在内存警告时崩溃,还是在您返回相关视图时崩溃?
  • 此外,这个问题在 9 月 19 日就变得无关紧要了。
  • viewDidUnload 在 iOS 6 中已弃用。您应该改用 didReceiveMemoryWarning。

标签: iphone ios xcode cocoa-touch didreceivememorywarning


【解决方案1】:

当发生内存不足警告时,UIViewController 类如果知道以后可以重新加载或重新创建视图,则会清除其视图。如果发生这种情况,它还会调用 viewWillUnloadviewDidUnload 方法,让您的代码有机会放弃与视图层次结构相关联的任何对象的所有权,包括 从 nib 文件加载的对象、在您的 viewDidLoad 方法,以及在运行时延迟创建并添加到视图层次结构中的对象。

【讨论】:

  • 所以“对象在 viewDidLoad 中创建”是指每个对象 - 数组、字典还是仅 uiview 对象?举个例子就好了
  • 您可以在loadViewviewDidLoad 或从 nib 文件中重新创建的所有内容。
  • 顺便说一下,请参阅 iOS 6 release notes 了解对 viewDidUnload 的潜在更改。
  • 谢谢 Rob,我知道。我只需要将 viewDidUnload 中的代码移动到 didReceiveMemoryWarning。
  • @Devfly:“我只需将 viewDidUnload 中的代码移动到 didReceiveMemoryWarning 即可。”不,看在上帝的份上。唯一应该在viewDidUnload 中的事情是当视图被卸载以响应内存不足时要做的事情。由于 iOS 6 不再卸载低内存中的视图,因此其中的任何内容都是不必要的。请勿将其移至其他地方。如果你需要把它放在其他地方,那是一开始就放错了地方。
【解决方案2】:

developer.apple 说:

当视图控制器收到内存警告 (didReceiveMemoryWarning) 时,它应该放弃当前不需要的资源的所有权,如果需要可以在以后重新创建这些资源。一种这样的资源是视图控制器的视图本身。如果它没有超级视图,则视图被处理掉(在它的 didReceiveMemoryWarning 实现中,UIViewController 调用 [self setView:nil])

编程指南是here

在 (void)viewDidUnload 中将所有 IBOutlets 设置为 nil。 如果您使用的是 iOS 5,最好使用 IBOutlets 的“弱”参考。

我建议您将每个 iterface 元素从 NIB(xib) 或 Storyboard 中按 Control-Drag 拖到您的界面代码中。它将为您生成所有字段。

【讨论】:

    猜你喜欢
    • 2012-09-09
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多