我想在警报中声明要使用的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"];
等
甚至在每种情况下分配字符串以便在最后释放它......
嗯,这里最好的方法是什么?
谢谢,
迈克尔:)答案 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];
}