цель c - освободить одноэлементное свойство - PullRequest
3 голосов
/ 02 марта 2011

У меня есть одноэлементный класс, который имеет mutableDictionary. Я инициализирую словарь в моем корневом viewController. позже я хотел бы очистить словарь и освободить память. Даже если счет сохранения равен 1, выпуск вызывает сбой:

- [Выпуск CFDictionary]: сообщение отправлено освобожденному экземпляру

возможно ли освободить одноэлементное свойство?

Спасибо

Ответы [ 4 ]

4 голосов
/ 02 марта 2011

Сначала я еще раз повторю то, что было сказано здесь: не звоните -retainCount !! Это деталь реализации.

См .: StackOverflow | когда использовать retainCount для отличного описания того, почему вы не используете retainCount.

Кроме того, я бы порекомендовал изучить дополнительную информацию о некоторых инвариантах, для которых нужно стрелять при написании синглетонов . У Дэйва Делонга есть отличное резюме того, как (и что более важно, почему он делает одиночные игры) определенным образом. Статья содержит ссылки на других разработчиков и их перспективы. Я бы рекомендовал ознакомиться с этими принципами, а затем пересмотреть вашу реализацию.

Наконец, просто чтобы сказать это еще раз:

Пожалуйста, перейдите на http://bugreport.apple.com и попросите об отмене -retainCount. Чем больше людей просят об этом, тем лучше.

1 голос
/ 02 марта 2011

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

Что касается проблемы, когда Какао говорит, что вы переиздаваете, даже если «количество удержаний равно 1», есть только один хороший совет, который вы когда-либо получите по поводу сохранения количества:

Не смотри на них!

Они вводят в заблуждение, и фактическое управление памятью объекта зависит от всевозможных сил, о которых подсчет хранения не может вам сказать.

В этом случае вы проверяете счет сохранения, чтобы увидеть, существует ли объект по-прежнему. Но не существует такой вещи, как объект с счетом сохранения 0 - когда вы отпускаете объект с счетом хранения 1, он освобождается. Любой результат, который вы получите от освобожденного объекта, является мусором, поэтому вы никогда не сможете запросить у объекта его счетчик сохранения и вернуть 0 - объекты с счетом хранения 0 буквально не существуют.

0 голосов
/ 14 апреля 2011

Согласен с комментариями повторно retainCount.Только не делайте этого.

  1. Инициализируйте словарь в синглтоне

  2. Добавляйте / удаляйте объекты из словаря по мере необходимости в других классах

  3. Излишние издержки на пустой словарь тривиальны, я бы не стал беспокоиться об их освобождении, когда пусто

  4. Используйте [dictionary removeAllObjects], чтобы удалить все, когдаНеобходимый

  5. Если в словаре хранятся объекты, которые вы хотите освободить в случае предупреждения памяти, попросите синглтона наблюдать UIApplicationDidReceiveMemoryWarningNotification и удалите из него все свои объекты.

  6. Если вы действительно хотите, чтобы ваша реализация выпустила весь словарь, я бы переопределил синтезированный метод получения и добавил синглтон-методы для взаимодействия со словарем следующим образом:

в MySingleton.m:

- (NSMutableDictionary *)myDictionary
{
    if (!_myDictionary) {
        _myDictionary = [[NSMutableDictionary alloc] init];
    }
    return _myDictionary;
}

- (void)setObject:(id)object inMyDictionaryForKey:(NSString *)key
{
    [self.myDictionary setObject:object forKey:key];
}

- (void)removeObjectInMyDictionaryForKey:(NSString *)key
{
    [self.myDictionary removeObjectForKey:key];
    if ([self.myDictionary count] == 0) {
        self.myDictionary = nil;
    }
}

- (void)removeAllObjectsFromMyDictionary
{
    self.myDictionary = nil;
}
0 голосов
/ 02 марта 2011

Любой выделенный объект может быть освобожден позже. Звучит так, как будто ты слишком много выпускаешь. Проверьте свои свойства и все ссылки на объект, чтобы убедиться, что вы не переиздаете его. Если словарь находится внутри одноэлементного класса, за его выпуск должен отвечать не одноэлементный класс, а пользовательский контроллер представления.

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