2017-05-09 114 views
1

我是Objective C的新手,我非常感谢解决内存泄漏的任何帮助。我正在尝试解决GPUImageFramework中发生的内存管理问题。存储在NSMutable字典中的对象的潜在泄漏(GPUImageFramework)iOS 8+

在下面我收到以下消息的方法以蓝色高亮:

  • 方法返回一个+1 Objective-C的对象保留计数
  • 对象泄露:分配对象未引用更高版本在此执行路径并具有保留的计数+ 1

    -(void)setAndExecuteUniformStateCallbackAtIndex:(GLint)uniform forProgram:(GLProgram *)shaderProgram toBlock:(dispatch_block_t)uniformStateBlock; 
    { 
        [uniformStateRestorationBlocks setObject:[uniformStateBlock copy] forKey:[NSNumber numberWithInt:uniform]]; 
    
        uniformStateBlock(); 
    
    } 
    

enter image description here

我认为存储在NSMutable字典中的方法需要释放到内存中。

请有人指点我在正确的方向吗?

+0

你有ARC(自动引用计数)功能为您的项目或者是你做手工的内存管理('release','retain')? – CRD

+0

我在GPUImageFramework中启用了ARC。 –

回答

0

我有GPUImageFramework

中启用ARC您可能需要启用它为您的项目,不只是框架,或者您需要手动处理内存管理。

子表达式[uniformStateBlock copy]以错误语言“+1保留计数”返回一个对象。即呼叫者“拥有”并且呼叫者必须释放的对象。

当你的代码插入一个对象到数组中时,数组本身也拥有所有权,即保留。它没有而是从调用者那里获得所有权,它仍然拥有由copy返回的块,并且正是这种所有权永远不会放弃,从而导致泄漏,如错误所述。

如果您启用ARC,它将处理此问题并在适当的位置释放该块的呼叫者所有权。

否则,当呼叫者不再需要该块(仍然保留具有所有权的阵列)时,您可以关闭ARC并插入release呼叫。

HTH