2010-11-24 9 views
2

ネストしたNSDictionaryのデータを保持することに問題があります。それとも、NSMutableDictionaryを使ってこの作業をするのですか?見て、私は可能な限り説明しようとします。iPhoneデベロッパー、NSDictionary完全なDictを保持する方法?

私の.hファイルには次のようになります。

@interface MyViewController : UIViewController 
<UITableViewDataSource, UITableViewDelegate> 
{ 
    NSDictionary *fullData; 
    IBOutlet UITableView *tableView; 
} 

@property (nonatomic, retain) NSDictionary *fullData; 
@property (nonatomic, retain) UITableView *tableView; 

@end 

私はのviewDidLoad

- (void)viewDidLoad { 
    ... 
    fullData = [NSDictionary dictionaryWithContentsOfURL:url]; 
    [fullData retain]; 
    [super viewDidLoad]; 
} 

で私のINITを設定し、私はUITableViewCellsにそれを挿入しようと、私がする必要があるものは何でもするとき、これは正常に動作しますここでfullDataを印刷するNSLogを実行しても、すべてのデータが表示されます。 そのように:これは完璧に動作しますが

2010-11-24 14:49:53.334 MyApp[25543:40b] { 
    items =  (
       { 
      id = 5; 
      localId = 1; 
      name = "A name1"; 
     }, 
       { 
      id = 8; 
      localId = 3; 
      name = "A name2"; 
     }, 
       { 
      id = 9; 
      localId = 4; 
      name = "A name3"; 
     }, 
       { 
      id = 10; 
      localId = 5; 
      name = "A name4"; 
     }, 
       { 
      id = 11; 
      localId = 6; 
      name = "A name5"; 
     } 
    ); 
    results = 5; 
} 

私は、たとえばdidSelectRowAtIndexPathのために、私の他のイベントでfullDataを維持したいです。まず第一に、私はそれを保持しなければなりません、もし私がそうしても、第一レベルのデータだけが保持されます。 dict項目は、存在しないいくつかのメモリを指し示すだけです。

は、だから私は試してみてください。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSLog(@"Data: %@", fullData); 
} 

そして、これは時々これを返します。いくつかの値が保持されているよう

2010-11-24 14:44:28.288 MyApp[25493:40b] Data: { 
    items =  (
     "<_NSIndexPathUniqueTreeNode: 0x9d2a820>", 
     "<CALayer: 0x9d27980>", 
     "<CALayer: 0x9d2bc30>", 
     "<CALayer: 0x9d29830>", 
     "<CALayer: 0x9d299e0>" 
    ); 
    results = 5; 
} 

に思える、しかし、項目内のデータをアクセスすることはできません。データをローカルファイルに保存してからこの時点で再度アクセスする方が良いか、完全な辞書を保持することが可能なのでしょうか?

私はこれまでかなり新しいですので、私は自分のコードが同様のベストプラクティスに従う作るのを助ける必要がある[[fullData objectForKey:@"items"] retain];

を追加してみました。私は多くのソリューションを試して、リンゴや他の場所からいくつかの映画を見ました。私はそれを解決できません。それはシンプルかもしれないが、私はどこを見るべきか分からない。

ありがとうございます。

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSLog(@"Retain count: %i", [fullData retainCount]); 
    UITableViewCell *cell = 
    [tableView dequeueReusableCellWithIdentifier:@"cell"]; 

    // create a cell 
    if(cell == nil) 
    { 
     cell = [[UITableViewCell alloc] 
       initWithStyle:UITableViewCellStyleDefault 
       reuseIdentifier:@"cell"]; 
    } 

    // fill it with content 
    NSArray *current = [[fullData objectForKey:@"items"] objectAtIndex:indexPath.row]; 
    NSString *rowLabel = [NSString stringWithFormat:@"%@, %@",[current valueForKey:@"localId"], [current valueForKey:@"name"]]; 
    cell.textLabel.text = rowLabel; 
    [current release]; 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

    // return it 
    return cell; 
} 

そして問題は、私はテーブルに現在の変数に各行を放出することである:


申し訳ありませんが、私はこの機能が含まれていませんでした 問題を自分で解決しました。これは、変数currentのインスタンスがコピーではなく、実際の参照であるという結果になるはずです。

ありがとうございました。

答えて

1

ソリューションを追跡するには、コードをいくつか追加する必要があります。 NSDictionaryはその内容を保持しているので、他の場所のオブジェクトを過剰に解放しない限り、NSDictionaryを保持すれば十分です。

+0

私はもう自動解放を使用していけないようにコードを変更しました(fullData = [NSDictionaryのdictionaryWithContentsOfURL:URL];となりfullData = [:URL [NSDictionaryのはalloc] initWithContentsOfURL];)と保持カウントはまだdidSelectRowAtIndexPathの1です。 – Oldek

2
fullData = [NSDictionary dictionaryWithContentsOfURL:url]; 

は自動解放されます。あなたはretainではありません。これを使用します。

self.fullData = [[NSDictionary alloc] initWithContentsOfURL:url]; 

そして、私はあなたが今、あなたの目的のためにそれをretainする必要はないと思います。にアクセスする必要がある場合のみ、MyViewControllerがリリースされます。

UITableViewをリリースしていますか?それは通過し、それをあなたのNSDictionary. W/oより多くのコードにある細胞を解放するかもしれない、私は言うことができない。

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSLog(@"Retain count: %i", [fullData retainCount]); 
    UITableViewCell *cell = 
    [tableView dequeueReusableCellWithIdentifier:@"cell"]; 

    // create a cell 
    if(cell == nil) 
    { 
     cell = [[UITableViewCell alloc] 
       initWithStyle:UITableViewCellStyleDefault 
       reuseIdentifier:@"cell"]; 
    } 

    // fill it with content 
    NSArray *current = [[fullData objectForKey:@"items"] objectAtIndex:indexPath.row]; 
    NSString *rowLabel = [NSString stringWithFormat:@"%@, %@",[current valueForKey:@"localId"], [current valueForKey:@"name"]]; 
    cell.textLabel.text = rowLabel; 
    [current release]; 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

    // return it 
    return cell; 
} 

そして問題は、私はテーブルに現在の変数に各行を放出することである:

+0

推奨するコードの変更は、OPの操作と同じです。自動リリースされたオブジェクトは、作成されたスコープ内にのみ存在します。これは、保持なしでは、viewDidLoadが実行を終了した後にいつか解放されることを意味します。 –

+0

@Robert、fixed-ish。 –

0

申し訳ありませんが、私はこの機能が含まれていませんでした 問題を自分で解決しました。これは、変数currentのインスタンスがコピーではなく、実際の参照であるという結果になるはずです。

ありがとうございました。

+1

** retainCount **は使用しないでください。デバッグには役に立たない。また、あなたの質問を編集し、そこにこのコードを投稿してください。 – bbum

関連する問題