【问题标题】:Why does Instruments think this is leaking memory?为什么 Instruments 认为这是内存泄漏?
【发布时间】:2009-08-03 17:12:29
【问题描述】:

我有一个关于视图,我将它推送到 NavigationController 上。该视图有一个连接到 IBOutlet 的 UILabel。在 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 而不是其他任何东西...

我的问题是为什么?

【问题讨论】:

    标签: objective-c cocoa-touch


    【解决方案1】:

    我怀疑你泄露了applicationVersion UILabel。这将导致字符串作为副产品泄漏。在 iPhone 上出现这种情况的最常见原因是没有关注NIB memory management rules

    【讨论】:

    • 根据 Nib 内存管理规则,我应该在 setView 中释放 IBOutlet(如果视图为 nil),因为 UIViewController 将其 dealloc 实现为 setView。如果我在 viewDidLoad、setView 和 Dealloc 中添加 NSLog 消息,我不会注意到这一点。我观察到的是 dealloc 被调用,仅此而已。我从 setView 看到的唯一日志消息是 Xib 加载时 ?????
    【解决方案2】:

    实际上可能是 mainBundle 或 infoDictionary 泄漏了 - 系统可能正在缓存其中的一个或其他,因此它们被创建然后从未释放。

    尝试在您的 applicationDidFinishLaunching 中添加代码:

    [[NSBundle mainBundle] infoDictionary];
    

    在没有任何其他代码的情况下,查看 Leaks 是否指向该行作为泄漏的位置。在这种情况下,缓存就是问题所在,您可以忽略它。

    【讨论】:

    • 谢谢,我会试试的。当我进入 Instruments 下的 AboutView 时,我每 5 或 6 次才看到一个链接...
    【解决方案3】:

    在这种情况下,您甚至不需要创建 NSString 的实例,只需使用以下作用于 NSString 类(不是实例)的方法:

    NSString *versionLabel = [NSString stringWithFormat:@"Version %@", 
                                                 [[[NSBundle mainBundle] infoDictionary] 
                                                objectForKey:(NSString*)kCFBundleVersionKey]];
    

    如果以这种方式使用 NSString,则不必释放 versionLabel,因为从未分配过内存。

    【讨论】:

    • 此代码中分配的内存与原始代码中相同。分配的 NSString 实例只是为你自动释放。
    • 这就是我在实际调查泄漏之前的方式。
    猜你喜欢
    • 2012-05-30
    • 2015-08-04
    • 2016-08-03
    • 1970-01-01
    • 2013-03-23
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多