使用ARC为AudioUnit的可可UI阻止的NSView的dealloc被调用(Using ARC

2019-10-19 10:09发布

最近,我将我AudioUnit插件利用ARC的所有接口代码(可可)。 然而,这导致了主要的NSView(由CocoaViewFactory创建的,并返回给插件作为一个属性)永远不必-dealloc调用。 这使得不可能配置用于的NSView构造的AUEventListener的 - 这是记录到导致崩溃 - 并创建内存泄漏的一吨(无由的NSView保留Objective-C的对象被解除分配,无论是)。

(*的NSView)有一个自动uiViewForAudioUnit - 我通过编译只CocoaViewFactory.m文件没有ARC,并在年底返回的NSView“解决”问题。 在关闭窗口的NSView -dealloc现在被称为,和内存被清理预期。

我和内存管理有点不确定自己的,所以很担心,这种解决方案会引起一些其他的内存错误。 我无法找到使用ARC的可可代码为基础,从工作的任何文件。 有没有人有任何想法或经验?

编辑:CocoaViewFactory.m文件的非ARC的版本是:

- (NSView *)uiViewForAudioUnit:(AudioUnit)inAU withSize:(NSSize)inPreferredSize {
if (! [NSBundle loadNibNamed: @"PluginName_CocoaView" owner:self]) {
    NSLog (@"Unable to load nib for view.");
    return nil;
}

[uiFreshlyLoadedView setAU:inAU];

NSView *returnView = uiFreshlyLoadedView;
uiFreshlyLoadedView = nil;  // zero out pointer.  This is a view factory.  Once a view's been created
                            // and handed off, the factory keeps no record of it.

return [returnView autorelease];
}

uiFreshlyLoadedView变量在CocoaViewFactory.h像这样宣称:

@interface PluginName_CocoaViewFactory : NSObject <AUCocoaUIBase>
{
    IBOutlet PlugingName_CocoaView *    uiFreshlyLoadedView;
}

它不是一个属性,它在XIB文件直接绑定到的NSView。

唯一的变化我试图建立这个作为ARC是取代最后一行在.m文件用时所做:

    return returnView;

盘算,调用此方法将创建自己的副本的AudioUnit过程returnView ,而当这种方法的范围结束它会被释放。 使用这条线,并编译成弓形,在一个NSView永远不会被释放。

然而,想着现在,我写,我意识到AudioUnit调用代码是不是对象 - ,它的所有C ++,和我没有桥接任何有意义的方式返回的视图。

文章来源: Using ARC for the Cocoa UI of an AudioUnit prevents NSView dealloc from being called