2011-12-30 7 views
0

可能性の重複:
NSString retain CountNSStringの基礎解明

私はiPhoneプログラミングのための初心者です。私はNSStringを扱っています。私は下で説明する疑いがある。

@implementation Sample; 

NSString *str; 

-(void)viewDidLoad 
{ 
    str = [[NSString alloc] initWithString:@"Hello"]; 

    // Why retain count is some random value? (Eg.2147234) 
    NSLog(@"retain count of string %d",[str retainCount]); 

    [str release]; 
} 

-(void)printString 
{ 
    // Why the value for "str" getting printed here, 
    // though its released in viewDidLoad? 
    NSLog(@"string is %@",str); 
} 

答えて

3
  1. retainCountを見てはいけません。それはあなたを混乱させ、助けになりません。

  2. 定数文字列はコードに組み込まれており、割り当てられたり解放されることはありません。他のオブジェクトと同じようにそれらを保持したり解放したりすることはできますが、いつでも一定の文字列を解放する必要はありません。

0

objective-cでは、initメソッドは必ずしもallocを使って作成された同じオブジェクトを返すわけではありません。自己を解放して別のオブジェクトを返すことがあります。

initWithStringの場合、新しい文字列を初期化するのではなく、@ "Hello"定数文字列オブジェクトを返す可能性が高いです。これは高速で負の副作用がないからです(両方の文字列が不変です)。

@Caleb氏によると、通常のメモリ管理規則は定数文字列には適用されません。あなたはそれを解放することはできません、それは常にそこにあります。

ただし、これは文書化されていない動作であり、変更される可能性があります。あなたはそれに依存することはできません。投稿したコードは、アクセスしようとしてはいけないものをリリースした後、バグです。

代わりに、標準的な慣行に従う必要があります。これは、オブジェクトを常に解放してから、ポインタの設定をnilにする必要があることを示します。リリース後にstrnilに設定した場合、予想される動作が表示されます。

さらに、ARCをオンにして、これらのすべてを忘れてください。