如何声明具有多个可能值的NSString

时间:2011-01-26 15:20:16

标签: iphone objective-c memory-management nsstring

我想在警报中声明要使用的NSString对象,但其实际内容取决于由某个变量确定的各种因素。我想知道如何最好地接近这个。在大多数情况下,我做过类似的事情:

- (void)info {
    NSString *targetString = [[NSString alloc] init];
    switch (self.target) {
        case 1:
            targetString = @"ONE";
            break;
        case 2:
            targetString = @"TWO";
            break;
        case 3:
            targetString = @"THREE";
            break;
        default:
            targetString = @"";
            break;
    }

NSString *message = [[NSString alloc] initWithFormat:@"Text: %@", targetString]; 
    UIAlertView *alert = [[UIAlertView alloc] 
                          initWithTitle:@"Info"
                          message:message 
                          delegate:self 
                          cancelButtonTitle:@"Ok!" 
                          otherButtonTitles:nil];
    alert.tag = kInfoAlert;
    [alert show];
    [alert release];
    [targetString release];
    [message release];
}

然而,当我通过构建分析器运行时,我收到消息告诉我字符串正在泄漏内存:

首先它说:

  

期间存储到'targetString'的值   它的初始化永远不会被读取

然后:

  

分配对象的潜在泄漏   在第137行并存入   'targetString'

这两条评论位于第136和137行,其中第136行是

NSString *targetString = [[NSString alloc] init];

另一种方法可能是将字符串声明为

NSString *targetString;

并在每种情况下将其设置为

targetString = [NSString stringWithFormat:@"ONE"]; 

甚至在每种情况下分配字符串以便在最后释放它......

嗯,这里最好的方法是什么?

谢谢,

迈克尔:)

3 个答案:

答案 0 :(得分:5)

内存泄漏的原因是因为您不必要地使用此行分配字符串

NSString *targetString = [[NSString alloc] init];

然后将其设置为文字对象。将targetString定义为nil,因为当您将其设置为另一个值targetString = @"ONE"时,您不再引用您分配的空字符串并导致内存泄漏。至于你的切换案例的方法,以确定好的价值。

答案 1 :(得分:2)

我相信这就足够了:

NSString *targetString = nil;

然后你不需要释放targetString。

答案 2 :(得分:0)

如何而不是开关:

- (NSString*) stringForIndex: (NSUInteger) index
{
    NSParameterAssert(index < 4);
    id strings[] = {@"none", @"one", @"two", @"three"};
    return strings[index];
}