我正在声明右键按钮工具栏的属性并像这样分配
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正在泄漏。可能有什么不对?
提前感谢您的帮助。
答案 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.
,则不会使用该属性,因此不会有额外的保留:)