1

我只是想知道以下两种方法。

第一的:

    SomeViewController *someViewController = [[SomeViewController alloc] init];
    [self.navigationController pushViewController:someViewController animated:YES];
    [someViewController release];

第二:

SomeViewController *someViewController = [[SomeViewController alloc] init];
self.iVarViewController = someViewController;
[someViewController release];
[self.navigationController pushViewController:self.iVarVierController animated:YES];

采用第一种方法可以吗,还是应该总是尝试采用第二种方法?第一种方法到底有什么问题?当“someViewController”被推入堆栈时,它的保留计数是否增加,因此它永远不会完全释放?这就是为什么您可能希望像第二种方法一样将其分配给属性?但是在第二种方法中,您无法确定何时发布。

我读过类似的帖子,但我仍然有点不确定,所以想我会问得更简单。

4

2 回答 2

1

他们都没事。当您推SomeViewController送到堆栈时,它的保留计数会增加。当它从堆栈中弹出时,它的保留计数再次递减。之后您不需要自己显式释放它。事实上,这可能会导致发生异常。

有一个简单的一般规则:每当你打电话时alloc/retain/new/copy*,你需要在release某个时候打电话。

你在alloc这里只调用一次,所以你只需要调用release一次。

编辑:在第二种方法中,您retain使用 setter 隐式调用。因此,在这种情况下,您稍后需要额外的release时间来防止内存泄漏。

于 2010-11-20T14:27:19.487 回答
0

这两种方法的结果略有不同。首先,实例SomeViewController及其视图将在实例弹出后立即被释放。在第二种情况下,实例SomeViewController将保存在内存中,直到被新实例替换(self.iVarViewController = someViewController)。

如果第一个视图控制器需要在第二个控制器弹出后向第二个视图控制器发送消息(例如获取更改的属性值),则第二种方法可能有意义。但是,在这种情况下,您必须问自己每次重新创建对象是否有意义,而不仅仅是重用存储在属性中的实例(ivarViewController在您的示例中)。

一个是否优于另一个取决于应用程序这部分的预期使用模式的组合,以及第二个控制器及其视图的性能特征。(例如,对象消耗多少内存,用户通常多久在两个控制器之间来回切换?)

于 2010-11-20T15:38:50.503 回答