Search code examples
objective-ciosmemory-managementxcode4memory-leaks

How to release memory of a retained object


This is one of my method.

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

In my method I have called retain on the objects which are parameters. So I have owned the object and has increased the retain count. So my problem is, how do I decrease the retain count after the

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

call. ( [keyword release] or [_searchKeyword release] ) ??

In my header file I have declared the _searchOptions as a private instance and _searchKeyword as a readonly property. In my implementation file, I have released both instances in dealloc.

I ran Analyze tool and it did not show this thing as an issue. But I have a doubt on it.

So, please show me a necessary way to work on this thing.

I'm working on XCode4 and iOS 4.3.

Thanks.


Solution

  • jaydee3's answer is correct. I would add that you really should use @properties with synthesized accessors. Then, instead of setting your instance variables directly, use the accessor methods. That way you can encapsulate all of the memory management of your instance variables in the accessor methods. This has the advantage of being more readable, much less error prone, and makes your code easier to modify in the future.

    So, in your .h (or in a class extension in your .m if the properties should be "private"):

    @property (nonatomic, copy) NSString *searchKeyword;
    

    In your .m:

    - (void)dealloc
    {
        self.searchKeyword = nil;
    
        [super dealloc];
    }
    
    @synthesize searchKeyword = _searchKeyword;
    

    Finally, in your -getSearchResultsByKeyword:searchOptions:searchGroupsInResult: method:

    self.searchKeyword = keyword;
    

    instead of

    _searchKeyword = [keyword retain];
    

    Now you don't have to worry about releasing or retaining searchKeyword. The setter method generated by the @synthesize directive will take care of it for you. I suggest reading Apple's documentation on Declared Properties.