2011-05-20 74 views
1

我声明了rightbutton工具栏的属性和这样UIBarbutton项目分配泄漏 - iphone

if(self.toolBar == nil) 
    self.toolBar = [[UIBarButtonItem alloc] initWithCustomView:tools]; 
    self.navigationItem.rightBarButtonItem = self.toolBar; 


- (void)viewDidUnload { 
    toolBar = nil; 
} 

- (void)dealloc { 
    [toolBar release]; 
    [super dealloc];  
} 

分配它,当我来到这个屏幕是第二次(被称为第二次viewDidLoad中),在的UIBarButtonItem是根据仪器泄漏。什么可能是错的?

感谢您的提前帮助。

+0

可能听起来很蠢,但你肯定在泄漏仪器中看到这个? (而不是僵尸或分配) – Matt 2011-05-20 13:30:37

+0

是它在泄漏.- – user542584 2011-05-20 14:04:34

回答

2

你过早niling工具栏属性 - viewDidUnload会的dealloc之前被调用,从而dealloc中就没有机会释放barbutton,因为toolBar为零,没有对象(这将保持独资(释放计数至少1)但没有参考)。

另外,由于您没有使用点符号(self.toolBar)来清空属性,因此旧对象的发布数量不会减少!因此,在您的控制器退出时,其保留数至少为2。

我将对象分配给属性后立即释放对象,因为无论如何setter方法都保留了它(如果您选择将其保留在声明中)。稍后在viewDidUnload中,你需要做的就是self.toolBar = nil;以真正摆脱它。

+0

哦,你的回答比我的好得多 - 我根本没有注意到viewDidUnload中的'toolBar = nil'! – deanWombourne 2011-05-20 13:35:33

+0

嗨,谢谢你的回答,我试过这个代码后,你的建议:if(self.toolBar == nil) self.toolBar = [[UIBarButtonItem alloc] initWithCustomView:tools]; \t self.navigationItem.rightBarButtonItem = self.toolBar; [self.toolBar release]; ......在dealloc中,我评论了释放...并在viewDidUnload中,我做self.toolBar = nil;泄漏不会消失.. – user542584 2011-05-20 13:58:11

1

我猜你的财产是这样的?

@property (nonatomic, retain) IBOutlet UIBarButtonItem toolBar; 

这将自动为您执行保留,但您要给您的财产一个已保留的toobar项目。

试试这个:

if(toolBar == nil) 
    toolBar = [[UIBarButtonItem alloc] initWithCustomView:tools]; 
    self.navigationItem.rightBarButtonItem = self.toolBar; 

如果你不使用self.它不会使用财产,为此不会有额外的保留:)

+0

我已经尝试过,但没有奏效,因此将其更改为保留属性。 – user542584 2011-05-20 14:00:06

+0

@Toaster发现了另一个需要修复的漏洞 - 使用他的答案! – deanWombourne 2011-05-20 14:12:54

+0

也尝试了他的答案:( – user542584 2011-05-20 14:28:49