iPhone 核心数据 - NSNumber 和 obj_exception_throw 的问题

Posted

技术标签:

【中文标题】iPhone 核心数据 - NSNumber 和 obj_exception_throw 的问题【英文标题】:iPhone Core Data - Issues with NSNumber and obj_exception_throw 【发布时间】:2011-01-29 15:11:52 【问题描述】:

哦,我真的很喜欢这个。也许你新鲜的眼睛可以施展魔法……

当我的应用程序到达 viewDidLoad 中的这一行时,它崩溃了。

NSString *fieldName = [NSString stringWithFormat:@"position%d", [objectPosition intValue]];

我认为这可能是由于它上面的这条线:

    NSNumber *objectPosition  = [[object position] integerValue];

fieldName 行没有明确的错误。

一般警告包括:

初始化使指针从整数变为无强制类型转换

“NSManagedObject”可能无法响应“-position”

obj_exception_throw

我检查了类的 [object position],它说它实际上是一个 NSCFNumber。 我对 NSNumber 做错了吗?我哪里错了?

谢谢

进化

这里列出了整个方法,这里也是整个文件的链接https://gist.github.com/801879

- (void)viewDidLoad 
  // Format page
  scrollView.contentSize = CGSizeMake(200, 430);

  // Initialise PositionsView array
  positionViews = [[NSArray alloc] initWithObjects:position1,position2,position3,position4,position5,position6,position7,position8,position9,position10,position11,position12,position13,position14,position15,position16,position17,position18,nil];

  // Load managedObject
  //Fetch All players from PlayerPosition where game matches this game and store in objects
  NSFetchRequest *request = [[NSFetchRequest alloc] init];
  NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"PlayerPosition" inManagedObjectContext:managedObjectContext_];  
  [request setEntity:entityDescription];  
  NSPredicate *pred = [NSPredicate predicateWithFormat:@"(game = %@)", self.game];   //WHERE game = self.game
  [request setPredicate:pred];
  NSError *error;
  objects = [managedObjectContext_ executeFetchRequest:request error:&error]; //execute fetch and store in objects


  NSLog(@">>>>>>>>>>>>>>>>>>>>>>>>>>    Populate View with data from the managedObject..    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");

  for (NSManagedObject *object in objects) 
    //loop through the objects in PlayerPosition for this game and update UI elements.
    Player   *objectPlayer    = [object valueForKey:@"player"];

    NSNumber *objectPosition  = [[object position] integerValue];
    NSLog(@"Object: %@", [object valueForKey:@"position"]);
    NSString *fieldName = [NSString stringWithFormat:@"position%d", [objectPosition intValue]];
    PlayerPositionView *theField = [self valueForKey:fieldName];
    [[theField textLabel] setText:objectPlayer.playerShortName];
    NSLog(@"object Position: %@", [objectPosition description]);

  
  NSLog(@">>>>>>>>>>>>>>>>>>>>>>>>>>    ..view Data Loaded    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");

  [super viewDidLoad];

【问题讨论】:

【参考方案1】:

[[object position] integerValue] 将返回 NSInteger,而不是 NSNumber *。由于返回值不是对象,因此您不能(也不必)向其发送-intValue 消息。只需直接在+stringWithFormat: 中使用NSInteger 值即可。

【讨论】:

我已经改变了。我认为这有点帮助。我现在可以在我的应用程序中访问此页面而不会崩溃,一旦我添加记录并退出并尝试返回,它会抱怨同一行消息“无法访问变量“fieldName”并崩溃”

以上是关于iPhone 核心数据 - NSNumber 和 obj_exception_throw 的问题的主要内容,如果未能解决你的问题,请参考以下文章

将 NSDate 和 NSNumber 和/或保存在相同的核心数据属性中

核心数据问题 - 无法存储 NSNumber

无法将 NSNumber 存储在核心数据中

将核心数据中的 NSNumber 转换为 NSString

核心数据迁移丢失 NSNumber 值

带有 NSNumber 的 NSArray 的 NSPredicate(核心数据)