2011-01-20 10 views
0

オブジェクト私は私の主な方法で持っている:コードのこの部分を実行する上でNSStringのでメモリーを管理することは、ここで

int main (int argc, const char * argv[]) { 
    NSString *string=[[NSString alloc]init]; 
    NSLog(@"%@ The retain count is:%d", string, [string retainCount]); 
    NSLog(@"Hello, World!"); 
    return 0; 
}  

出力する「保持カウントがある:-1」されます。
allocを使用してオブジェクトを作成したので、保持カウントとして1を与えることを期待していました。 NSStringオブジェクトを保持または解放しようとすると、同様の問題が発生します。

NSArrayを試してみると、オブジェクトの作成直後の保持カウントが2になってしまいます。オブジェクトの処理方法の仕組みは分かりません。 説明してください! ありがとうございます。UINT_MAXを符号付きの値にキャストした場合は、

+2

はこれまで保持カウントを見ていません。ほとんど役に立たず、混乱の原因になるだけです。 @DarkDustは、あなたの記憶をどのように管理すべきかという素晴らしい答えを持っています。 – kubi

答えて

8

-1が表示されます。 UINT_MAXは、文字列リテラルオブジェクトを含む、リリースされていないオブジェクトの文書化された保持カウントです。

the documentationと言えば、私はretainCountが一般的にどのように有用でないかについて大きなボックスを読むことをお勧めします。

+0

@ Sahitya Tarumani:あなたが割り当てたものはすべて、割り当てを解除する必要があります。ココアでは、これを直接行うわけではありません。代わりに、あなたが解放し、オブジェクトを所有するすべてがそれをリリースしたときに、それ自体が解放されます。リテラル文字列のように割り当てられなかったオブジェクトは、割り当てを解除する必要はありません。割り当て解除が適切な時間にのみ行われるようにすることが参照カウントの唯一の理由であるため、割り当てを解除しないオブジェクトは保持をカウントする必要はありません。このようなオブジェクトは、保持カウントとして 'UINT_MAX'を返します。これらは、私が他のコメントで「永久オブジェクト」と呼んでいたものです。 –

+0

"リテラル文字列のように割り当てられていないオブジェクト" ... ...ステートメント{... NSString * string = [[NSString alloc] init]; ...} ...このステートメントは割り当てませんメモリを文字列に変換する –

+0

おっと!十分な注意を払っていなかった。 '[[NSString alloc] init]'は文字列リテラルではありませんが、永続的な空の文字列オブジェクトである*シングルトン*を提供します。 NSStringは不変なので、毎回新しいオブジェクトを作成する必要はありません。 –

14

生の保持カウント値には注意しないでください。これは、さまざまな値によって異なる値になる可能性があるためです。たとえば、最初の行では、@""に相当するもの、つまり空の文字列を割り当てています。これは、割り当てを解除できないオブジェクトによって最適化され、どこに配置しても共有されます。すべての静的文字列についても同様です。 [@"Hello" retainCount]によって返された値を見てください。

代わりに、の相対番号に注目する必要があります。つまり、保持カウントが増加したか(+1)、同じままになるか(+0)、減少したか(-1)ですか?

Foo *foo = [[Foo alloc] init]; 
[foo retain]; 
[foo release]; 
[foo autorelease]; 

alloc方法は+1を持つオブジェクトを返す、とretainもでそう1でカウントincreses:あなたは、常にこれらの相対値が0

に例をまとめることを確認する必要があります2行目の終わりには、+2にあります。 releaseautoreleaseの両方には-1の効果があります。したがって、4行目の最後には+0になり、すべて正常です。

は、いくつかの簡単なルールがあります:メソッド名がallocであれば、数+1を保持し、あなたがオブジェクトを取得します言葉copyまたはcreateで始まります。他のすべてのメソッド(特にgetで始まるメソッド)は、保持カウントが+0のオブジェクトを返す必要があります。あなたのメソッドは、オブジェクトを作成する必要があるが、その名前が+0オブジェクトが返されるべきであることを意味している場合は、この操作を行うことができます。

- (Foo *) bar { 
    Foo *result = [[Foo alloc] init]; // +1 
    return [result autorelease]; // -1 
    // Object lives until the autorelease pool is drained, 
    // but relative retain count is +0. 
} 
+0

int main(int argc、const char * argv []){ NSString * string = [[NSString alloc] init]; NSLog(@ "%@保持カウント:%d"、文字列、[string retainCount]); NSLog(@ "Hello、World!"); return 0; } –

+0

なぜこのコードスニペットを表示しますか? – DarkDust

+8

これは、相対保持回数を実際に見てはいけない理由です。自動解除は保持カウントに影響しません。それは、所有権を自動解放プールに転送することです。 – JeremyP

関連する問題