所以,我運行代碼來填充客戶的一個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];
...
我編輯的這一點,但我不知道這是否顯示爲一個更新...... – jmeado3 2009-07-15 16:12:36