为什么仪器认为这是泄漏记忆?

时间:2009-08-03 17:12:30

标签: objective-c cocoa-touch

我有一个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而不是其他任何东西......

我的问题是为什么?

3 个答案:

答案 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是否指向该行作为泄漏的位置。在这种情况下,缓存是问题,您可以忽略它。