Я новичок в 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:
. Зачем? Что не так с моим кодом?