Почему initWithCoder имеет другой самообъект? - PullRequest
0 голосов
/ 17 августа 2011

Я новичок в 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

Как видите, объект self отличается от initWithCoder:. Зачем? Что не так с моим кодом?

Ответы [ 2 ]

1 голос
/ 17 августа 2011

Ваш -initWithCoder: отсутствует self = [super initWithCoder:coder];. Я не уверен, почему ваши -init и -initWithCoder: оба называются - объект, который разархивируется из NIB, должен просто получать последний - но вышеописанное было бы хорошим началом.

0 голосов
/ 17 августа 2011

Это потому, что (при условии, что информация о документе в вашем Info.plist настроена правильно) механизм обработки документов Cocoa автоматически создает для вас подкласс NSDocument. Поэтому, если вы используете -initWithCoder: для ручного создания своего собственного экземпляра подкласса, есть вероятность, что он совершенно лишний. Я бы предложил прочитать Обзор приложений на основе документов от Apple, прежде чем идти дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...