困惑于object-c内存管理

时间:2012-03-22 10:19:17

标签: objective-c

以下是图书的代码段。为什么serialNumber之后[serialNumber release];仍然可以设置为新值?

 - (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;
}

2 个答案:

答案 0 :(得分:2)

newValueserialNumber只是Objective-C对象的指针。当您发送releaseretain等消息时,它们会被发送到指针指向的实际对象。

[serialNumber release]release方法发送到serialNumber指向的对象。然后,serialNumber = newValuenewValue指针指定给serialNumber。此时,newValue指针的值是一个可变字符串(与newSerialNumber相同的值或其副本),由于它被复制或保留,因此保留了该字符串,因此一切都很好。

答案 1 :(得分:0)

释放消息将retainCount减1。这就像调用任何其他函数一样 当您为指针变量分配一个新值时,您将指针(不是您在上一个语句中使用的对象)重定位到另一个对象。