2013-03-14 98 views
4

嗨,在我的iPad應用程序中,我正在使用搜索欄和tableview,搜索完成後我在tableview中顯示的結果。爲了用新的搜索結果更新表,我打電話給reloadData方法。它工作正常,但在少數情況下的應用程序是在[tableviewobject reloaddata]方法崩潰,我得到這個錯誤控制檯如何知道目標c中是否存在對象用ARC

錯誤對象0x95a0300:指針被釋放沒有被分配 *設置malloc_error_break斷點進行調試。

通過觀察上述錯誤我明白了什麼是tableviewobject被從內存中刪除。我將消息發送給釋放的對象。序來克服這個問題,我所做的是我傳遞消息reloadData之前分配內存以tableviewobject這樣

tableviewObject=[[UITableView alloc]init]; 
tableviewObject.delegate=self; 
tableview.datasource=self; 
[tableviewObject reloaddata];. 

在結果數據沒有實現代碼如下更新情況。現在我想知道的是,我如何知道對象是活着還是從內存中釋放。如果它釋放了如何爲表格視圖對象分配內存以重新加載搜索結果數據。如果有任何想法,請爲此提供解決方案。提前致謝,請幫助我。

注意:在我的項目中,我使用ARC。

+0

閱讀有多少這種錯誤發生的方式http://stackoverflow.com/questions/1424210/iphone-development-pointer-being-freed-was-not-allocated – Tirth 2013-03-14 04:46:54

+1

它也可能是任何被訪問的對象通過你的表視圖數據源,當reloadData被調用時已經被釋放,而不一定是你實際的表視圖。我的猜測是,你的源數組中的一個對象已經被釋放,並且關鍵是確保在釋放數據源數組時將其從數據源數組中移除,以免發生這種情況。但是,所有這些只是一個猜測,因爲你沒有包含任何代碼。如果你真的想要一些幫助,告訴我們你在做什麼。 :) – lnafziger 2013-05-23 04:09:46

+0

如果您可以在模擬器上重現問題,請在殭屍工具下運行它。如果您只能在設備上執行此操作,請轉至產品>方案>編輯方案...>運行>診斷,然後選中「啓用殭屍對象」複選框。 – 2013-05-23 05:21:02

回答

-1

不要在代碼中創建的UITableView對象,你就失去了視圖之間的鏈接,如果你創建一個這樣的對象也不會幫助你可以這樣

@property(nonatomic,strong)IBOutlet UITableView *tableView; 

創造財產這將解決你的問題,我認爲。

+0

只要您正確編寫並建立正確的連接,在代碼中創建對象沒有任何問題。 – Abizern 2013-05-23 10:32:51

+1

@Abizem在上面的代碼中,他每次創建對象時,他想要執行重新加載,並且他不是將tableview添加到實際視圖。然後它如何鏈接。 – NSLog 2013-05-23 10:48:37

+0

這就是爲什麼我說你需要正確地寫入它第一個地方。 – Abizern 2013-05-23 11:15:52

0

是不是引起你的注意,在第三行UITableView的名稱拼寫錯誤?

tableviewObject=[[UITableView alloc]init]; 
tableviewObject.delegate=self; 
tableview.datasource=self; 
[tableviewObject reloaddata]; 

它應該是tableviewObject.datasource = self;

此外,爲什麼每次創建新對象?你會失去舊的!只是初始化它在viewDidLoad方法第一次也是唯一一次

0

至於解決一個更通用的方法:

如果您使用ARC你需要保持存到自己的對象或他們將得到釋放的您。
在上面的示例中(讓我們假設你也指定了tableviewObject.datasource),你需要一些屬性或類成員來保存對你的tableviewObject的引用。 E.g:

@interface MyViewController() //anonymous private properties inside your .m 
@property(nonatomic,strong) UITableView *tableviewObject; 
@end 

@implementation MyViewController 
@synthesize tableviewObject; 
// rest of your implementation ... 
@end 

這樣,您將與self.tableviewObject工作,但會留下可用的,只要與財產的UIViewController是活的。

通用的是要記住很簡單,如果你wan't保持電弧釋放的東西總得有人用它(引用或成員屬性算作「使用」)。

在這方面,thalador/user2413007的答案也是正確的,因爲outlet會引用基本上具有相同結果的加載的XIB中的tableview。

相關問題