2012-08-24 131 views
6

我是iphone开发新手。我正在为我的项目使用ARC。据我了解使用ARC我们不必手动发布任何对象。但是,我在某些地方观察到,即使在使用ARC之后,人们也明确地将其对象设置为ViewDidUnload中的零。ARC下的-viewDidUnload中的弱和强属性

例如,在.h文件中我有这样的事情:

@property (unsafe_unretained, nonatomic) IBOutlet MKMapView *mapViewOutlet; 
@property (unsafe_unretained, nonatomic) IBOutlet UIToolbar *toolBar; 
@property (strong,nonatomic) NSMutableArray *dataArray; 

而且.M如下:

- (void)viewDidUnload 
{ 
    [self setMapViewOutlet:nil]; 
    [self setToolBar:nil]; 
    [super viewDidUnload]; 
    self.dataArray=nil; 
} 

我的问题是,是不是真的有必要明确指定为零ViewDidUnload甚至在ARC下?

回答

10

viewDidUnload方法的全部要点是释放您不真正需要的数据,以释放内存。读the documentation

当低内存条件发生并且不需要当前视图控制器的 视图,该系统可以选择从 内存中删除这些看法。这个方法在视图控制器的视图 被释放后调用,并且是您执行任何最终清理的机会。如果您的视图控制器存储对视图或其子视图的单独引用,则应使用此方法来释放这些引用。您还可以使用此方法删除对您创建的任何对象的引用,以支持该视图,但现在不再需要该视图,因为该视图不再需要。您不应该使用此方法释放用户数据或任何其他无法轻易重新创建的信息。

所以你为了释放对象现在和帮助系统释放一些内存设置属性nil。但是,这当然取决于房产类型 - 强大的房产属于“您的”房产,只有您现在可以决定是否放行(设置为nil)。例如,如果它们指向与主视图一起发布的一些视图,则弱属性可能已经是nil。而unsafe_unretained属性是一个特殊的野兽。他们指向的对象可能已经被释放,但这并不意味着它们被自动设置为nil。因此,您应该使用其中一种“安全”属性类型(强/弱),或者在此处将不安全属性设置为nil,以确保您稍后不会使用发布的对象。在这种情况下没有硬性规定,你必须考虑这种情况以及它对各种财产的意义。

顺便说一下,viewDidUnload在iOS 6中不再使用,其中不再在低内存条件下发布视图。您仍然收到didReceiveMemoryWarning回拨,以便您可以在此发布一些资源。同样,我建议你阅读文档并进行一些测试,看看会发生什么,并决定你应该做什么。

+0

但是,即使我没有设置为零,系统会自动释放ARC中的内存吗? – Raj

+0

最后,是的。在ARC下创建泄漏很难(呃)。您的决定是否可以在应用程序收到内存警告时通过释放大量内存来帮助系统。 – zoul

+0

好的。我会接受这个答案。 – Raj

2

当您使用unsafe_unretained,你应该将其分配到零,因为它不会被分配给无隐,这里是弱引用情况下,它会为了避免任何悬而未决的引用,你需要在unsafe_unretained的情况下赋值为nil。

+0

是的,我甚至都这么想。但是我曾经在一些地方看到,即使是弱的参考设置为零。在我的问题中,你甚至可以看到强参考设置为零。 – Raj

3

ARC将只发布不具有强引用的对象的属性。在你的情况下,这些都是强大的引用,所以它们将被保留,除非它们被明确设置为零。

viewDidUnload方法并不意味着您的UIViewController从内存中删除,它只是意味着其视图从内存中删除(iOS Developer - ViewController lifecycle)。

在这种情况下,您的UIViewController仍然保留在内存中,因此也保留其属性,除非它们明确设置为零。

+0

在我的情况下,他们并不都是强有力的参考。对于你的信息,IOS4不支持weak,我们使用unsafe-unretained,这可能会在一段时间内创建悬挂指针。明智的功能都是一样的 – Raj

+0

正确,对不起,我正在寻找弱关键字(现在只为iOS5开发)。 – Resh32

+0

,据我所知,ARC会自动调用dealloc获取强引用。因此,我们不必将它们设置为零。除了弱引用,我们将它设置为零,以避免悬挂指针在某些情况下可能是可能的 – Raj