2011-05-26 41 views
1

我正在開發一個iPhone應用程序,並且在訪問委託上定義的一個NSArray時遇到問題。EXC_BAD_ACCESS訪問代理應用程序上的NSArray

我的應用程序有兩個選項卡。這兩個選項卡都有一個UITableView。我在委託中定義的一個NSArray中擁有這些表的數據源。

當我加載應用程序時,第一個選項卡加載正確的所有內容。這是第一個選項卡控制器的代碼的一部分:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    // Return the number of rows in the section. 
    mainAppDelegate *delegate = [[UIApplication sharedApplication]delegate]; 
    return [delegate.dataArray count]; 
} 

當調試器是return語句,我可以看到dataArray中有9個元素。代碼工作正常。

當我點擊第二個選項卡時,相同的代碼在第二個選項卡控制器中執行。不過,雖然調試器是return語句,我可以看到,代表是不是null,dataArray中顯示

{(INT)[$ VAR計數]}對象

在接下來的步驟,程序崩潰給EXC_BAD_ACCESS

我認爲在這一點dataArray已經發布,但我不知道什麼時候。我已經刪除了dealloc函數中的dataArray發佈調用。

這是dataArray中的屬性定義:

@property (nonatomic, retain) NSArray *dataArray; 

任何人有任何想法?我完全迷失了。謝謝你的幫助!

+0

您如何初始化數組?直接訪問伊娃是一個常見的陷阱(沒有「自我」),所以你的數組永遠不會被保留。 – albertamg 2011-05-26 21:23:04

+0

dataArray是一個servlet的響應,我用json-framework解析它。代表didFinishLaunchingWithOptions是我初始化的地方。 'dataArray = [dict objectForKey:@「data」]' – 2011-05-26 21:25:46

回答

0

根據您的意見,您初始化數組是這樣的:

dataArray = [dict objectForKey:@"data"]; 

,因爲你是直接訪問實例變量,而不是財產這不保留陣列。你應該這樣做:

self.dataArray = [dict objectForKey:@"data"]; 

一些程序員更喜歡用不同的伊娃名稱來合成它們的屬性以避免這樣的錯誤。

@synthesize dataArray = dataArray_; 
+0

謝謝!這工作! – 2011-05-26 21:33:18

+0

不客氣!我很樂意提供幫助。 – albertamg 2011-05-26 21:36:38

+0

看來,這是我們所有人都遇到的新手問題,不是嗎? ;) – 2011-05-26 21:36:45

0

在你的評論中,你只是說dataArray是一個servlet的響應,並且你正在用json-framework解析它。

這聽起來像是你dataArray中的對象只是存儲在被傳遞到外部數組對象的引用。

您還沒有公佈太多的代碼。你能顯示你的字典對象初始化的位置嗎?

您的外部對象可能會被釋放導致EXC_BAD_ACCESS