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

Smi*_*key 0 iphone memory-management objective-c 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];
}
Run Code Online (Sandbox Code Playgroud)

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

首先它说:

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

然后:

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

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

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

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

NSString *targetString;
Run Code Online (Sandbox Code Playgroud)

并在每种情况下设置为

targetString = [NSString stringWithFormat:@"ONE"]; 
Run Code Online (Sandbox Code Playgroud)

等等

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

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

谢谢,

迈克尔:)

Joe*_*Joe 5

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

NSString *targetString = [[NSString alloc] init];
Run Code Online (Sandbox Code Playgroud)

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