2010-11-24 3 views
2

У меня проблема с сохранением данных во вложенном NSDictionary. Или это что-то с NSMutableDictionary, которое сделает эту работу? Взгляните, я попытаюсь объяснить как можно лучше.iPhone dev, NSDictionary, как сохранить полный дикт?

Мой .h файл выглядит следующим образом:

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

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

@end 

Я создал свой inits в viewDidLoad

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

И это прекрасно работает, когда я пытаюсь вставить его в UITableViewCells и все, что мне нужно сделать , даже если я делаю NSLog, который печатает здесь fullData, все данные будут отображаться. так:

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; 
} 

Хотя это прекрасно работает, я хочу, чтобы держать fullData в моих других событий, например didSelectRowAtIndexPath. Прежде всего, я должен сохранить, а также, если я это сделаю, будут сохранены только данные первого уровня. элементы 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; 
} 

И вопрос в том, что я выпускаю текущую переменную каждую строку в таблице. Это должно быть результатом того, что экземпляр в переменном токе не является копией, а является реальной ссылкой.

Спасибо в любом случае.

ответ

1

Чтобы отследить решение, вам нужно будет отправить еще несколько кода. NSDictionary сохраняет свое содержание, поэтому, если вы не перевыпускаете объекты где-то в другом месте, сохранить NSDictionary будет достаточно.

+0

Я изменил код, так что я больше не использую Autorelease (fullData = [NSDictionary dictionaryWithContentsOfURL: url]; становится fullData = [[NSDictionary alloc] initWithContentsOfURL: url];), а счетчик останков по-прежнему один в файле didSelectRowAtIndexPath. – Oldek 2010-11-24 14:14:30

2
fullData = [NSDictionary dictionaryWithContentsOfURL:url]; 

- автоматический выпуск. вы не должны retain. Используйте:

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

И я не думаю, что вам нужно retain его для своих целей в настоящее время.Только если вам нужно получить к нему доступ послеMyViewController.

Вы выпускаете UITableView? Он может пройти и освободить его ячейки, которые находятся в вашем NSDictionary. без кода, я не могу сказать.

+0

Изменение кода, которое вы рекомендовали, делает то же, что и OP. Автоотпущенный объект живет только в пределах области, в которой он был создан. Это означает, что без сохранения он будет выпущен через некоторое время после завершения выполнения viewDidLoad. – 2010-11-24 15:16:58

+0

@Robert, фиксированный. – 2010-11-24 16:56:30

0

Я извиняюсь, я решить этот вопрос сам я не включил эту функцию:

- (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; 
} 

И вопрос в том, что я выпускаю текущую переменную каждую строку в таблице. Это должно быть результатом того, что экземпляр в переменном токе не является копией, а является реальной ссылкой.

Спасибо в любом случае.

Смежные вопросы