2011-01-17 5 views
0

私はObjective-C & iPhone開発の初心者ですので、私に同行してください。NSMutableArrayとNSXMLParserから取り込まれたオブジェクトの取得に関する問題

私は、UITableViewを読み込んで、「アドレス帳」という特定のセルを選択すると、Webリクエストから取得したすべてのアドレスを含む別のUITableViewを読み込む必要があります。 NSXMLParserのデリゲートメソッドを使用して、ロードされたビューのヘッダーファイルで定義されたNSMutableArrayにこれらのアドレスを格納します。しかし、問題は、それらのアドレスがUITableViewセルに表示されている場合に発生します(はい、セル数のカウントを取得しています)。誰もこの問題で私を助けてくれますか?私は今この日についている!アプリのクラッシュのための最も可能性の高い理由はcellForRowAtIndexPathでこの行は

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
} 

AddressEntry *entry = (AddressEntry *)[self.addresses objectAtIndex:indexPath.row]; 

@try 
{ 
    NSLog(@"%@", entry.firstName); 
} 
@catch (NSException * e) 
{ 
    @try 
    { 
     NSLog(@"%@", entry.lastName); 
    } 
    @catch (NSException * e) 
    { 
     NSLog(@"%@", entry.lastName); 
    } 
} 
[entry release]; 

return cell; 
} 

    - (void)parserDidStartDocument:(NSXMLParser *)parser 
{ 
    self.currentElement = nil; 
    self.f_Name = nil; 
    self.l_Name = nil; 
    self.phone = nil; 
    self.email = nil; 
    count = 0; 
    self.addresses = [[NSMutableArray alloc] init]; 
} 

- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
            namespaceURI:(NSString *)namespaceURI 
            qualifiedName:(NSString *)qName 
             attributes:(NSDictionary *)attributeDict 
{ 


if([elementName isEqualToString:@"Entries"]) 
    { 
     count = [[attributeDict valueForKey:@"total"] intValue]; 
    } 
    else if([elementName isEqualToString:@"FirstName"]) 
    {  
     [self.f_Name release]; 
     self.f_Name = [[NSString alloc] init]; 
    } 
    else if([elementName isEqualToString:@"LastName"]) 
    { 
     [self.l_Name release]; 
     self.l_Name = [[NSString alloc] init]; 
    } 
    else if([elementName isEqualToString:@"PhoneNumber"]) 
    { 
     [self.phone release]; 
     self.phone = [[NSString alloc] init]; 
    } 
    else if([elementName isEqualToString:@"EmailAddress"]) 
    { 
     [self.email release]; 
     self.email = [[NSString alloc] init]; 
    } 
    else if([elementName isEqualToString:@"Record"]) 
    { 
     [self.addrEntry release]; 
     self.addrEntry = [[[AddressEntry alloc] init] retain]; 
    } 

[self.currentElement release]; 
self.currentElement = nil; 
self.currentElement = [elementName copy]; 
} 


- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
             namespaceURI:(NSString *)namespaceURI 
             qualifiedName:(NSString *)qName 
{ 
    // 
    if([elementName isEqualToString:@"FirstName"]) 
     self.addrEntry.firstName = self.f_Name; 
    else if ([elementName isEqualToString:@"LastName"]) 
     self.addrEntry.lastName = self.l_Name; 
    else if([elementName isEqualToString:@"PhoneNumber"]) 
     self.addrEntry.mobile = self.phone; 
    else if([elementName isEqualToString:@"EmailAddress"]) 
     self.addrEntry.emailAddress = self.email; 
    else if([elementName isEqualToString:@"Record"]) 
    { 
     [self.addresses addObject:self.addrEntry]; 
     [self.addrEntry release]; 
     self.addrEntry = nil; 
     /*AddressEntry *e = (AddressEntry *)[self.addresses lastObject]; 
     NSLog(@"%@ %@ %@ %@", e.firstName, e.lastName, e.mobile, e.emailAddress); 
     [e release];*/ 
    } 
} 


- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    if([currentElement isEqualToString:@"FirstName"]) 
     self.f_Name = string; 
    else if([currentElement isEqualToString:@"LastName"]) 
     self.l_Name = string; 
    else if([currentElement isEqualToString:@"PhoneNumber"]) 
     self.phone = string; 
    else if([currentElement isEqualToString:@"EmailAddress"]) 
    { 
     self.email = string; 
    } 

} 
+0

実際の問題は何ですか? – MusiGenesis

+0

明確でないことに対する謝罪。 @try { NSLog(@ "%@"、entry.firstName);この行に当たった後、アプリケーションがクラッシュします。 } –

+0

誰も助けてください、その私を殺す(私の頭の中で)!!! –

答えて

0

です::以下は、私のコードです

[entry release]; 

あなたはalloc/initが変数entryようにreleaseを呼び出すことはありませんしませんでしたそれ。その行を削除します。

この方法では、entryは、アドレス配列内のすでに割り当てられたオブジェクトへの参照のみを保持しています。オブジェクトを「所有していない」ため、オブジェクトを解放しないでください。

This page in the Apple docsは、これをより良く理解するのに役立つ素敵なフロー図とメモリ管理のための簡単なルールを示しています。


クラッシュとは無関係の別の問題として、@try/@catchの使用は不要です。説明はthis answerを参照してください。


最後に、クラッシュにも関係のない、foundCharactersでは、あなたが本当にあなたのデータにstringパラメータを追加する必要があるのではなく、同じ値内で複数回呼び出されるという方法は可能ですので、ちょうど割り当てます。例については、Handling XML Elements and Attributesを参照してください。

+0

本当にありがとうございます、あなたの答えはありません!私は、しかし、昨晩の変更をして、今は少なくともアプリがクラッシュすることはありません。しかし、それは別の悪質な問題に遭遇しました:-('self.addresses'は' NSMutableArray'で、NSXMLParser'デリゲートメソッドに実装されています。)UITableViewの 'cellForRowAtIndexPath'メソッドで同じ要素にアクセスしようとすると、私はデバッガを使用すると '変数はCFString'ではなく、ときどき' obj_msgsend'でスタックすることがあります。そしていつかはすべてのテーブルのセルにデータを取り込みます(続き...) –

+0

(続きます)。 ..)配列にプッシュされた最後のオブジェクト!これは私にナッツを動かしています。これについて光を当ててください。そして、あなたの '@try \ @ catch'と' appendString'の提案に感謝します。 –

+0

申し訳ありませんが、私は今それを解決したと思います。それは 'appendString'だと思って、結果的に' self.f_Name'の型をNSMutableStringに変更しました。ありがとうaBitObvious。 –