2011-05-20 69 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