objective-c - 为什么 initWithCoder 有其他自对象?

标签 objective-c cocoa initialization

我是 Xcode 和 Objective-C 的初学者,并且在一个非常简单的事情上坚持了两天多。我希望你能帮助我。

我的项目是针对 OS X 10.6 部署的,它使用垃圾收集,而我使用的是 Xcode 4.0.1。

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

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

我认为我在使用 init 的正确组合时犯了一些错误:initWithCoder: , initWithContentsOfURL: ETC。 自体对象在initWithCoder:中总是有不同的地址。方法然后在其他方法中。 我尝试了上述方法的多种组合,甚至尝试在 NSDocument 内调用父类(super class)( 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 不同。 。为什么?我的代码有什么问题吗?

最佳答案

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

关于objective-c - 为什么 initWithCoder 有其他自对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7097281/

相关文章:

objective-c - 如何在 Cocoa 中移动 Sprite ?

javascript - 在javascript中使用for循环重复初始化变量

objective-c - 什么是快速 C 或 Objective-C 数学解析器?

iphone - UIButton 不调用目标的选择器

objective-c - 找不到 kSecRandomDefault?

objective-c - 为 Macos 应用程序设置/获取 FN-Lock

c++ - 在 C++ 中处理字符串时如何使用 memset?

c++ - 为什么要初始化这个数据成员?

objective-c - 如何在 Objective C 的 typedef 枚举中添加新的枚举?

objective-c - 以一种奇怪的方式变成 0 的整数