1

我已经阅读了一些教程和一些信息,但是对于释放变量的最佳方式或最佳位置,我没有直接的答案。

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

@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 时,我理解得足够多了,我只想知道这种方式是否正确,以及为什么必须以这种方式完成。

多谢你们

4

2 回答 2

3

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

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

所以,你的例子应该是最好的性能和最安全的编程方式。

于 2012-04-24T10:46:24.473 回答
1

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

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

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

2) 我不保留 .h 文件中的对象,但我在 viewDidLoad 方法中分配和初始化对象。在 dealloc 方法中,我有 [object release]; 在 viewDidUnload 方法中我还设置了 [object release]; 因为下次出现视图时,会在viewDidLoad方法中创建对象

希望对你有帮助...

于 2012-04-24T10:53:20.240 回答