EXC_BAD_ACCESS(码= 1,地址= 0×10)

时间:2013-02-21 01:36:26

标签: cocoa debugging

在我的OS X应用程序中,我正在尝试保存并检索单选按钮的标记。该错误发生在setPreferenceRotor中标记为“< -HERE”的行上。有一个有效的标签。

//  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];
  }

1 个答案:

答案 0 :(得分:1)

您正在将一个类型为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:方法,它会在阅读时为你打开整数。