2012-03-29 5 views
2

Это один из моих методов.Как освободить память сохраненного объекта

- (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]; 
} 

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

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

звонок. ([keyword release] или [_searchKeyword release]) ??

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

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

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

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

Спасибо.

+0

Вы отпускаете объект с '[object_address release]'. –

ответ

2

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

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

@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 по адресу Declared Properties.

0

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

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

2

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

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

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

Пример:

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

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

[keyword retain]; 
[_searchKeyword release]; 
_searchKeyword = keyword; 
+0

thanx jaydee3. Ваш ответ абсолютно полезен. Но у меня есть другой вопрос. Когда метод вызова «-getSearchResultsByKeyword: searchOptions: searchGroupsInResult:» в первый раз, счет сохранения «_searchKeyword» равен 0. Итак, после вызова «[_searchKeyword release]», что произойдет? – chinthakad

+2

Абсолютное значение остатка бессмысленно; Результатом «copy» является показатель сохранения +1. Фактическое количество удержаний может значительно отличаться. – bbum

+0

К сожалению, @bbum, есть ошибка документа, которая заставляет людей ссылаться на счет сохранения скопированного объекта как ровно один: «Копирование объекта не только дублирует его, но почти всегда сбрасывает счетчик сохранения на один» [«Как работает управление памятью»] (http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html#//apple_ref/doc/uid/TP40002974-CH4-SW10), чуть ниже цифры 2.5 в какао Основы. –

Смежные вопросы