最近,我将我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 ++,和我没有桥接任何有意义的方式返回的视图。