标签: nscoder

encodeWithCoder什么时候被调用?

这将保存一个数组(我认为).

- (void)encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeObject:myArray forKey:@"myArray"];
}
Run Code Online (Sandbox Code Playgroud)

我想在保存数组时是否必须直接调用此方法,还是必须执行其他操作?

xcode cocoa-touch objective-c nscoder

5
推荐指数
1
解决办法
2847
查看次数

我可以使用NSCoder :: encodeInteger:forKey:和decodeIntegerForKey:参数类型为NSUInteger的方法吗?

我需要进行编码和解码类型的财产NSUIntegerNSCoder.

使用方法NSCoder::encodeInteger:forKey:NSCoder::decodeIntegerForKey:方法是否安全?

我想到的另一种方法是将无符号整数包装到NSNumber第一位.但这意味着更多的代码,我不喜欢它.

objective-c primitive-types nsinteger nsuinteger nscoder

5
推荐指数
1
解决办法
656
查看次数

使用NSCoder保存自己的类

我正在尝试将一些自定义类/数据存储到我的iPhone/iPad应用程序中的文件中.

我有一个类RSHighscoreList

@interface RSHighscoreList : NSObject {
    NSMutableArray *list;
}
Run Code Online (Sandbox Code Playgroud)

其中包含列表中RSHighscore的对象

@interface RSHighscore : NSObject {
    NSString *playerName;
    NSInteger points;
}
Run Code Online (Sandbox Code Playgroud)

当我尝试将所有文​​件存储到文件中时

- (void)writeDataStore {
    RSDataStore *tmpStore = [[RSDataStore alloc] init];
    _tmpStore.highscorelist = self.highscorelist.list;
    NSMutableData *data = [[NSMutableData alloc] init];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

    [archiver encodeObject:tmpStore forKey:kDataKey];
    [archiver finishEncoding];
    [data writeToFile:[self dataFilePath] atomically:YES];

    [archiver release];
    [data release];
}

@interface RSDataStore : NSObject <NSCoding, NSCopying> {
    NSMutableArray *highscorelist; 
}

- (void)encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeObject:highscorelist forKey:@"Highscorelist"];
}
Run Code Online (Sandbox Code Playgroud)

该应用程序将崩溃并显示错误消息

-[RSHighscore …

iphone objective-c save nscoder

4
推荐指数
1
解决办法
1万
查看次数

有没有办法对闭包进行编码和解码?

出于某种原因,我需要序列化一个包含多个闭包字段的类对象。

像这样:

import Foundation

class Foo: NSObject, NSCoding {

    var bar: (() -> Void)

    override init() {
        bar = {}
    }

    required init(coder aDecoder: NSCoder) {
        bar = aDecoder.decodeObject(forKey: "bar") as! (() -> Void)
    }

    func encode(with aCoder: NSCoder) {
        aCoder.encode(bar, forKey: "bar")
    }

}

let foo = Foo()
foo.bar = {
    print("Help!")
}

let data = NSKeyedArchiver.archivedData(withRootObject: foo)
let object = NSKeyedUnarchiver.unarchiveObject(with: data) as! Foo
Run Code Online (Sandbox Code Playgroud)

有什么办法可以得到我想要的吗?

serialization encode decode nscoder swift

4
推荐指数
1
解决办法
594
查看次数

如何将NSMutableArray(包含其他数组)保存到文件中

之前已经提出过,人们已经就如何做到这一点给出了非常好的指示,例如这里.

但是,如果我只想将一个NSMutableArray(包含另一个NSMutableArray的各种实例)保存到文件中,我想知道我是否真的需要使用NSCoder?我试过这个,但只收到一条错误信息:

    -(void)saveLibraryDat {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents directory
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"myLibrary.dat"];
    NSError *error;

    [myLibrary writeToFile:filePath atomically:YES];

    if (error) {
        NSLog(@"There was an error saving myLibrary.dat: %@", error);
    }

}
Run Code Online (Sandbox Code Playgroud)

我的错误信息:

2011-05-13 22:00:47.840 MoleNotes[15437:207] There was an error saving myLibrary.dat: (
    1,
    2
)
Run Code Online (Sandbox Code Playgroud)

所以我想我必须和NSCoder合作,对吧?如果是这样,我想知道如何解决这个问题.人们已经解释了如何使用类来完成此操作,但在我的情况下,我有一个NSMutableArray(myLibrary),其中包含类的各种实例.我是否必须在此类和NSMutableArray中实现NSCoder?

我像这样分配我的库:

    myLibrary = [[NSMutableArray alloc] init];
Run Code Online (Sandbox Code Playgroud)

然后添加一个名为NoteBook.m的类的实例,如下所示:

    NoteBook *newNoteBook = [[NoteBook alloc] init];
       newNoteBook.titleName = @"Notes"; // etc.

[myLibrary addObject:newNoteBook];
Run Code Online (Sandbox Code Playgroud)

那么我在哪里放置NSCoder命令呢?只进入我的NoteBook.m类?这会自动照顾myLibrary吗? …

iphone cocoa-touch objective-c nscoder

3
推荐指数
1
解决办法
2942
查看次数

NSCoder和/或NSKeyedUnarchiver如何处理同一对象的多个解码?

我想知道如何NSCoder处理下次解码时由多个对象共享和编码的对象.它会制作对象的两个副本,还是会解码并在解码它的所有其他对象之间共享一个对象?

我提供了一个类似下面这种情况的小例子.

例:

  1. 应用程序启动
  2. 对象A和对象B将对象C设置为其委托
  3. 应用程序收到终止通知
  4. 对象A和对象B 编码自身及其所有对象(包括其委托)
  5. 应用程序关闭并重新启动
  6. 对象A和对象B 解码自身及其所有对象(包括其委托)

对象A和对象B在步骤6之后是否共享相同的解码对象,或者它们各自都有自己的副本?

macos objective-c nscoding cocoa-design-patterns nscoder

3
推荐指数
2
解决办法
1026
查看次数

应该对NSCoder二进制文件格式应用什么文件扩展名?

当使用NSCoderNSKeyedArchiver,据我所知,数据存储在二进制格式.因此,什么是最适合存储文件的文件扩展名?许多教程使用.plist,但我相信这应该是文本属性列表〜键/值对.

cocoa filenames file-extension objective-c nscoder

3
推荐指数
1
解决办法
296
查看次数

如何调用encodeWithCoder

可能是一个愚蠢的问题 - 怎么encodeWithCoder称呼?我需要用它来保存iphone文件中的对象,我只是不确定它是如何被实际调用的.我必须手动拨打电话吗?如果是这样,我将使用什么作为NScoder参数的输入?

serialization objective-c nscoder ios

3
推荐指数
1
解决办法
1681
查看次数

在Swift 1.2中编码和解码枚举

enum在我的Swift类中声明了一个变量.我需要使用编码和解码它NSCoder.对于我应该使用的这个说法有很多问题rawValue.Enum声明如下:

enum ConnectionType {
    case Digital, PWM
}
Run Code Online (Sandbox Code Playgroud)

但是在Swift 1.2中没有这样的初始化器.在Swift 1.2和Xcode 6.3中如何做到这一点?

nscoder ios swift

3
推荐指数
1
解决办法
885
查看次数

UITableViewCell作为来自XIB的UIView

CustomTableViewClass在厦门国际银行,将它添加到UITableView喜欢

class RestaurantsTableView: UITableView {
    override func awakeFromNib() {
        self.register(UINib(nibName: "RestaurantTableViewCell", bundle: nil), forCellReuseIdentifier: "restaurantCell")
    }
}
Run Code Online (Sandbox Code Playgroud)

和一切工作正常,现在我想用这个CustomTableViewClass作为UIView在其他一些UIViewController,但我不明白如何正确地重写它的init(coder aCoder: NSCoder)功能,因为我并不需要一个UITableView情况下,当我实现它就像我的其他自定义XIB意见做它崩溃了nil

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    let _ = Bundle.main.loadNibNamed("RestaurantTableViewCell", owner: self, options: nil)?[0] as! UIView
}
Run Code Online (Sandbox Code Playgroud)

uitableview xib uiview nscoder ios

3
推荐指数
1
解决办法
2527
查看次数