使用Dealloc和ViewDidUnload正确释放变量的方法

时间:2012-04-24 10:28:51

标签: iphone objective-c ios release release-management

我已经通过了一些教程和一些信息,但我没有直接回答关于最佳方式或最佳释放变量的地方。

让我们看看这种情况,我有这两个变量:

@property (nonatomic, strong) IBOutlet UIButton *myButton;
@property (nonatomic, strong) NSString *myString;

...

@synthesize myButton = _myButton, myString = _myString;

这是释放它们的最佳方式吗?:

   -(void)viewDidUnload {

    self.myButton = nil;
    self.myString = nil;
    [super viewDidUnload];

 }

-(void)dealloc{

   [_myButton release];
   [_myString release];
   [super dealloc];

}

当调用dealloc时,我理解得比较多,并且当调用viewDidUnload时,我只想知道这种方式是否正确,以及为什么必须以这种方式完成。

谢谢你们

2 个答案:

答案 0 :(得分:3)

建议不要在init和dealloc中使用属性访问器方法,因为它们可能希望对象中存在其他一些信息。如果你知道自己在做什么,那么在dealloc中使用self.myButton = nil也没有问题。但是,实际上没有使用将它们设置为nil,因为对象被销毁 - 除非一些代码意外地从dealloc运行(作为我上面提到的访问器方法)。

在viewDidUnload中,您希望将成员设置为nil而不是仅释放它们,因为您的对象将继续存在并且不想访问悬空指针。

因此,您的示例应该是最佳性能和最安全的编程方式。

答案 1 :(得分:1)

还有其他方法,例如不将IBOutlets声明为属性,或将其声明为属性而不保留。我发现在大多数情况下,我更喜欢将它们保留为属性,然后我必须明确地释放它们。例如,当您从一个视图控制器切换到另一个视图控制器时。当一个视图控制器被关闭时,其视图将被删除并被释放。如果我没有保留它们,该视图上的任何IBOutlet UILabel也将被释放。这意味着当我回到原来的视图时,我必须通过并将标签和控件重置为最后的值,如果我只保留IBOutlet,我可以轻松保存它们。

我已阅读有关viewDidUnload方法使用的文档。我以为我确实理解了这个方法的含义

1)我在.h文件中使用retain和@propery,在.m文件中使用@syntesize。我使用self.object = something为对象赋值。在这种情况下,我会设置self.object = nil;在viewDidUnload方法中。

2)我没有在.h文件中保留对象,但是我在viewDidLoad方法中分配并初始化该对象。在dealloc方法中我有[对象发布];在viewDidUnload方法中我还设置了[object release];因为下次出现视图时,将在viewDidLoad方法

中创建对象

希望,这会对你有帮助......