iPhone Dev, NSDictionary, как сохранить полный Dict? - PullRequest
2 голосов
/ 24 ноября 2010

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

Мой .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];
}

И это прекрасно работает, когда я пытаюсь вставить его в 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;
}

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

В любом случае, спасибо.

Ответы [ 3 ]

2 голосов
/ 24 ноября 2010
fullData = [NSDictionary dictionaryWithContentsOfURL:url];

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

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

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

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

1 голос
/ 24 ноября 2010

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

0 голосов
/ 24 ноября 2010

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

- (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 не является копией, а является реальной ссылкой.

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

...