UIBarbuttonitem分配泄漏 - iphone

时间:2011-05-20 13:23:09

标签: iphone memory-leaks uibarbuttonitem

我正在声明右键按钮工具栏的属性并像这样分配

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),根据Instruments,UIBarbuttonItem正在泄漏。可能有什么不对?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

你过早地弄乱工具栏属性 - 在dealloc之前会调用viewDidUnload,因此dealloc将没有机会释放barbutton,因为toolBar指向 nil,而不是对象 (将保留所有权(释放次数至少为1),但没有参考)。

另外,由于您没有使用点表示法(self.toolBar)来取消属性,因此旧对象释放计数不会减少!因此,当您的控制器退出时,其保留计数至少为2。

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

答案 1 :(得分:1)

我猜你的财产是这样的?

@property (nonatomic, retain) IBOutlet UIBarButtonItem toolBar;

这将自动为您执行保留,但您正在为您的财产提供已保留的toobar项目。

请改为尝试:

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

如果您不使用self.,则不会使用该属性,因此不会有额外的保留:)