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)
等等
或者甚至在每种情况下分配字符串以便在最后释放它...
那么,这里最好的方法是什么?
谢谢,
迈克尔:)
内存泄漏的原因是因为您不必要地使用此行分配字符串
NSString *targetString = [[NSString alloc] init];
Run Code Online (Sandbox Code Playgroud)
然后将其设置为文字对象.将targetString定义为nil,因为当您将其设置为另一个值时,targetString = @"ONE"您不再引用您分配的空字符串并导致内存泄漏.至于你的开关案例的方法,以确定罚款的价值.
| 归档时间: |
|
| 查看次数: |
1692 次 |
| 最近记录: |