0

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

1 に答える 1

1

NSInteger変数からの型のプリミティブ(非オブジェクト)値を、オブジェクト参照値を期待するmatrixTagメソッドに渡します。archivedDataWithRootObject:そのメソッドは、値(おそらく整数16 0x10)をオブジェクト参照として使用しようとします。

あなたの考えは正しいように見えます。ユーザーのデフォルトに非オブジェクト値を格納できないことを知っているので、最初にそれらをオブジェクトとしてラップする必要があります。それはあなたのやり方であり、それは間違っています。ここで必要なのはNSNumber、整数からのインスタンスを作成することです。あなたは書くことができます:

NSNumber *tagAsNumber = [NSNumber numberWithInteger:matrixTag];
[[NSUserDefaults standardUserDefaults] setObject:tagAsNumber forKey:myCellKey];

ただし、このパターンは十分に一般的であるため、ショートカットが提供されます。

[[NSUserDefaults standardUserDefaults] setInteger:matrixTag forKey:myCellKey];

NSNumberこれにより、オブジェクトが作成されます。integerForKey:読み取るときに整数をアンラップする対応するメソッドもあります。

于 2013-02-21T02:11:40.577 に答える