2

我正在使用 iPhone SDK 3.0,但我认为这是对 w/c 和内存管理如何工作的普遍误解。

我已经像这样覆盖了 viewWillAppear 方法

@implementation MyViewController
- (void)viewWillAppear:(BOOL)animated {
  NSArray *items = [NSArray arrayWithOjbects:self.searchButton, self.trashCan, nil];
  [self.bottomBar setItems:items animated:YES];
}
// other stuff...
@end

当我尝试从上面的视图控制器切换并切换回来时,一切正常。

但是,我倾向于“释放”指向“项目”的原始指针,因为我认为对 NSArray 的引用现在由 bottomBar 持有。但是当我这样做(见下面的代码)并尝试从 UIViewController 切换时,我得到一个内存管理错误(-[CFArray count]: message sent to deallocated instance 0xd5f530)。

- (void)viewWillAppear:(BOOL)animated {
  NSArray *items = [NSArray arrayWithOjbects:self.searchButton, self.trashCan, nil];
  [self.bottomBar setItems:items animated:YES];
  [items release];
} 

在这种情况下我是否需要发布项目?还是我做错了什么?显然,经验证据表明我不应该发布“项目”,但我不清楚为什么会这样。

感谢您提供任何信息/“指针”!

4

4 回答 4

3

你不需要释放它,因为你从来没有初始化过它。[NSArray arrayWithObjects:...]返回一个自动释放的对象。你不负责释放它,因为当它从方法返回时,它已经发送了自动释放消息。你只需要释放你初始化的东西!(如果你曾经使用[[NSArray alloc] initWithObjects:...]过,你将不得不这样做。)

于 2009-07-25T18:39:50.187 回答
0

当你打电话arrayWithObjects:NSArray

NSArray *items = [NSArray arrayWithObjects:self.searchButton, self.trashCan, nil];

您将返回一个自动释放的数组。数组自动释放返回给您,因为您不调用alloc,new或包含copy它的方法。这表示您不需要内存管理该对象。(有关更多信息,请查看 Cocoa 的内存管理编程指南)

但是,当您调用setItemson时,它会被保留self.bottomBar,将数组作为参数传递,将其保留计数增加到 1,但随后您释放它,将其保留计数返回为零,这会导致它被释放。

由于数组由 保留self.bottomBar,这意味着它正在管理数组的内存。当不再需要时,会释放数组,暗示该类不再需要数组,这才是管理内存的正确方式。

于 2009-07-25T18:40:57.767 回答
0

这是简短的版本:

+[NSArray arrayWithObjects:] 返回一个你不拥有的对象,所以不,你不应该释放它。

另一方面,如果你做了:

NSArray *items = [[NSArray alloc] initWithObjects:self.searchButton, self.trashCan, nil];

这将创建一个保留计数为 1 的对象,因此您需要释放它以防止它泄漏。

查看Cocoa 的内存管理编程指南了解更多详细信息。

于 2009-07-25T18:41:32.773 回答
0

看在老天爷的份上,请给人们指点内存管理规则。不要转述它们。不要说“返回一个自动释放的对象”(这不一定是真的,即使它是真的也无关紧要)。只需指出他们的规则。

规则一共9段!没有必要对它们进行释义、缩略或重述。它们清晰、简洁、明确。

阅读规则,遵守规则,你不会有内存管理问题。

于 2009-07-26T14:10:21.430 回答