Когда использовать себя? - PullRequest
1 голос
/ 14 марта 2009

У меня есть приложение для iPhone, в котором одно представление, Просмотр A, обновляет другое представление в панели вкладок, Просмотр B, используя:

// This works.
- (void) reloadData
{
    MyDB * db = _GET_DB_CLASS;
    if(data != nil) // data is a property of type NSMutableArray
        [data release];

    NSMutableArray * d = [db getDataQuery];
    data = s; // Don't release since we are not using the accessor. And retain count should be 1.
}

Если я это сделаю, это не сработает (например, я обновляю B, затем переключаюсь на B, сбой. Я не вижу в журналах ничего полезного ...).

    NSMutableArray * d = [db getDataQuery];
    self.data = s; // Doesn't work
    [data release];

Я не использовал пользовательский установщик. Что происходит?

Ответы [ 4 ]

1 голос
/ 13 апреля 2009

Я полностью забыл об этом. Слишком много работы. Поэтому я не уверен, какова была точная природа проблемы. Но я внимательно посмотрел на retainCounts в отладчике (прежде чем попробовать то, что предложил Лу).

Это проблема сохранения / выпуска. Я предполагаю, что правило должно соответствовать вашему использованию. В любом случае это работает:

- (void) reloadFridgeData
{
    MyDB * db = _GET_DB_CLASS;
    if(self.data != nil)
    {
        self.data = nil;
    }

    NSMutableArray * newData = [db getData];
    self.data = newData;
    [newData release];
}
0 голосов
/ 22 июля 2009

Если данные, безусловно, являются свойством без базового значения с тем же именем, то к ним нужно обращаться из self, как в [[self data] release] или [self.data release]. Однако, как уже упоминалось, если для свойства установлено автоматическое сохранение, вы можете выполнить то же самое, установив для свойства новое значение, например nil. (Как вы уже сделали в коде, который вы отметили, работает.)

0 голосов
/ 16 марта 2009

Как правило, если вы просто используете свойство retain, вы всегда должны использовать self.data и вызывать сгенерированный установщик.

Он:

  1. Вызывает освобождение старого значения автоматически (проверяет ноль)
  2. Звонки сохраняются на новом значении

Тогда ваш код будет просто:

self.data = s;
[s release];

Две вещи, которые нужно сделать для отладки:

  1. Использовать статический анализ - лично я нашел этот инструмент на 100% точным с проблемами сохранения / выпуска: http://clang.llvm.org/StaticAnalysisUsage.html

  2. Следуйте инструкциям в моем блоге об отладке памяти на iPhone:

http://loufranco.com/blog/files/debugging-memory-iphone.html

0 голосов
/ 14 марта 2009

Вы объявили, что ваше свойство данных является "сохранить", а не "назначить"? Вы должны иметь что-то вроде:

@ свойство (сохранить) NSMutableArray * data;

Если нет, то при назначении свойству данных оно не будет увеличивать счетчик ссылок. Ваш последующий релиз освободит объект, и следующая ссылка на свойство данных будет аварийно завершена.

Посмотрите на Apple документы для семантики сеттера для получения дополнительной информации о сохранении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...