NSDictionary теряет свое содержимое (кроме плохого доступа) - PullRequest
0 голосов
/ 29 июля 2010

Итак, у меня есть контроллер uiview.Он имеет свойство NSMutableArray с синтезированным неатомарным сохраняемым свойством.

В viewDidLoad я запускаю его с помощью следующего, а также добавляю кнопку в панель навигации.

test = [NSDictionary dictionaryWithObjectsAndKeys:
        [[SearchField alloc] initWithName:@"Subject" :Text], kSubjectKey, 
        [[SearchField alloc] initWithName:@"Source publication" :Text], kSourceKey,
        [[SearchField alloc] initWithName:@"Keyword" :Text], kKeywordKey,
        [[SearchField alloc] initWithName:@"Author" :Text], kAuthorKey,
        [[SearchField alloc] initWithName:@"Color" :Bool], kColorKey,
        nil ];

NSLog([NSString stringWithFormat:@"lol %d", [test count]]);

Первый журнал при запуске через отладчик работает нормально.Тем не менее, я привязал следующий код к кнопке:

-(void)search:(id)sender{

    NSLog([NSString stringWithFormat:@"lol %d", [test count]]);

При выполнении этого кода строка журнала аварийно завершает работу с ошибочным доступом. Ничего не происходит с NSDictionary между viewDidLoad и нажатием кнопки, так почему это происходит?И что более важно, как я могу это исправить?:)

Приветствия

Редактировать Я подумал, что, возможно, мой класс SearchField что-то делал, поэтому я заменил их простыми строками, проблема все еще возникает.

Ответы [ 3 ]

4 голосов
/ 29 июля 2010

Вы напрямую обращаетесь к переменной-члену - вам нужно пройти через аксессор, т.е.:

self.test = [NSDictionary dictionaryWithObje ...

Это обеспечит сохранение вашего словаря в вашем объекте.

3 голосов
/ 29 июля 2010
  1. Убедитесь, что test является переменной класса, установив ее в качестве свойства заголовка контроллера представления:

    @property (nonatomic, retain) NSDictionary *test;

  2. Отпустите его в методе контроллера -dealloc вашего представления:

    [test release], test = nil;

  3. Установите его значение следующим образом:

    self.test = [NSDictionary dictionaryWithObjectsAndKeys:...];

  4. Доступ к свойству count осуществляется следующим образом:

    NSLog(@"Count: %u", test.count);

    Или:

    NSLog(@"Count: %u", [test count]);

    Обратите внимание, что -count возвращает целое число без знака, поэтому вы должны использовать %u для форматирования его значения.

1 голос
/ 29 июля 2010

Словарь, который вы создаете, выпущен автоматически. Вы используете удобный метод (dictionaryWithObjectsAndKeys:), который возвращает новый автоматически выпущенный объект.

Автоматически освобожденный объект освобождается (и освобождается) через некоторое время после его создания, поэтому в программе он падает позже.

Вам необходимо сохранить возвращенный словарь или создать новый словарь, используя метод alloc / init.

В любом случае, вам нужно помнить, чтобы выпустить словарь, когда вы закончите с ним.

Вам следует ознакомиться с основными правилами и соглашениями по управлению памятью для Objective-C.

...