【发布时间】:2014-11-30 10:43:17
【问题描述】:
我有一个用户对象,我需要将其存储在 NSUserDefaults 中并与 iOS 8 扩展应用程序 (Watchkit) 共享。在主容器应用程序中,我可以毫无问题地对对象进行编码和解码。但是,当我尝试在扩展中检索存储的用户对象时,我收到 "'NSInvalidUnarchiveOperationException', reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class" 错误。
据我所知,NSCoding 已在对象中正确实现(并且我能够在“主”应用程序中对对象进行编码和解码)。
“容器”应用程序中用于存储用户对象的代码。
//Store user data in NSUserDefaults
NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.mygroup"];
SFUserAccount *user = [SFUserAccountManager sharedInstance].currentUser;
NSData *userEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:user];
[defaults removeObjectForKey:@"SF User Acct1"]; //remove any old values
[defaults setObject:userEncodedObject forKey:@"SF User Acct1"];
[defaults synchronize];
SFUserAccount *decodedUser = [NSKeyedUnarchiver unarchiveObjectWithData:userEncodedObject];
上面在主应用程序中执行测试解码的最后一行工作正常。
从 NSUserDefaults 检索并在扩展目标中解码的代码如下。
NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.mygroup"];
NSData *archivedUser = [defaults objectForKey:@"SF User Acct1"];
if (archivedUser){
SFUserAccount *user = [NSKeyedUnarchiver unarchiveObjectWithData:archivedUser];
}
在扩展代码中,我得到一个“'NSInvalidUnarchiveOperationException', reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class”
关于我应该从哪里开始寻找任何建议?该应用程序编译良好,这让我相信所需的框架已包含在扩展目标中。
【问题讨论】:
-
扩展的target中是否添加了定义SFUserAccount的实现文件?
-
二进制文件包含在目标中。但是您的问题使我进行了进一步的研究。事实证明,我必须将 Set Other Linker Flags 设置为“-ObjC -all_load”。我不确定它到底是做什么的,但它现在可以工作了!!非常感谢您的帮助。
-
那些链接标志可能有点矫枉过正。检查类文件是否属于两个目标。
-
@YogiBotics 我在使用 NSKeyedUnarchiver 时遇到了同样的问题,但我尝试解码的类确实属于这两个目标,我尝试添加其他链接器标志,但没有运气。有任何想法吗?还是我应该提出一个新问题?
标签: objective-c nsuserdefaults ios8-extension watchkit