我有一个About View,我将其推送到NavigationController。视图有一个UILabel连接到IBOutlet。在viewDidLoad中,我使用包版本号(一个字符串)填充UILabel。使用仪器测试表明标有注释的行正在泄漏内存: -
viewDidLoad {
[super viewDidLoad];
self.title = @"About";
// Line below is the suggested culprit ***
NSString *versionLabel = [[NSString alloc] initWithFormat:@"Version %@",
[[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString *)kCFBundleVersionKey]];
self.applicationVersion.text = versionLabel;
[versionLabel release];
versionLabel = nil;
}
我假设它建议使用NSString而不是其他任何东西......
我的问题是为什么?
答案 0 :(得分:2)
我怀疑你是否正在泄漏applicationVersion
UILabel。这将导致字符串作为副产品泄漏。 iPhone上最常见的原因是未能遵循NIB memory management rules。
答案 1 :(得分:0)
在这种情况下,您甚至不需要创建NSString的实例,只需使用以下方法作用于NSString类(而不是实例):
NSString *versionLabel = [NSString stringWithFormat:@"Version %@",
[[[NSBundle mainBundle] infoDictionary]
objectForKey:(NSString*)kCFBundleVersionKey]];
如果以这种方式使用NSString,则不必释放versionLabel,因为从未分配过内存。
答案 2 :(得分:0)
它实际上可能是mainBundle或infoDictionary泄漏 - 系统可能正在缓存其中一个或另一个,因此它们正在被创建然后从未被释放。
尝试添加到您的applicationDidFinishLaunching代码:
[[NSBundle mainBundle] infoDictionary];
没有任何其他代码,看看Leaks是否指向该行作为泄漏的位置。在这种情况下,缓存是问题,您可以忽略它。