以下是图书的代码段。为什么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;
}
答案 0 :(得分:2)
newValue
和serialNumber
只是Objective-C对象的指针。当您发送release
或retain
等消息时,它们会被发送到指针指向的实际对象。
[serialNumber release]
将release
方法发送到serialNumber
指向的对象。然后,serialNumber = newValue
将newValue
指针指定给serialNumber
。此时,newValue
指针的值是一个可变字符串(与newSerialNumber
相同的值或其副本),由于它被复制或保留,因此保留了该字符串,因此一切都很好。
答案 1 :(得分:0)
释放消息将retainCount减1。这就像调用任何其他函数一样 当您为指针变量分配一个新值时,您将指针(不是您在上一个语句中使用的对象)重定位到另一个对象。