(iOS)临时变量的内存管理
问题描述:
因此,标准规则是如果一个对象是使用alloc创建的,复制或保留,它需要一个后续版本。使用便捷方法创建的对象是自动发布的。 但是用“=”定义并用在方法范围中的临时变量呢?例如(iOS)临时变量的内存管理
NSError *error = nil;
NSString *tempString = @"foo";
int number = otherInt * 32;
NSUInteger row = [indexPath row];
NSArray *sameArrayDifferentPointer = otherArray;
甚至
NSArray *sameArrayDifferentPointer = (*NSMutableArray) otherMutableArray;
我知道最后一个是“坏”,但编译罚款,不抛出异常。
答
error
,number
和row
不是对象(或指向对象的指针),所以它们不需要(并且实际上不能)被释放。 (number
是int,row
或者是一个无符号的int或无符号长,error
是指向零。)
tempString
将被自动释放,线路
NSString *tempString = @"foo";
是
等效NSString *tempString = [NSString stringWithString:@"foo"];
第二种写法使得它更清晰。同样,您的阵列相当于调用[NSArray arrayWithArray:otherArray]
。
答
But what about temp vars defined with "=" and used in the scope of a method?
同样的规则适用。那些值是alloc
,copy
还是retain
?我在您提供的示例中看不到一个alloc
,copy
或retain
。因此,不需要release
。
第二种情况如何更好?将一个常量字符串分配给一个变量没有任何问题。 – Caleb 2012-03-10 03:51:41
当然不是。而且你在这两个版本中都给一个变量分配一个常量字符串。更详细的更清楚发生了什么事情,这对澄清有帮助。但我认为第二个'通常更好'的说法可能太强大了 - 将会被编辑。 – 2012-03-10 03:54:30
具有完美的感觉。对于Objective-C甚至C语言来说都很新颖,指针的概念仍然让我兴奋不已。谢谢。 – TijuanaKez 2012-03-10 03:57:58