Как освободить память о сохраненном объекте - PullRequest
2 голосов
/ 29 марта 2012

Это один из моих методов.

- (void)getSearchResultsByKeyword:(NSString *)keyword 
                searchOptions:(NSArray *)searchOptions 
         searchGroupsInResult:(NSArray *)searchGroupsInResult
{
    _searchKeyword = [keyword retain];
    _searchOptions = [searchOptions retain];
    _searchGroupsInResult = [searchGroupsInResult retain];
    [_searchResultsGroups removeAllObjects];
    [_searchResultsGroupsIndexToNameMap removeAllObjects];
    _pageNo = 1;
    [[NSNotificationCenter defaultCenter] postNotificationOnMainThreadName:SearchResultsRetrievingStartLodingNotification 
                                                                object:self];
    [_dataProvider startGettingSearchResultsByKeyword:self.searchKeyword 
                                    searchOptions:_searchOptions
                             searchGroupsInResult:_searchGroupsInResult
                                           pageNo:_pageNo
                                         delegate:self];
}

В моем методе я назвал retain для объектов, которые являются параметрами.Таким образом, я владел объектом и увеличил счет удержания.Поэтому моя проблема заключается в том, как уменьшить количество сохраняемых данных после вызова

[_dataProvider startGettingSearchResultsByKeyword:self.searchKeyword 
                                        searchOptions:_searchOptions
                                 searchGroupsInResult:_searchGroupsInResult
                                               pageNo:_pageNo
                                             delegate:self];

.([keyword release] или [_searchKeyword release]) ??

В моем заголовочном файле я объявил _searchOptions как частный экземпляр и _searchKeyword как свойство readonly.В моем файле реализации я выпустил оба экземпляра в dealloc.

Я запустил инструмент Анализ, и он не показывал эту проблему как проблему.Но у меня есть сомнения в этом.

Итак, пожалуйста, покажите мне необходимый способ работы с этой штукой.

Я работаю на XCode4 и iOS 4.3.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 29 марта 2012

Поскольку вы присваиваете ивару, вы должны сохранить его. Это правильно. Выпускать его в dealloc тоже правильно. Но этого недостаточно. Две вещи:

1) Лучше копировать строки, чем сохранять их. Так что используйте _searchKeyword = [keyword copy];. (Это также сохраняется. Таким образом, retainCount равен 1 после этого.)

2) Также существует проблема, когда вы вызываете свой метод во второй раз. Это та точка, где у вас есть утечка. Вы присваиваете своему значению ivar `_searchKeyword 'новое значение, отклоняя указатель на старое ключевое слово, которое все еще сохраняется. Поэтому, прежде чем назначать новый, отпустите старый.

Пример:

[_searchKeyword release];
_searchKeyword = [keyword copy];

Если вы скопируете это, это хорошо, но если вы сохраните его, было бы даже лучше сделать это так (в случае, если оба ссылаются на один и тот же объект):

[keyword retain];
[_searchKeyword release];
_searchKeyword = keyword;
2 голосов
/ 29 марта 2012

jaydee3 ответ правильный.Я бы добавил, что вы действительно должны использовать @properties с синтезированными аксессорами.Затем вместо прямой установки переменных экземпляра используйте методы доступа.Таким образом, вы можете инкапсулировать все управление памятью переменных вашего экземпляра в методах доступа.Преимущество этого метода в том, что он более читабелен, гораздо менее подвержен ошибкам и облегчает изменение кода в будущем.

Итак, в вашем .h (или в расширении класса в .m, если свойствадолжно быть "private"):

@property (nonatomic, copy) NSString *searchKeyword;

В вашем .m:

- (void)dealloc
{
    self.searchKeyword = nil;

    [super dealloc];
}

@synthesize searchKeyword = _searchKeyword;

Наконец, в вашем -getSearchResultsByKeyword:searchOptions:searchGroupsInResult: методе:

self.searchKeyword = keyword;

вместо

_searchKeyword = [keyword retain];

Теперь вам не нужно беспокоиться о выпуске или с сохранением searchKeyword.Метод setter, сгенерированный директивой @synthesize, позаботится об этом за вас.Я предлагаю прочитать документацию Apple по Объявленные свойства .

0 голосов
/ 29 марта 2012

Когда есть два объекта, которые являются указателями на одну и ту же вещь, не имеет значения, какой из них вы называете release. Дело в том, где счетчик ссылок уменьшается.

Если вы выпустили его в одном месте и анализатор не жалуется, у вас нет проблем.

...