クラス変数の型が変更されます
-
13-09-2019 - |
質問
だから私のビューコントローラでは、私がお客様のNSArrayの(カスタムクラス)のオブジェクトを移入するためのコードを実行します。このカスタムクラスは、住所と呼ばれる別のカスタムクラス(顧客が請求先住所と配送先住所を持っている)のあるオブジェクトを持っています。リスト内の顧客が選択されたビューコントローラでは、それはそうように、新しいビューコントローラを顧客のオブジェクトを渡します:
- (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変数の第一の目的は、その型がNSIndexPathへのNSStringから変更されていることを発見しています。これは、顧客のbillAddressオブジェクトに発生しません。誰もがここで起こっている任意のアイデアを持っていますか?私は、メモリ管理の問題を有するものであってもよいように思えますが、間違いなくこの前の確認のように私は私のコードは離れて追跡涙れるすべて保持し、リリース....
編集:ここではより多くの情報。次のコードで、私はクラスレベルでNSMutableArrayのを持っています。ループの各反復で、私は(正常に動作する)XMLのノードをループしています。新しい文字が名前の最初の文字として検出されるたびに、私は新しい部分配列を作成し、この検出アルファベットの各文字のための顧客のサブアレイと私のクラスレベルNSMutableArrayの(顧客)を満たし、それに顧客を追加します。保持し、サイクリング、顧客のオブジェクトのリリースについて私の質問です。クラン静的は、顧客の過剰保持にエラーがあると言うが、私はクラン、ループのクラッシュに応じてそれを修正する場合。何ができますか?下記の関連コード:
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];
}
注:このコードは、ほとんどの部分は動作しますが、打ち鳴らすにはそれが好きではありません。
。EDIT:Customerクラス内のアドレスがそうのように割り当てられている(今クランの修正後に動作しません)
...
else if ([tempname isEqualToString:@"BillAddress"])
billAddress = [billAddress initWithAddressNode:tempnode];
else if ([tempname isEqualToString:@"ShipAddress"])
shipAddress = [shipAddress initWithAddressNode:tempnode];
...
解決
これが鳴り、あなたが実際にも、コードのスニペットから教えin.Cantあなたのオブジェクトを格納している、その配列をoverreleasingされる可能性があります。 Youllは行くとコードを見て、ソースを見つける必要があります。また、クラン静的アナライザを使用すると、あなたの助けになるかもしれません。