我已经通过了一些教程和一些信息,但我没有直接回答关于最佳方式或最佳释放变量的地方。
让我们看看这种情况,我有这两个变量:
@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时,我只想知道这种方式是否正确,以及为什么必须以这种方式完成。
谢谢你们
答案 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方法
中创建对象希望,这会对你有帮助......