2011-08-30 62 views
1

在我的應用程序中,我想創建數組,添加到工具欄然後釋放它。但是,當我釋放它我的應用程序崩潰。爲什麼這樣...?怎麼做才能省略它?Release NSArray分配給UIBar

UIImage *button1Image = [UIImage imageNamed:@"button1Image.png"]; 
cameraToolbar = [[UIToolbar alloc] init]; //declared in .h 
UIBarButtonItem *button1 = [[ UIBarButtonItem alloc ] initWithTitle: @"qwerty" style: UIBarButtonItemStyleBordered target: self action: @selector(doAction)]; 
[button1 setImage:button1Image]; 
//same method to add flexItem and button2Image 

NSArray *items = [NSArray arrayWithObjects: button1, flexItem, button2, nil]; 
[cameraToolbar setItems:items animated:NO]; 
self.view = cameraToolbar; 

[items release]; // here it crashes, why? How to fix? 
[button1 release]; 
[button2 release]; 
[flexItem release]; 
[button1Image release]; // here i get "Incorrect decrement of the reference count 
//of an object that is not owned at this point by the caller" 
[button2Image release]; 

回答

0

[NSArray的arrayWithObjects:]是一類方法它返回一個陣列,其是自動釋放對象。所以ùshouldnot釋放它

如果你使用類似alloc創建對象,複製,保留,那麼只有你有責任釋放它們。

NSArray *items=[[NSArray alloc]initWithObjects:button1, flexItem, button2, nil]; 


............ 



[items release]; 

像這樣button1Image object.take關心

+0

太棒了!然而,釋放buttonImages是什麼?我得到這個警告,當我分析.. – Vive

+0

任何地方任何對象你可以採取這種行爲。 –

+0

如果你使用alloc,保留,複製,那麼你必須釋放它。在ios5 ARC將幫助我們。現在我們必須手動完成。 –

0

button1Image分配被自動釋放,並因此不應當被髮送釋放消息一個對象。內存管理基於對象引用計數,當計數變爲零時,內存將被釋放。釋放消息將引用計數減1。