Objective c ARC在我使用本地NSOpenSavePanelDelegate方法之前将其杀死。有办法吗?

Objective c ARC在我使用本地NSOpenSavePanelDelegate方法之前将其杀死。有办法吗?,objective-c,cocoa,delegates,automatic-ref-counting,Objective C,Cocoa,Delegates,Automatic Ref Counting,我正在使用我的应用程序委托作为我的打开面板文件筛选器。这看起来有太多问题,所以我将面板委托代码拆分为一个新类。在设置NSOpenPanel对象时,我将它们的委托分配给一个对象Ialloc/init 我使用-panel:validateURL:error:,当我按下“打开”按钮时,它会触发,可能会说给定的文件是不允许的。我遇到了一个崩溃,EXEC\u BAD\u ACCESS。当我添加了init和dealloc方法来调用NSLog时,在面板打开之前,这两种方法都会被调用 是否有一些不寻常的调整,让

我正在使用我的应用程序委托作为我的打开面板文件筛选器。这看起来有太多问题,所以我将面板委托代码拆分为一个新类。在设置NSOpenPanel对象时,我将它们的委托分配给一个对象I
alloc
/
init

我使用
-panel:validateURL:error:
,当我按下“打开”按钮时,它会触发,可能会说给定的文件是不允许的。我遇到了一个崩溃,
EXEC\u BAD\u ACCESS
。当我添加了
init
dealloc
方法来调用
NSLog
时,在面板打开之前,这两种方法都会被调用


是否有一些不寻常的调整,让本地对象通过面板调用和块响应存活下来?或者我必须切换回某种全局委托实例吗?

您是否使用异步方法中的一种来完成处理程序块,
beginSheetModalForWindow:completionHandler:
beginWithCompletionHandler:
?如果是这样,只需在完成处理程序中放置对委托对象的引用。例如,在一个无用的语句中对其调用
-self

将他们的委托分配给一个对象I alloc/init

大多数代理分配都很弱,因此ARC很快就会放弃它

问自己“什么对代理有强烈的引用”或“谁拥有这个对象”

对你来说没什么

最简单的修复方法是将委托添加为创建面板的对象的属性


@property MyDelegateObject*ownedDelegate

这也有效。但它的意思是委托必须是相对全局的方法。因为我创建了这个新位置的多个实例,所以我可能会将代理移回应用程序全局实例。这取决于具体情况。除了打开的面板外,您的文件过滤器是否在其他任何地方使用?使用和丢弃对象比将应用程序委托变成你不知道如何处理的所有东西的垃圾场要好。你关于SOC的直觉非常正确。当您的面板被转储时,您始终可以将代理置零。My NSWindowController和NSDocumentController子类都有一个
-openDocument:
操作。由于委托是无状态的,文档控制器是应用程序全局的,所以我将委托移动为文档控制器的公共属性,以便任何窗口控制器都可以根据需要获取它。