在以下代码中
NSDictionary *test;
switch (xxx) {
case 1:
...
return YES;
break;
case 2:
...
return NO;
break;
case 3:
...
return YES;
break;
}
[test release];
是否会正确释放“test”变量,或者每个switch case语句中是否都有单独的发布声明?
答案 0 :(得分:6)
每次return XXX;
时,都不会在您的对象上调用release
。我建议不要回到手术中。最好做一些像:
BOOL result = NO;
switch (xxx) {
case 1: ... result = YES; break;
case 2: ... result = NO; break;
case 3: ... result = YES; break;
default: result = NO;
}
[test release];
return result;
答案 1 :(得分:4)
如果你总是想要发布测试,只需在switch语句之前使用[test autorelease]
,这将导致在函数返回后的某个时候调用release。
答案 2 :(得分:1)
如果它是一个类'字段,你应该用dealloc
方法释放它,否则,如果它是一个局部变量(在你的情况下似乎),你应该在它超出范围之前释放它(除非,对于corse,该方法的目的是返回一个动态分配的变量。)
答案 3 :(得分:1)
由于它是本地范围变量,并且只要您不在return
块结束之前离开(switch
),就可以在switch语句之后释放它。
如果你在alloc
个语句中没有case
它,它将保持为零并且将release
消息发送到nil元素没有问题,它是确定在switch语句后释放它。
答案 4 :(得分:1)
除了给出的好解决方案,你可以这样做:
@try {
switch(xxx) {
case 1:
...
return YES;
break;
case 2:
...
return NO;
break;
case 3:
...
return YES;
break;
}
} @finally {
[test release];
}
最后,即使在返回后,块也会运行。
autorelease解决方案可能看起来更干净,但如果由于某种原因你真的不想使用autorelease,你可以这样做。