2009-07-25 32 views
2

我正在使用iPhone SDK 3.0,但我认为这是一个普遍误解的事情如何工作W/C &内存管理。指针内存管理误解w/objective-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计数]:消息发送到释放实例0xd5f530)。

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

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

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

+0

谢谢大家!并感谢您的链接。 – user141146 2009-07-25 18:53:32

回答

3

您不需要释放它,因为您从未初始化它。 [NSArray arrayWithObjects:...]返回一个自动释放对象。您不负责释放它,因为它从方法返回时已将autorelease消息发送给它。你只需要释放你初始化的东西! (如果您用过[[NSArray alloc] initWithObjects:...]你将不得不)

+1

确实,你不负责释放它,但没有保证,它是一个自动释放的对象。你所知道的是你不拥有它。请阅读中的规则。 – 2009-07-26 14:03:57

0

当你调用arrayWithObjects:NSArray

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

将返回一个autoreleased数组。该数组将返回给您自动发布,因为您不需要调用allocnew或包含copy的方法。这表示您不需要记忆管理该对象。 (看看在Memory Management Programming Guide for Cocoa以获取更多信息)

然而,然后将其保持在调用setItemsself.bottomBar,传递数组作为参数,碰撞其保留数到1,但你松开,返回其保留计数回到零,这导致它被释放。

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

+0

确实,你没有责任释放它,但没有保证它是一个自动释放的对象。你所知道的是你不拥有它。阅读在规则 2009-07-26 14:12:16

0

这里的短版本:

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

在另一方面,如果你做了:

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

这将创建为1的保留计数的对象,所以你需要将它释放,以防止其泄漏。

退房的Memory Management Programming Guide for Cocoa了解更多详情。

+0

你是不是负责释放它,它是真实的,但没有一种机制保障它的自动释放目的。你所知道的是你不拥有它。请阅读 2009-07-26 14:11:15

0

对于天上的缘故,大家好,只是指向人的Memory Management Rules。不要套用它们。不要说“返回一个自动释放的对象”(这不一定是真的,即使它是真的也是无关紧要的)。只要指出他们的规则。

的规则是一个总和9段!无需对它们进行解释,放弃它们,或重新表述它们。他们清晰简洁明确。

阅读规则,遵守规则,你将有没有内存管理的问题。