首页 > 解决方案 > 不推荐使用 unarchiveobjectwithdata

问题描述

我现在尝试更新我的应用程序。并看到 unarchiveobjectwithdata:' 已弃用。我该如何解决?

我有课

@interface Favorite : NSObject <NSSecureCoding> //NSCoding NSSecureCoding

@property (nonatomic) NSDate *wikiDate;

@property (nonatomic) FavoriteType type;

- (id) initWithDate:(NSDate *) date type:(FavoriteType) type;

- (id) initNilFavorite;

- (BOOL) isNilFavorite;
- (id) initWithCoder:(NSCoder *)aDecoder;
- (void) encodeWithCoder:(NSCoder *)aCoder;
@end

我有二等舱

@interface Settings : NSObject 

+ (Settings *) sharedInstance;
        
@property (nonatomic) NSMutableArray *favorites;

// favorites part

- (BOOL) isFavorite:(NSDate *) date type:(FavoriteType) type;
- (void) addToFavorites:(NSDate *) date type:(FavoriteType) type;
- (void) removeFromFavorites:(NSDate *) date type:(FavoriteType) type;

- (void) groupFavorites;   
- (void) saveSettings;

@end

当我将最爱保存在 settigns 中时

- (void) saveFavorites{
    NSString* filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"favorites"];
    NSError* error;
    NSData* codedData = [NSKeyedArchiver archivedDataWithRootObject:self.favorites requiringSecureCoding:NO error:&error];
    if(error!=nil) {
        NSLog(@"Eror when try to archive favorites!!!!");
    }
    else {
        [codedData writeToFile:filePath atomically:YES];
    }
}

我尝试加载

- (void) loadFavorites{
    NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"favorites"];
    NSData *data = [NSData dataWithContentsOfFile:filePath];
    if (data) {
       self.favorites = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    }   
}

一切正常,但现在我必须将unarchiveObjectWithData替换为unarchivedArrayOfObjectsOfClass

self.favorites 是最喜欢的类的 MuttableArray!

我试过veriants:

NSSet *allowedClasses = [NSSet setWithObjects:[NSMutableArray  class],[Favorite class], nil];
NSMutableArray *encodedData = [NSKeyedUnarchiver unarchivedObjectOfClasses:allowedClasses fromData:data error:&error];

NSData *encodedData = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSArray class]  fromData:data error:&error];

NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:data error:&error];
[unarchiver setRequiresSecureCoding:NO];
[unarchiver decodeObjectOfClass:[Favorite class] forKey:@""];
[unarchiver finishDecoding];

注意工作:(

请帮我

标签: iosobjective-cdeprecated

解决方案


您可以使用

[ NSKeyedUnarchiver unarchivedObjectOfClass:[ NSObject class ] fromData:data error:&error ];

它适用于日志中的警告

[基础] *** -[NSKeyedUnarchiver validateAllowedClass:forKey:]:NSSecureCoding 允许的类列表包含 [NSObject 类],它通过允许隐式解码任何 Objective-C 类来绕过安全性。考虑通过仅列出您希望解码的类或比 NSObject 更具体的基类来减少解码期间允许的类的范围。这将成为未来的错误。允许的类列表:{("'NSObject' (0x1d9e91e08) [/usr/lib]" )}

更好的是使用

[ NSKeyedUnarchiver unarchivedObjectOfClasses:[ NSSet setWithObjects:[ NSArray class ], [ Favorite class ], nil ] fromData:data error:&error ];

您可能需要 [ NSDate class ] 或其他包含在您的“Favorite”类中的东西


推荐阅读