为什么initWithCoder有其他自我对象?

时间:2011-08-17 17:58:10

标签: objective-c cocoa initialization

我是Xcode和Objective-C的初学者,现在已经坚持了两天多。我希望你能帮助我。

我的项目是为OS X 10.6部署的,它使用垃圾收集,我正在使用Xcode 4.0.1。

我从Xcode提供的模板开始制作了一个多文档应用程序。我只有一个类作为NSDocument的子类。

对于打开文档,我使用initWithCoder:。此方法中的解码工作正常 - 我得到保存的值。 但是当我想在另一种方法(同一类)中使用它们时,这些值会“丢失”。

我认为使用init的正确组合犯了一些错误:initWithCoder:initWithContentsOfURL:等。 自我对象在initWithCoder:方法中总是具有不同的地址,然后在其他方法中。 我尝试了上述方法的大量组合,甚至试图在NSDocument内的超类(initWithCoder:)中调用不同的方法。

这是我的头文件:

#import <Cocoa/Cocoa.h>

@interface OptimiererZwoMultiDoc : NSDocument <NSCoding> {
    __strong struct bildanalyse { 
        float winkelo;
        ...
        float skalfak;    // Der Skalierungsfaktor, den dieses Bild erfahren muss damit es so gross ist wie das kleinste - Wert ist also immer <= 0
    };

    __strong struct bildanalyse *analyse;
    __strong int16_t anzahlanalysewerte;
    ...

@private
    NSTextView *ausgabe;
    ...
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification;
- (void) prepareAnalyseDoc;
...

@property (assign) IBOutlet NSTextView *ausgabe;
@property __strong struct bildanalyse *analyse;
@property __strong int16_t anzahlanalysewerte;
@end

当我尝试这个实现时:

#import "OptimiererZwoMultiDoc.h"

@implementation OptimiererZwoMultiDoc

@synthesize ausgabe;
@synthesize analyse;
@synthesize anzahlanalysewerte;
...


- (id)init
{
    self = [super init];
    NSLog(@"init self=%@",self);
    if (self) {
        ...
    }
    return self;
}


- (NSString *)windowNibName
{
    NSLog(@"windowNibName self=%@",self);
    return @"OptimiererZwoMultiDoc";
}


- (void)windowControllerDidLoadNib:(NSWindowController *)aController
{
    NSLog(@"windowControllerDidLoadNib self=%@",self);
    [super windowControllerDidLoadNib:aController];
}


- (BOOL) readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError{
     NSLog(@"readFromData self=%@",self);
     [NSKeyedUnarchiver unarchiveObjectWithData: data];
     if (outError) {
         *outError = [NSError errorWithDomain:NSOSStatusErrorDomain code:unimpErr userInfo:NULL];
     }
     return YES;
}


- (id) initWithCoder: (NSCoder *) coder{
    struct bildanalyse tempAnalyse;

    NSLog(@"initWithCoder self=%@",self);
    anzahlanalysewerte = [coder decodeIntForKey:@"anzahlanalysewerte"];
    ....
    return self;
}

然后我得到了这个输出:

  

init self = OptimiererZwoMultiDoc:0x2002955a0

     

readFromData self = OptimiererZwoMultiDoc:0x2002955a0

     

initWithCoder self = OptimiererZwoMultiDoc:0x20028f5e0

     

windowNibName self = OptimiererZwoMultiDoc:0x2002955a0

     

windowControllerDidLoadNib self = OptimiererZwoMultiDoc:0x2002955a0

如您所见,initWithCoder:中的对象self不同。为什么?我的代码出了什么问题?

2 个答案:

答案 0 :(得分:1)

您的-initWithCoder:遗失了self = [super initWithCoder:coder];。我不确定为什么你的-init-initWithCoder:都被调用 - 一个从NIB取消归档的对象应该只是接收后者 - 但上面的内容将是一个很好的起点。< / p>

答案 1 :(得分:0)

这是因为(如果Info.plist中的文档信息设置正确)Cocoa的文档处理机器会自动为您实例化NSDocument子类。因此,如果您正在使用-initWithCoder:手动创建自己的子类实例,那么很可能是完全多余的。我建议在继续前进之前阅读Apple的Document-Based Applications Overview