我正在使用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];
}
在这种情况下,我是否需要不发布项目?或者我做错了什么? 显然,经验证据表明我不应该发布“项目”,但我不清楚为什么会出现这种情况。
感谢您提供任何信息/“指针”!
答案 0 :(得分:3)
您不需要发布它,因为您从未初始化它。 [NSArray arrayWithObjects:...]
返回一个自动释放的对象。您没有责任释放它,因为它从方法返回时已经发送了自动释放消息。你只需要发布你的init! (如果您使用了[[NSArray alloc] initWithObjects:...]
,则必须使用。)
答案 1 :(得分:0)
在arrayWithObjects:
上致电NSArray
时:
NSArray *items = [NSArray arrayWithObjects:self.searchButton, self.trashCan, nil];
您将返回一个自动释放的数组。该数组会自动退回给您,因为您不会在其上调用alloc
,new
或包含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的对象,因此您需要释放它以防止它泄漏。
答案 3 :(得分:0)
为了天堂的缘故,请将人们指向Memory Management Rules。不要解释他们。不要说“返回一个自动释放的对象”(这不一定是真的,即使它是真的也是无关紧要的)。只需指出他们的规则。
规则总共9个段落!没有必要解释他们,勉强他们,或重申他们。它们清晰简洁明了。
阅读规则,遵守规则,您将不会遇到内存管理问题。