65571
お世話になります。初めて投稿します。  
よろしくお願いいたします。

Objective-Cで、以下のメソッドが廃止されたので、

```

    [NSKeyedUnarchiver unarchiveObjectWithFile:(NSString *)path];
    
```

書き換えをしました。

```

    NSError *error = nil;
    NSData *data = [NSData dataWithContentsOfFile:filePath];
    array = (NSArray*)[NSKeyedUnarchiver unarchivedObjectOfClass:[NSArray class] fromData:data error:&error];
    
```

dataには、NSDataのデータが入っていますが、NSArrayのarrayはnilになります。  
何か書き方が悪いのでしょうか？

もしご存知の方がいれば、ご教授ください。

ご教授ありがとうございます。投稿していただいたコードで修正したところ、こちらもご指摘通りNSSecureCodingに適合していないというエラーが出ました。

```

    "This decoder will only decode classes that adopt NSSecureCoding. Class 'FileItem' does not adopt it."
    
```

```

    @interface FileItem : NSObject <NSCoding>
    
```

を、

```

    @interface FileItem : NSObject <NSSecureCoding>
    
```

に書き換えて、

```

    + (BOOL)supportsSecureCoding
    {
        return YES;
    }
    
```

も追加してみましたが、以下のエラーが出ます

```

    2020-04-13 23:46:36.348044+0900 MosaicMaker[21527:3134349] Error Error Domain=NSCocoaErrorDomain Code=4864 "value for key 'identifier' was of unexpected class 'NSMutableString'. Allowed classes are '{(
        NSArray,
        FileItem
    )}'." UserInfo={NSDebugDescription=value for key 'identifier' was of unexpected class 'NSMutableString'. Allowed classes are '{(
        NSArray,
        FileItem
    )}'.}
    
```

どう修正すればいいのか、簡単にお分かりのようでしたら教えていただくことは  
できますでしょうか？厚かましいお願いで申し訳ありませんが、よろしくお願いいたします。

FileItemの全体は、以下になります。

```

    @interface FileItem : NSObject <NSSecureCoding /*NSCoding*/>
    {
        NSString*   _identifier;        // 識別子
        BOOL        _selected;          // 選択フラグ
        NSString*   _title;             // タイトル
        NSString*   _makeDate;          // 作成された日付
        NSString*   _size;              // ファイルサイズ(mm x mm)
    }
    
```

よろしくお願いいたします。

解決できました。  
ご教授いただいたように、/ _..._ /にアーカイブするクラスを書いたところ、問題なく解凍できました。ありがとうございました。
CC BY-SA 4.0
2020-04-12T14:06:24.603
65566
2020-04-13T23:32:10.303
2020-04-13T23:32:10.303
39603
39603
question
objective-c
Objective-Cの、unarchivedObjectOfClassがnilを返す
`unarchivedObjectOfClass:fromData:error:`や`unarchivedObjectOfClasses:fromData:error:`は、本来は`NSSecureCoding`をサポートするためのメソッドで、アーカイブの中に含まれる全てのクラスを`unarchivedObjectOfClass:`または`unarchivedObjectOfClasses:`に渡してやらないといけません。

あなたは、`NSArray`だけを渡していますが、アーカイブの中に`FileItem`と言う名前のクラスが含まれているのに、それが示されていないので実行時エラーになります。両方のクラスを渡してやらないといけません。

```

            NSArray *array = (NSArray *)[NSKeyedUnarchiver
                                         unarchivedObjectOfClasses:[NSSet setWithObjects:
                                            [NSArray class], [FileItem class], /*...,*/
                                          nil]
                                         fromData:data error:&error];
    
```

  * 他のクラスでアーカイブの中に含まれているものがあれば...のところに指定してください。
  * `FileItem`が`NSSecureCoding`(ただの`NSCoding`ではなく)に適合していないと、別のエラーになるかもしれません。その場合には、`FileItem`が`NSSecureCoding`に適合するように修正してください。
CC BY-SA 4.0
2020-04-12T17:00:27.877
65571
2020-04-12T17:00:27.877
13972
65566
answer