2012-03-22 4 views
0

以下は本のコードスニペットです。 [serialNumber release];の後にserialNumberがまだ新しい値に設定されているのはなぜですか?オブジェクト-cメモリ管理と混同しました

- (void)setSerialNumber:(NSString *)newSerialNumber 
{ 
NSString *newValue; 
// Is it a mutable string? 
if ([newSerialNumber isKindOfClass:[NSMutableString class]]) 
// I need to copy it 
newValue = [newSerialNumber copy]; 
else 
// It is sufficient to retain it 
newValue = [newSerialNumber retain]; 
[serialNumber release]; 
serialNumber = newValue; 
} 
+0

リリースでは、refCountを-1に減らすだけです。変数が割り当てを解除するとは仮定しません。 [メモリ管理](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/) – beryllium

+1

を参照してください。 'copy'は不変の文字列を' retain'に相当します。この 'if'の必要はありません。 – hamstergene

+3

最良の解決策は、 '@property(copy)NSString * serialNumber;を宣言し、' @ synthesize'してそれを行うことです。このコードを書く理由はありません。ありがとうございます。 – bbum

答えて

0

リリースメッセージは、retainCountを1減らします。これは、他の関数を呼び出すようなものです。
ポインタ変数に新しい値を割り当てると、前のステートメントで使用したオブジェクトではなくポインタを別のオブジェクトに再配置します。

+0

私は、プログラミング言語と人間言語の「リリース」の意味を混ぜ合わせています。 :-) – user1115269

+0

手動保持/解放を使用しているときはガベージコレクタはありません。 – bbum

+0

質問に関係していないのでガベージコレクタについての部分を変更しました。 –

2

newValueserialNumberは Objective-Cのオブジェクトへの単なるポインタです。 releaseまたはretainのようなメッセージを送信すると、ポインタが指す実際のオブジェクトに送信されます。

[serialNumber release]は、が指し示すオブジェクトにreleaseメソッドを送信します。次に、serialNumber = newValuenewValueと同じ値をserialNumberに割り当てます。その時点で、newValueポインタの値は、コピーまたは保持されているので、すべてがpeachyなので、変更可能な文字列(newSerialNumberまたはそのコピーと同じ値)が保持されています。

関連する問題