【问题标题】:Core Data / NSArray Causing Leaks?核心数据 / NSArray 导致泄漏?
【发布时间】:2011-01-22 03:16:47
【问题描述】:

我有一个特定的泄漏,我似乎无法深入挖掘,因为我的搜索总是在某些 Apple 库中结束。一些退伍军人在处理此问题方面的任何帮助将不胜感激。

这里是相关的源代码:(用注释指出泄漏)

- (void)viewDidLoad {
//[super viewDidLoad];

NSManagedObjectContext *context = [(iEatAppDelegate*)[[UIApplication sharedApplication] delegate] managedObjectContext];

addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:creator action:@selector(launchCreatorWindow)];
self.navigationItem.rightBarButtonItem = addButton;

NSFetchRequest *fetReq = [[NSFetchRequest alloc] init];
[fetReq setEntity:[NSEntityDescription entityForName:entityName inManagedObjectContext:context]];
NSError *e = nil;

NSArray *temp = [context executeFetchRequest:fetReq error:&e];  
//leaking here according to performance tool

self.tableObjects = [[NSMutableArray alloc] initWithArray:temp];

if (e) {
    NSLog(@"%@, %@", e, [e description]);
}
[fetReq release];
}

我尝试释放 temp,但它与 EXC_BAD_ACCESS 一起崩溃,我相信这意味着它已经自动释放。

泄漏性能工具说它是一个类别:CFArray (store-deque) 事件:Malloc 还说我的图书馆负责。这是堆栈跟踪,编号 8 是我的 viewDidLoad 帧:

0 CoreFoundation __CFAllocatorSystemAllocate
1 CoreFoundation CFAllocatorAllocate
2 CoreFoundation _CFAllocatorAllocateGC
3 CoreFoundation _CFArrayReplaceValues
4 CoreFoundation CFArrayReplaceValues
5 CoreFoundation -[__NSPlaceholderArray initWithObjects:count:]
6 CoreFoundation -[NSArray initWithArray:copyItems:]
7 CoreFoundation -[NSArray initWithArray:]

这个真的让我卡住了,非常感谢任何帮助。

【问题讨论】:

    标签: iphone core-data memory-leaks


    【解决方案1】:

    这会导致您的泄漏:

    self.tableObjects = [[NSMutableArray alloc] initWithArray:temp];
    

    您创建一个保留计数为 1 的数组,然后使用 self.tableObjects(如果该属性被标记为保留)将计数增加到 2。

    然后在 dealloc 中,当您释放数组时,计数会回落到 1,而不是 0 - 所以数组永远不会被释放。

    相反,只需这样做:

     self.tableObjects = [NSMutableArray arrayWithArray:temp];
    

    这会返回一个自动释放的数组,因此最终的保留计数将只有 1。

    【讨论】:

      【解决方案2】:

      答案是我缺少一些基本的东西。 [NSMutableArray 分配] 保留计数 = 1 self.tableObjects = 保留计数 = 2 释放 保留计数仍然不是 0 泄漏。

      对不起

      【讨论】:

        【解决方案3】:

        这不是您泄漏的原因,但我认为无论如何都值得指出:您应该在将 addbutton 分配给 rightBarButtonItem 后立即释放它,因为它不会再次被需要/使用:

        self.navigationItem.rightBarButtonItem = addButton;
        [addButton release];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-19
          • 1970-01-01
          • 2015-11-05
          • 2011-03-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多