【问题标题】:encode NSInteger doesn't work on 64 bit simulators - objective c编码 NSInteger 不适用于 64 位模拟器 - 目标 c
【发布时间】:2014-02-04 10:17:54
【问题描述】:

我对目标 c 很陌生。在我的应用程序中,我想将一个由 NSString 和来自三个分段控件的三个 NSInteger 令牌组成的对象保存在 .plist 文件中。它在 32 位模拟器和设备上运行良好,但在 64 位中传递了一个空对象,因为我猜是 NSCoder。 在我的对象类中,我实现了这两种方法:

- (void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeObject: self.cardPath forKey:@"cardPath"];
    [coder encodeInteger: (NSInteger) self.cardSign forKey:@"cardSign"];
    [coder encodeInteger: (NSInteger) self.cardNumber forKey:@"cardNumber"];
    [coder encodeInteger: (NSInteger) self.cardColor forKey:@"cardColor"];
} 

- (id)initWithCoder:(NSCoder *)coder {
    self.cardPath = [coder decodeObjectForKey:@"cardPath"];
    self.cardSign = (NSInteger*) [coder decodeIntegerForKey: @"cardSign"];
    self.cardNumber = (NSInteger*) [coder decodeIntegerForKey:@"cardNumber"];
    self.cardColor = (NSInteger*) [coder decodeIntegerForKey:@"cardColor"];
    return self;
}

我从分段控件中获取值:

cardSelected.cardSign = [NSNumber numberWithInteger:[sender selectedSegmentIndex]];

cardSelected.cardNumber = [NSNumber numberWithInt:[sender selectedSegmentIndex]];

我比较喜欢:

cardSelected.cardColor = [NSNumber numberWithInt:[sender selectedSegmentIndex]];
if ([cardSelected.cardColor intValue] ==  0)
{
    [iBack setImage: [UIImage imageNamed: @"5_0.png"]];
    NSLog(@"red");
}

然后我保存对象:

'-(IBAction)game:(id)sender
{
      NSMutableArray *cards = [[NSMutableArray alloc] initWithObjects: cardSelected, nil];
      NSData *data = [NSKeyedArchiver archivedDataWithRootObject:cards];
      [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"cards"];
      [data writeToFile:path atomically:YES];}'

我尝试以这种方式在 viewDidLoad 方法中检索保存的对象

- (void)viewDidLoad

{

[super viewDidLoad];

// testing for 64bit at runtime

if (sizeof(void*) == 4) {
    NSLog(@"You're running in 32 bit");

} else if (sizeof(void*) == 8) {
    NSLog(@"You're running in 64 bit");
}

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
path = [[NSString alloc]initWithString:[paths[0]stringByAppendingPathComponent:@"selectedCard.plist"]];

if([[NSFileManager defaultManager]fileExistsAtPath:path])
{
    segSign.momentary = NO;
    segNumber.momentary = NO;
    segColor.momentary = NO;

    [segSign addTarget:self action:@selector(segmentedSign:) forControlEvents: UIControlEventValueChanged];
    [segNumber addTarget:self action:@selector(segmentedNumber:) forControlEvents: UIControlEventValueChanged];
    [segColor addTarget:self action:@selector(segmentedColor:) forControlEvents: UIControlEventValueChanged];

    NSData *cardsData = [[NSUserDefaults standardUserDefaults] objectForKey:@"cards"];
    NSMutableArray *cards = [NSKeyedUnarchiver unarchiveObjectWithData:cardsData];
    cardSelected = [cards objectAtIndex:0];


    //NSLog(@"%li",cardSelected.cardNumber);

    if ([cardSelected.cardColor intValue] ==  0)
    {
        [iBack setImage: [UIImage imageNamed: @"5_0.png"]];
        NSLog(@"red");
    }

    if ([cardSelected.cardColor intValue] ==  1)
    {
        [iBack setImage: [UIImage imageNamed: @"5_1.png"]];
        NSLog(@"blue");
    }

    [segSign setSelectedSegmentIndex: [cardSelected.cardSign intValue]];
    NSLog(@"check sign...%i", [cardSelected.cardSign intValue]); //always display 1
    NSLog(@"double-check...%@", cardSelected.cardSign); //always display 1
    [segNumber setSelectedSegmentIndex: [cardSelected.cardNumber intValue]];
    [segColor setSelectedSegmentIndex: [cardSelected.cardColor intValue]];

} else
{
    NSLog(@"else");
    Card *i = [[Card alloc]init];
    i.cardSign = 0;
    i.cardNumber = 0;
    i.cardPath = @"0_0.png";
    [iBack setImage: [UIImage imageNamed: @"5_0.png"]];
    cardSelected = i;
}




[iImage setImage: [UIImage imageNamed : cardSelected.cardPath]];



// Do any additional setup after loading the view, typically from a nib.

}

cardSelected 是一个带有 .h 文件的对象 Card:

@interface Card : NSObject <NSCoding>
{
NSNumber *cardSign, *cardNumber, *cardColor;
NSString *cardPath;

}

@property (nonatomic) NSNumber *cardSign, *cardNumber, *cardColor;
@property (nonatomic, strong) NSString *cardPath;
@property (nonatomic, strong) NSCoder *coder, *encoder;

@end

和实现.m文件为

'
   @interface Card : NSObject { NSNumber *cardSign, *cardNumber, *cardColor; NSString *cardPath;

   }

   @property (nonatomic) NSNumber *cardSign, *cardNumber, *cardColor;
   @property (nonatomic, strong) NSString *cardPath;
   @property (nonatomic, strong) NSCoder *coder, *encoder;

   @end

' 使用对象 (Card) *cardSelected 时,它没有预期值。 我做错了什么?

【问题讨论】:

  • 只是一个简短的评论:你确定你从上面的代码中没有收到任何警告吗?无论是 32 位还是 64 位平台。
  • 究竟是什么不工作???
  • 当然没有警告。

标签: ios objective-c nsinteger nscoder


【解决方案1】:

你使用 NSInteger 的方式很糟糕。

NSInteger 是标量值(取决于平台,它可以是 int 或 long)。

所以当你这样做时

cardSelected.cardSign = (NSInteger*) [sender selectedSegmentIndex];

错了。

您应该设置不带 * 的 NSInteger ivar。

简短的回答:删除 NSInteger 之后的所有星星,它会起作用。

【讨论】:

    【解决方案2】:

    解决了!我试图使用 NSCoder 存储由三个 NSNumber 组成的对象“卡”。现在我将三个 NSNumber 存储在一个 NSMutableArray 中,我将它写入一个 plist 文件并且没有“Card”类它可以工作,在 32 位和 64 位中也是如此。感谢您的帮助,对于一个傻瓜来说,最好简化代码;)

    【讨论】:

      猜你喜欢
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多