指针记忆管理误解w / objective-c

时间:2009-07-25 18:34:29

标签: objective-c memory-management nsarray

我正在使用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]:消息发送到解除分配的实例0xd5f530)。

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

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

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

4 个答案:

答案 0 :(得分:3)

您不需要发布它,因为您从未初始化它。 [NSArray arrayWithObjects:...]返回一个自动释放的对象。您没有责任释放它,因为它从方法返回时已经发送了自动释放消息。你只需要发布你的init! (如果您使用了[[NSArray alloc] initWithObjects:...],则必须使用。)

答案 1 :(得分:0)

arrayWithObjects:上致电NSArray时:

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

您将返回一个自动释放的数组。该数组会自动退回给您,因为您不会在其上调用allocnew或包含copy的方法。这表示您不需要内存管理该对象。 (有关更多信息,请查看Memory Management Programming Guide for Cocoa

然而,当你在setItems上调用self.bottomBar时,它会被保留,将数组作为参数传递,将其保留计数提高到1,然后释放它,返回其保留计数为零,这导致它被解除分配。

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

答案 2 :(得分:0)

以下是简短版本:

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

另一方面,如果你做了:

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

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

查看Memory Management Programming Guide for Cocoa了解详情。

答案 3 :(得分:0)

为了天堂的缘故,请将人们指向Memory Management Rules。不要解释他们。不要说“返回一个自动释放的对象”(这不一定是真的,即使它是真的也是无关紧要的)。只需指出他们的规则。

规则总共9个段落!没有必要解释他们,勉强他们,或重申他们。它们清晰简洁明了。

阅读规则,遵守规则,您将不会遇到内存管理问题。