在我的OS X应用中,我试图保存和检索单选按钮的标签。该错误发生在setPreferenceRotor中标记为“
// PreferenceController.h
extern NSString * const myCellKey;
extern NSString * const myMatrixChangedNotification;
@interface PreferenceController:NSWindowController
{
IBOutlet NSMatrix *matrixRotor;
}
- (IBAction)setRotorTag:(id)sender;
+ (NSInteger)preferenceRotorTag;
+ (void)setPreferenceRotor:(NSInteger)matrixTag;
@end
// PreferenceController.m
NSString * const myMatrixChangedNotification = @"myRotorChanged";
@implementation PreferenceController
- (void)windowDidLoad
{
[super windowDidLoad];
[matrixRotor selectCellWithTag:[PreferenceController preferenceRotorTag]];
}
+ (NSInteger)preferenceRotorTag
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *tagAsData = [defaults objectForKey:myCellKey];
return [NSKeyedUnarchiver unarchiveObjectWithData:tagAsData];
}
+ (void)setPreferenceRotor:(NSInteger)matrixTag
{
//NSInteger mt = matrixTag;
NSData *tagAsData = [NSKeyedArchiver archivedDataWithRootObject:matrixTag]; **//<-HERE**
[[NSUserDefaults standardUserDefaults]setObject:tagAsData forKey:myCellKey];
}
最佳答案
您正在将类型为NSInteger
的原始(非对象)值从变量matrixTag
传递给方法archivedDataWithRootObject:
,该方法需要对象引用值。该方法愉快地尝试使用值(可能是整数16,0x10
)作为对象引用,并使用kaboom ...
您的想法看起来是正确的,您知道您不能在用户默认值中存储非对象值,因此必须首先将它们包装为对象。这只是您的做法,这是错误的。您需要的是从整数创建NSNumber
的实例。您可以这样写:
NSNumber *tagAsNumber = [NSNumber numberWithInteger:matrixTag];
[[NSUserDefaults standardUserDefaults] setObject:tagAsNumber forKey:myCellKey];
但是,此模式很常见,可以提供快捷方式:
[[NSUserDefaults standardUserDefaults] setInteger:matrixTag forKey:myCellKey];
这将为您创建
NSNumber
对象。还有一个相应的integerForKey:
方法,将在读取时为您解包整数。关于cocoa - EXC_BAD_ACCESS(代码= 1,地址= 0x10),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14993169/