- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 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/
请问我应该使用哪个版本,在我的旧应用程序中我似乎使用“B”但是当我在网上查看很多示例时我看到很多看起来像“A”的版本。 // A - (id)initWithCoder:(NSCoder *)deco
在此代码中,我从 .xib 加载 View Controller (以及关联的 View ): -(id)initWithCoder:(NSCoder *)coder { // add
请向我解释一下什么是 initWithCoder? 谢谢。 最佳答案 initWithCoder:是NSCoder协议(protocol)的一部分,该协议(protocol)是Cocoa序列化系统的一
NSCoding 如何处理指向其他对象而不是值的指针的编码和解码?我有一系列需要编码的模型类,并且它们需要通过弱属性相互引用。我惊讶地发现,这些引用似乎在编码、保存到文件、然后从文件中读取并解码后得以
在我的项目中,我导入了一些第三方框架,例如 google-maps。 EveryThing 在编译时工作正常,但在运行时,应用程序崩溃,我可以跟踪可疑方法: //Invoked when the cl
我使用以下代码来子类化 UIView 并向其添加一些边框。问题是它没有考虑自动布局约束。我希望考虑到自动布局,然后 UIView 上绘制有边框。任何帮助都会非常感谢。 - (instancetype)
initWithConder 内部self.superview将始终返回 (null)为了我。 如何解决这个问题? 谢谢 最佳答案 情况总是如此,因为您无法将 View 添加到 super View
当我在与 Storyboard关联的 viewcontroller 中编写以下代码时,我遇到了异常“NSInternalInconsistencyException”: - (id)initWithC
我在 initWithCoder 方法中遇到泄漏。 unarchiveObjectWithData:cacheData 是否返回一个自动释放的对象?谁负责释放从 unarchiveObjectWith
我正在尝试复制具有某些属性的 UIView。 UIView 重写了drawLayer: 方法来绘制自定义形状。 我正在使用 NSKeyedArchiver、粘贴板和 NSKeyedUnarchiver
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improv
我想我缺少一些基本的东西...... 我用 NSCoding 实现了一个类,也用 NSCoding 实现了一个子类,但是当我调用子类的 initWithCoder 时,我得到InvalidArgume
好的,所以我想用 initWithCoder 完全理解这段代码中发生了什么。在阅读了几个建议的文档并一遍又一遍地阅读一本关于委托(delegate)、核心位置、指定初始化程序的书中的章节后,我认为这是
我想知道的重要事情是我正在使用 Storyboard。我在 didFinishLaunchingWithOptions 中执行以下操作: UIStoryboard *sb = [UIStoryboar
我的应用程序在 iOS 11.2 中运行良好,但在 iOS 11.3 中会崩溃。我有异常(exception) Terminating app due to uncaught exception 'N
假设我从 NSKeyedArchiver 创建了一个文件,并且该文件被第三方修改/替换。因此,当我尝试取消存档文件时。应该是对象初始化失败。 但是 initWithCoder() 不是一个可失败的初始
这将加载一个数组 - (id)initWithCoder:(NSCoder*) coder { self = [super initWithCoder: coder]; if (sel
正如我在上述主题中的问题所述,您通常需要满足哪些要求才能说“好的,我需要 encodeWithCoder: 和 initWithCoder: 实例化这个”?通常你可以将对象状态写入 NSUserDef
我正在模拟器 3.1.3 版本上测试我的应用程序,它运行良好。当模拟器3.2或4.0时,它从一开始就崩溃了: 2010-09-28 18:36:39.957 Angeloni[23268:207] *
谁能解释一下何时使用 initWithNibName 以及何时使用 initWithCoder? 最佳答案 initWithNibName: 通常与 View Controller 对象一起使用。这个
我是一名优秀的程序员,十分优秀!