关于NSWindowController和NSPersistentDocument核心数据教程的问题

时间:2010-08-15 14:35:10

标签: cocoa core-data

NSPersistentDocument Core Data Tutorial的“实施概述”部分中,它说:

  
      
  1. ...
  2.   
  3. 在nib文件中创建新的顶级对象的一个​​问题是,当您使用绑定时,对象会保留绑定到的其他对象。这意味着必须打破绑定以确保文档关闭时没有保留周期。此外,由于新控制器拥有的nib文件包含顶级对象,并且控制器的类不从NSWindowController继承,因此需要在窗口关闭时释放顶级对象。
  4.   

为什么不让控制器继承NSWindowController?有什么理由不行吗?或者这只是风格问题?

2 个答案:

答案 0 :(得分:1)

如下所述,我确实让它与NSWindowController子类一起使用,它确实可以节省相当多的代码。

这是我的子类标题:

#import <Cocoa/Cocoa.h>

@interface NewAccountSheetController : NSWindowController {
@private
    BOOL isValidForInsert;
    NSManagedObjectContext * managedObjectContext;
    NSObjectController * objectController;
    NSObjectController * targetController;
}

@property (setter=setValidForInsert:) BOOL isValidForInsert;
@property (nonatomic, retain) IBOutlet NSManagedObjectContext * managedObjectContext;
@property (nonatomic, retain) IBOutlet NSObjectController * objectController;
@property (nonatomic, retain) IBOutlet NSObjectController * targetController;

- (void)beginSheetForWindow:(NSWindow *)window;

- (IBAction)endSheet:(id)sender;

@end

以下是Pastebin中的实现。

我不知道如何描述所需的绑定等等,但是如果你熟悉上面的教程,他们应该直截了当地推断......我想。 : - )

答案 1 :(得分:0)

在示例中,它讨论的是控制工作表而不是窗口。工作表在技术上是一个窗口组件而不是窗口本身,因此它不能使用NSWindowController子类作为控制器。窗口控制器不知道如何处理另一个窗口所拥有的窗口。

上面的文字只是提醒你,虽然表单控制器看起来非常像一个窗口控制器但它不是一个,你必须手动处理由窗口控制器自动处理的释放。