2012-03-22 40 views
0

下面是一本書的代碼片段。爲什麼serialNumber[serialNumber release];之後仍然會設置爲新值?與object-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

release只是將refCount減少爲-1。它不假定變量將被釋放。閱讀[內存管理](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/) – beryllium 2012-03-22 10:23:24

+1

'copy'等同於'retain'用於不可變的字符串 - 不需要這個'if' 。 – hamstergene 2012-03-22 10:24:13

+3

最好的解決方案是聲明'@property(copy)NSString * serialNumber;','@ synthesize'並且完成它。沒有理由寫這些代碼。 – bbum 2012-03-22 16:43:27

回答

0

釋放消息將retainCount遞減1.它就像調用任何其他函數一樣。
當您爲指針變量賦值一個新值時,您將把指針(不是剛纔在前面語句中使用的對象)重定位到其他對象。

+0

謝謝。我在編程語言和人類語言中混淆了「釋放」的含義。 :-) – user1115269 2012-03-22 10:46:53

+0

使用手動保持/釋放時沒有垃圾回收器。 – bbum 2012-03-22 14:59:15

+0

更改了有關垃圾回收器的部分,因爲它與問題無關。 – 2012-03-22 15:46:24

2

newValueserialNumber只是指針到Objective-C的對象。當您發送像releaseretain這樣的消息時,它們將被髮送到指針指向的實際對象。

[serialNumber release]release方法發送給serialNumber指向的對象。然後,serialNumber = newValue將與newValue指針相同的值賦給serialNumber。此時,newValue指針的值是一個可變字符串(或者與newSerialNumber相同的值或其副本),它已被保留,因爲它被複制或保留,所以一切都很好。