2009-07-14 72 views
0

所以,我運行代碼來填充客戶的一個NSArray(定製類)對象。此自定義類具有名爲Address的另一個自定義類(客戶具有帳單地址和送貨地址)的對象。在當列表中的用戶選擇了視圖控制器,它通過一個新的視圖控制器的客戶對象,像這樣:類變量類型獲取我的視圖控制器改變

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    InfoViewController *customerinfoViewController = [[InfoViewController alloc] initWithStyle:UITableViewStyleGrouped andCustomer:[[[customers objectAtIndex:indexPath.section] objectAtIndex:indexPath.row] retain]]; 
    [self.navigationController pushViewController:customerinfoViewController animated:YES]; 
    [customerinfoViewController release]; 
} 

第一次運行應用程序時我參觀這個視圖控制器,它工作正常。但是,當我重新訪問視圖控制器時,會發生一些有趣的事情。應用程序崩潰,無法識別的選擇器發送到實例0x00whatever。在Xcode使用鼠標懸停調試功能,我發現了客戶的shipAddress變量的第一個對象的類型從NSString的改變NSIndexPath。這不會發生在客戶的billAddress對象上。任何人都知道這裏發生了什麼?好像我可能會遇到內存管理問題,但我肯定會喜歡這個確認之前,我撕我的代碼除了跟蹤了所有的保留和釋放....

編輯:點擊此處瞭解詳情。用下面的代碼,我在課堂上有一個NSMutableArray。在循環的每一次迭代中,我循環遍歷XML中的節點(工作正常)。每一個新的字母被檢測爲名稱的第一個字母時,我創建了一個新的子陣和客戶添加到它,從而填補與檢測到的每個字母的客戶子陣列我的類級NSMutableArray的(客戶)。我的問題是關於自行車客戶對象的保留和發佈。 Clang Static表示客戶存在過度保留錯誤,但是當我根據叮噹解決問題時,環路崩潰。是什麼賦予了?相關的代碼如下:

DDXMLDocument *rootDoc = [[[DDXMLDocument alloc] initWithData:xmlData options:0 error:nil] autorelease]; 
NSArray *elems = [rootDoc nodesForXPath:@"QBXML/QBXMLMsgsRs/CustomerQueryRs/CustomerRet" error:nil]; 
DDXMLNode *node; 
sectionTitles = [[[NSMutableArray alloc] initWithCapacity:1] retain]; // Letters for UITableView section titles 
NSMutableArray *subArray; 
NSString *lastchar = @"A"; 
NSString *testchar; 
int indexCount = -1; 
customers = [[[NSMutableArray alloc] initWithCapacity:[elems count]] retain]; 
Customer *newCust; 
for (int i = 0; i < [elems count]; i++) { 
    node = [elems objectAtIndex:i]; 
    newCust = [[Customer alloc] initWithCustomerRetNode:node]; 
    testchar = [[newCust fullName] substringToIndex:1]; 
    if (i == 0 || ![[testchar uppercaseString] isEqualToString:lastchar]) { 
     [sectionTitles addObject:testchar]; 
     lastchar = testchar; 
     indexCount++; 
     subArray = [[NSMutableArray alloc] initWithCapacity:1]; 
     [customers addObject:subArray]; 
     [subArray release]; 
     [[customers lastObject] addObject:[newCust retain]]; 
    } 
    else { 
     [[customers lastObject] addObject:[newCust retain]]; 
    } 
    [newCust release]; 
} 

注意:這段代碼大部分工作,但鏗鏘不喜歡它。

編輯:在客戶類地址分配,像這樣(現在不鏘修復後的工作)

... 
else if ([tempname isEqualToString:@"BillAddress"]) 
    billAddress = [billAddress initWithAddressNode:tempnode]; 
else if ([tempname isEqualToString:@"ShipAddress"]) 
    shipAddress = [shipAddress initWithAddressNode:tempnode]; 
... 
+0

我編輯的這一點,但我不知道這是否顯示爲一個更新...... – jmeado3 2009-07-15 16:12:36

回答

1

這聽起來像你有一個以上的釋放問題,因此對內存管理,你可能過度釋放你正在存儲你的對象的數組。雖然不能從代碼片斷中告訴你。你必須去查看代碼並找到源代碼。同樣使用Clang靜態分析儀可能對您有所幫助。