好的,因此Apple为我们带来了ARC,这很棒。将我的应用程序重构为AR​​C后,几乎所有功能都可以正常工作,并且现在开发和维护起来要容易得多。

我仍然不知道只有一个问题。

我的工作管理程序在自己的窗口中显示提案,订单等的不同详细信息。所以我有一个特殊的类,其中windowControllers由initWithWindowNibName分配和初始化,然后用showWindow显示窗口:

DetailWindowController *proposalWindowController = [[DetailWindowController alloc] initWithWindowNibName:@"ThePorposalWindow"];
[proposalWindowController showWindow:nil];

在ARC之前,WindowController的实例进行了发布,如documentation所示:
- (void)windowWillClose:(NSNotification *)notification
{
   [self autorelease];
}

但是现在使用ARC不再可能,而且使情况变得更糟的是,在我的特殊类(分配并启动WindowController)中,由于没有指向windowController的指针,因此ARC释放了相同的windowController。

我的想法是将windowController复制到一个可变数组中:
[proposalWindowArray addObject:proposalWindowController];
[[proposalWindowArray lastObject] showWindow:nil];

并在windowControllers委托(delegate)方法windowWillClose中向我的特殊类发布通知:
- (void)windowWillClose:(NSNotification *)notification
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ProposalWindowWillClose" object:[[self window] windowController] userInfo:nil];
}

在我的特殊类中,我听通知并从数组中删除对象:
- (void) proposalWindowWasClosed: (NSNotification *) notification
{
    [proposalWindowArray removeObjectIdenticalTo:[notification object]];
}

它有效,但是我仍然不相信这是正确的方法。

是否有人有相同的问题或改善的技巧?

最佳答案

我可能会使用委托(delegate)方法而不是通知方法。通常,最好有一个外部对象来跟踪打开的窗口。像旧系统一样,自保留对象破坏了对象所有权的基本要点,使查找事物变得困难(例如“给我一个打开的窗口列表”)。只是“漂浮”在外面的非Singletons通常会重新咬住您的体系结构(我不得不经常修复此问题)。

就是说,有时拥有所有权至少很方便,最糟糕的是世界末日。如此拥有。唯一的区别是您需要显式地执行此操作,而不是匹配泄漏和过度发布(这是您的旧代码正在执行的操作)。

创建一个私有(private)的strong属性。给它分配self。这将创建一个retain循环,直到将属性设置为nil为止。

10-01 18:39