我应该在viewDidUnload中将哪些属性设置为nil?

时间:2012-09-15 11:10:32

标签: iphone ios xcode cocoa-touch didreceivememorywarning

我不知道我是否正确使用了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;
}

这是正确的做法吗?

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

谢谢!

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

developer.apple说:

  

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

编程指南是here

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

我建议你将每个iterface元素的Control-Drag从NIB(xib)或Storyboard转换为你的接口代码。它将为您生成所有字段。