2011-01-15 23 views
0

は、関連するコードです:なぜこのNSStringを解放できないのですか?ここで

NSString *address = [NSString stringWithFormat:@"%@", [defaultServer root]]; 
address = [address stringByAppendingFormat:@"%@", [defaultServer login]]; 
address = [address stringByAppendingFormat:@"?%@", [params urlEncodedString]]; 

NSString *response = [[NSString alloc] init]; 
response = [self getResponseFromWebAddress:address]; 

[response release]; 
[address release]; 

このコードはここでエラーはありませんが、後でいくつかのアップルのライブラリの中には、「割り当て解除インスタンスに送信されたメッセージ」エラーがスローされます。しかし、私がライン[address release]をコメントアウトするとうまく動作します。どうして?私はメモリ管理をよく理解していないので、これが私を混乱させます。

答えて

6

このライン:stringWithFormat:stringByAppendingFormat:方法によって提供される自動解放NSString sの

NSString *address = [NSString stringWithFormat:@"%@", [defaultServer root]]; 

そして、その次の行のすべての作業。 を手動で解放するはずはありません。自動解放プールがそれを処理するからです。

そして、ここで:

NSString *response = [[NSString alloc] init]; 
response = [self getResponseFromWebAddress:address]; 

あなたは、すぐに自動解放され、別の文字列([self getResponseFromWebAddress:address])にresponse変数を指して、新しいNSStringを割り当てています。割り当てられたオブジェクトには利用可能なポインタがなくなり、それ以上解放することはできず、したがってリークします。

両方の問題を解決するには、alloc-init行とリリース行を削除します。あなたのaddress文字列もひとつの文で初期化することができます。

// Combine all three arguments into one format string 
NSString *address = [NSString stringWithFormat:@"%@%@?%@", 
         [defaultServer root], 
         [defaultServer login], 
         [params urlEncodedString]]; 

NSString *response = [self getResponseFromWebAddress:address]; 

// No need to release either variable 
+0

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

2

はNARC(新しい、アロケーション、保持、コピー)ルールを覚えておいてください。 オブジェクトは、これらのメッセージのいずれかで作成された場合にのみ解放する必要があります。 それ以外の場合、オブジェクトは自動リリースされます。

+0

私はこれまでにNARCルールについて聞いたことがありません。だから私はそれがこのような何かを意味していると推測している 'NSDictionary * params = [[NSDictionary alloc] initWithObjectsAndKeys:username、@" username "、password、@" password "、nil];'私は'initWithObjectsAndKeys'です。新しいことを教えてくれてありがとう! –

+0

実際にはありません。これは-alloc(あなたの[NSDictionary alloc])によって作成され、-initWithObjectsAndKeys:によって*初期化されます(作成されません)。したがって、あなたはそれを解放する必要があります。また、元の答えのタイプミス:それは-copyであり、-cloneではありません。 –

+1

'クローン'は 'コピー'であるべきだと考えてください;-) – NSGod

関連する問題