使用Objective-C switch语句释放变量的适当位置在哪里?

时间:2011-09-20 20:10:19

标签: objective-c

在以下代码中

NSDictionary *test;

switch (xxx) {
  case 1:
   ...
   return YES;
   break;

  case 2:
   ...
   return NO;
   break;

  case 3:
   ...
   return YES;
   break;
}

[test release];

是否会正确释放“test”变量,或者每个switch case语句中是否都有单独的发布声明?

5 个答案:

答案 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,你可以这样做。