objective-c - 管理在类方法中创建的实例的生命周期的更好方法

标签 objective-c cocoa cocoa-sheet

在我正在编写的宠物应用程序中,在主窗口上,我有一些彼此对齐的自定义 View ,每个 View 都有一个标签、一个组合框和一个按钮。

单击按钮会调用在同一 View 中查找组合框的代码,然后调用以下函数(RVListEditorController 的类方法):

+ (void) editComboBox: (NSComboBox *) aComboBox
{
    // Analyze says "possible leak", but both methods ending the panel will release the controller.

    RVListEditorController *controller = [[RVListEditorController alloc] initWithComboBox: aComboBox];

    [NSApp beginSheet: [controller window]
       modalForWindow: [aComboBox window]
        modalDelegate: controller
       didEndSelector: NULL
          contextInfo: nil];
}

该代码创建 RVListEditorController 的实例。它控制一个面板,允许我编辑组合框中的列表(删除项目、排序项目等)。除其他控件外,它还有两个关闭它的按钮:“取消”和“确定”。

这两个按钮的代码是:

- (IBAction) closeSheetWithOK: (id) sender
{
    [NSApp endSheet: editingPanel];
    [editingPanel orderOut: self];
    [comboBoxValues setArray: valuesCopy];
    if (comboBoxValues.count > 0)
        [editedComboBox setStringValue: [comboBoxValues objectAtIndex: 0]];
    [self release];
}


- (IBAction) closeSheetWithCancel: (id) sender
{
    [NSApp endSheet: editingPanel];
    [editingPanel orderOut: self];
    [self release];
}

这是仅有的两个关闭工作表的按钮。我的问题是关于实例的生命周期管理。它在类方法中分配,但随后控制权再次交给 Cocoa,类方法结束。我能找到释放实例的唯一地方是关闭按钮的两个处理程序。我的问题是 beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo: 并不简单地打开工作表,然后等待它再次关闭,返回一个关闭方式的值。如果是这样的话,我可以在类方法中关闭实例,我会感觉好一些。

我的问题:是否有更好的方法来处理实例的生命周期,或者 Cocoa 中是否有某种东西允许我以模式方式打开工作表窗口,然后等待它再次关闭,这样我就可以释放之后的例子?我想不到,但毕竟我是一个相对新手。

FWIW,代码有效,因此没有错误。我对在类方法中分配某些内容然后必须在其自身的两个实例方法中释放的构造不太满意。

最佳答案

在我看来,这不应该是类方法,而您在定义其生命周期时遇到的问题是一个警告信号,表明它是在没有明确所有权的情况下创建的。

关于objective-c - 管理在类方法中创建的实例的生命周期的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6794862/

相关文章:

c++ - 将单个字节从 Enum 附加到 NSMutableData

html - 如何防止 WebView 缩小呈现的网页?

objective-c - 如何在 NSOutlineView 中创建右键菜单?

objective-c - 如何将 NSPanel 显示为工作表

objective-c - UIRefreshControl 文本覆盖在刷新指示器上

Objective-C 问题

iphone - LibXML 没有为我的 xpath 表达式找到任何节点

objective-c - 添加多个 NSSlider 以编程方式查看

xcode - 无法更改工作表上的文本标签

objective-c - 如何删除 Cocoa 添加到透明纸张的 "blur"效果?