2012-03-29 35 views
2

これは私の方法の1つです。保持されたオブジェクトのメモリを解放する方法

- (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をプライベートインスタンスとして宣言し、_searchKeywordreadonlyというプロパティとして宣言しました。私の実装ファイルでは、両方のインスタンスをdeallocにリリースしました。

私はAnalyzeツールを実行しましたが、この問題は問題として表示されませんでした。しかし、私はそれに疑問を持っています。

だから、私はこのことに取り組むために必要な方法を教えてください。

私はXCode4とiOS 4.3で作業しています。

ありがとうございました。

+0

オブジェクトを「[object_address release]」でリリースします。 –

答えて

2

jaydee3さんの回答が正しいです。私はあなたにを合成したアクセサで@propertiesを使うべきだと付け加えます。次に、インスタンス変数を直接設定するのではなく、アクセサメソッドを使用します。そうすれば、インスタンス変数のすべてのメモリ管理をアクセサメソッドにカプセル化できます。これにより、読み込みが容易になり、エラーが発生しにくくなり、将来コードを修正しやすくなります。

だから、あなたの.h(またはあなたの。プロパティが "プライベート" でなければなりません場合はメートル):あなたの.mで

@property (nonatomic, copy) NSString *searchKeyword; 

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

    [super dealloc]; 
} 

@synthesize searchKeyword = _searchKeyword; 

最後に、あなたの-getSearchResultsByKeyword:searchOptions:searchGroupsInResult:方法で:

self.searchKeyword = keyword; 

代わりの

_searchKeyword = [keyword retain]; 

これで心配する必要はありませんまたはを保持することについてsearchKeyword。 @synthesizeディレクティブによって生成されたセッターメソッドは、あなたのためにそれを処理します。 Declared Propertiesに関するAppleのドキュメントを読むことをお勧めします。

0

同じものへのポインタである2つのオブジェクトがある場合、どのオブジェクトをリリースするかは関係ありません。指されていることは、参照カウントが減っていくところです。

これを1か所でリリースし、アナライザが不平を言っていないと問題はありません。

2

ivarに割り当てるので、それを保持する必要があります。これは正しいです。 dealloc内でそれを解放することも正しいです。しかし、十分ではありません。 2つのこと:

1)文字列を保持するのではなく、コピーする方がよい。したがって、_searchKeyword = [keyword copy];を使用してください。 (これも保持されるので、それ以降はretainCountが1になります)

2)メソッドを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

絶対保持数は無意味です。 「コピー」の結果は+1保持カウントである。実際の保持数は大きく異なる可能性があります。 – bbum

+0

残念なことに、@bbumには、コピーされたオブジェクトの保持カウントを正確に1つのものとして引用するドキュメントバグがあります:「オブジェクトのコピーだけでなく、ほとんどの場合、保持カウントが1にリセットされます」[「メモリ管理のしくみ」] (http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects.html#//apple_ref/doc/uid/TP40002974-CH4-SW10)、Cocoaの図2.5のすぐ下にあります基礎。 –

関連する問題