我想将归档(NSCoding)协议添加到我的模型类,然后我实现这两个方法encodeWithCoder:(NSCoder*)coder和initWithCoder:(NSCoder*)coder.MyModelClass有2个实例变量(NSString和NSImage),所以我使用该encodeObject:(id)object forKey:(NSString*)string方法对对象进行编码,加上特定键的值.但我一直得到错误:
*** -encodeObject:forKey: only defined for abstract class. Define -[NSArchiver encodeObject:forKey:]!
这是我的NSCoding方法的代码:
- (id)initWithCoder:(NSCoder *)coder {
[super init];
mainPath = [[coder decodeObjectForKey:@"mainPath"] retain];
icon = [[coder decodeObjectForKey:@"icon"] retain];
return self;
}
- (void)encodeWithCoder:(NSCoder *)coder {
NSLog(@"encode with coder is called");
[coder encodeObject:mainPath forKey:@"mainPath"];
[coder encodeObject:icon forKey:@"icon"];
}
Run Code Online (Sandbox Code Playgroud)
这就是我在控制器类中调用它们的方式:
id object = [assetArray objectAtIndex: [[rows lastObject] intValue]];
if ([object isKindOfClass:[ItemAssetModel class]])
NSLog(@"object is correct");
else
return NO;
NSData *data = [NSArchiver archivedDataWithRootObject: object];
Run Code Online (Sandbox Code Playgroud)
如果我更改了 …
基于我所经历的文档和示例代码,我得到的印象是,当在Interface Builder中读取并配置在xcode中定义的类时,基于该类的对象被有效地创建并存储在xib或nib文件中.因此,在启动相应的应用程序时,可以使用该对象.
或者,对于尚未由Interface Builder处理的类,必须在xcode中显式编写诸如"new"语句之类的代码,以便创建和使用关联的对象.
拥有比我更了解的人来确认或纠正我对Interface Builder的非常天真的理解将是非常好的...
我有一个扩展的自定义类NSString.我正在尝试使用一个序列化它(用于拖放)NSKeyedArchiver.该类重写...Coder方法:
- (id)initWithCoder:(NSCoder *)aDecoder {
if ((self = [super initWithCoder:aDecoder])) {
data = [[aDecoder decodeObjectForKey:@"data"] copy];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder {
[super encodeWithCoder:aCoder];
[aCoder encodeObject:self.data forKey:@"data"];
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试实际执行归档/取消归档时:
MyClass *object = [[MyClass alloc] init];
[pboard setData:[NSKeyedArchiver archivedDataWithRootObject:object] forType:SACP_WRAPPER_DRAG_TYPE];
NSLog(@"Wrote data for class %@", [object class]);
...
id item = [NSKeyedUnarchiver unarchiveObjectWithData:[[info draggingPasteboard] dataForType:SACP_WRAPPER_DRAG_TYPE]];
NSLog(@"Read data for class %@", [item class]);
Run Code Online (Sandbox Code Playgroud)
输出不是我所期望的:
2011-10-15 18:56:22.898 MyApp[7402:707] Wrote data for class ASCIIString
2011-10-15 18:56:23.345 …Run Code Online (Sandbox Code Playgroud) 我有一个包含各种NSString对象和变量的对象,我将这些对象和NSCoding归档到磁盘上的文件中,然后取消归档.到目前为止,一切都运作良好.
今天,我想在对象中添加一个NSMutableArray并尝试使用以下代码进行编码:
[encoder encodeObject:myArray ForKey:@"myArray"];
Run Code Online (Sandbox Code Playgroud)
然后使用以下方法解码它:
[self setMyArray:[decoder decodeObjectForKey:@"myArray"]];
Run Code Online (Sandbox Code Playgroud)
它似乎没有工作,虽然我没有在编码或解码本身中得到任何错误,但如果我尝试在从文件解码后修改数组的值,我会收到错误.
我确定我在这里做了一些完全错误的事情,但并不完全确定是什么.我想也许它可能与它没有在unarchive期间正确分配有关.
什么看起来明显是问题的根源?
我有一个带有String属性和NSImage属性的'Thing'对象; Thing类有encodeWithCoder:和decodeWithCoder:方法,我可以使用NSKeyedArchiver/Unarchiver归档和解压缩[Thing]数组.
到现在为止还挺好.现在我想通过一系列方向扩展我的Thing类,其中'Direction'是以下枚举:
enum Direction{
case North(direction:String)
case East(direction:String)
case South(direction:String)
case West(direction:String)
}
Run Code Online (Sandbox Code Playgroud)
换句话说,我希望存储的数据是
thing1.directions: Direction = [.North("thing2"), .South("thing3")]
Run Code Online (Sandbox Code Playgroud)
(在一个更完美的世界中,我将使用对我的东西的直接引用而不仅仅是它们的名称,但我意识到这将很容易创建引用循环 - 在创建Thing之前无法设置对另一个Thing的引用 - 所以我会克制.我正在寻找一种快速而又脏的方法来保存我的应用数据并继续前进.)
由于我将需要其他地方的指示,这是一个单独的实体,而不仅仅是Thing类中的枚举.(不确定这是否有所不同.)
使我的Direction枚举符合NSCoding的最佳方法是什么?我能提出的最好的解决方法是创建一个[String:String]字典,其中"North"和"South"作为键,"thing2"和"thing3"作为值,并从中重构我的enum属性,但是有一个更好的方法?就此而言,是否有一种方法可以使元组符合NSCoding,因为现在(String,String)让我"不兼容协议"AnyObject"'错误.
非常感谢.
我正在尝试在一个ViewController中保存用户的坐标,以便它可以用于创建可以在另一个ViewController中显示的Annotation.
在视图控制器中,我使用代码存储坐标
NSUserDefaults.standardUserDefaults().setObject( Location, forKey: "Location")
Run Code Online (Sandbox Code Playgroud)
在地图视图控制器中显示我正在尝试使用代码获取坐标的注释
let Location = NSUserDefaults.standardUserDefaults().stringForKey("Location")
var Annotation = MKPointAnnotation()
Annotation.coordinate = Location
Run Code Online (Sandbox Code Playgroud)
它告诉我type的值为type String?的值CLLocationCoordinate2D.
那么如何将CLLocationCoordinate2D坐标转换为类型的值String?
我已将类别方法添加到NSUserDefaults中以存储和检索编码的对象(在本例中为NSArray)。我在检索编码数据时遇到问题。这是我的代码:
- (void)encodeObject:(id<NSCoding>)object forKey:(NSString *)key {
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:object requiringSecureCoding:NO error:nil];
[self setObject:data forKey:key];
[self synchronize];
}
- (id)decodeObjectForKey:(NSString *)key class:(Class)aClass {
NSData *data = [self objectForKey:key];
NSError *error = nil;
id object = [NSKeyedUnarchiver unarchivedObjectOfClass:aClass fromData:data error:&error];
NSLog(@"E: %@ %@", error.localizedDescription, object);
return object;
}
Run Code Online (Sandbox Code Playgroud)
调用[[NSUserDefaults standardDefaults] encodeObject:object forKey:key]应对传递的对象进行编码并将其存储为默认值,然后调用[[NSUserDefaults standardDefaults] decodeObjectForKey:key class:aClass应返回编码的对象。
问题是[NSKeyedUnarchiver unarchivedObjectOfClass:fromData:error:]返回nil,错误文本记录为The data couldn’t be read because it isn’t in the correct format.。使用检索的数据[self objectForKey:] …
我想写一个Question对象数组到文件,但不知何故writeToFile没有做任何事情.一个问题有一个所有者和一组Answer对象.答案也有所有者.所有这三个都符合NSCoding协议(据我所知).
从下面的代码中,结果返回NO.不知道我做错了什么,因为我正在为所有事情实施NSCoding,对吧?
Question.h
#import <Foundation/Foundation.h>
#import "Owner.h"
@interface Question : NSObject <NSCoding> {
NSString *questionId;
NSString *questionRevision;
NSString *text;
NSDate *date;
NSMutableArray *answers;
NSString *page;
NSNumber *questionLocation;
Owner *owner;
}
@property (nonatomic, retain) NSString *questionId;
@property (nonatomic, retain) NSString *questionRevision;
@property (nonatomic, retain) NSString *text;
@property (nonatomic, retain) NSDate *date;
@property (nonatomic, retain) NSMutableArray *answers;
@property (nonatomic, retain) NSString *page;
@property (nonatomic, retain) NSNumber *questionLocation;
@property (nonatomic, retain) Owner *owner;
@end
Run Code Online (Sandbox Code Playgroud)
Question.m
#import "Question.h"
#import "Answer.h"
@implementation Question
@synthesize questionId, …Run Code Online (Sandbox Code Playgroud) 我想知道如何NSCoder处理下次解码时由多个对象共享和编码的对象.它会制作对象的两个副本,还是会解码并在解码它的所有其他对象之间共享一个对象?
我提供了一个类似下面这种情况的小例子.
例:
对象A和对象B在步骤6之后是否共享相同的解码对象,或者它们各自都有自己的副本?
我将尝试使用Xcode 7(代码覆盖率)和Swift 2.0中的新测试功能.
使用代码覆盖,我发现我没有测试我的NSCoding方法.
有关保存一些细节的简单示例,例如
required init(coder aDecoder: NSCoder) {
name = aDecoder.decodeObjectForKey("name") as! String
time = aDecoder.decodeIntegerForKey("time")
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeInteger(time, forKey: "time")
aCoder.encodeObject(name, forKey: "name")
}
Run Code Online (Sandbox Code Playgroud)
我如何在XCTest类中测试这些方法.
nscoding ×10
objective-c ×5
cocoa ×3
swift ×3
ios ×2
cllocation ×1
enums ×1
iphone ×1
location ×1
macos ×1
nib ×1
nscoder ×1
nsstring ×1
unit-testing ×1
xcode ×1