ネストした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のインスタンスがコピーではなく、実際の参照であるという結果になるはずです。
ありがとうございました。
私はもう自動解放を使用していけないようにコードを変更しました(fullData = [NSDictionaryのdictionaryWithContentsOfURL:URL];となりfullData = [:URL [NSDictionaryのはalloc] initWithContentsOfURL];)と保持カウントはまだdidSelectRowAtIndexPathの1です。 – Oldek