无法识别的选择器发送到 NSTimer scheduleTimerWithTimeInterval 中的实例

Posted

技术标签:

【中文标题】无法识别的选择器发送到 NSTimer scheduleTimerWithTimeInterval 中的实例【英文标题】:unrecognized selector sent to instance in NSTimer scheduledTimerWithTimeInterval 【发布时间】:2013-07-24 19:24:39 【问题描述】:

在发布之前我进行了很多搜索并尝试了很多解决方案,但都没有奏效,也许我的代码有问题。它基本上是一个骰子应用程序,当我按下滚动按钮时,它应该为视图中的图像设置动画,但问题出在 NSTimer 中,它应该使用 NSNumber 参数调用 next 方法,这是 arc4random() 的结果它显示了所选骰子的真实图像

 `
ViewController.m

#import "ViewController.h"


@interface ViewController ()

@end 

@implementation ViewController
@synthesize firstDie;
@synthesize secondDie;
@synthesize animation;
- (IBAction)rollButtonClick:(id)sender 
NSNumber* roll1 =[[NSNumber alloc] initWithInt:[self.model getDiceRoll]];
NSNumber* roll2 =[[NSNumber alloc] initWithInt:[self.model getDiceRoll]];
[self.firstDie randDie];
NSDictionary *info = [NSDictionary dictionaryWithObjectsAndKeys:roll1,@"Roll1Key",nil];
NSArray *info = [[NSArray alloc] initWithObjects:roll1, nil];
[NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(showDie:)   userInfo:info  repeats:NO];
NSString *sum = [[NSString alloc] initWithFormat: @"Sum = %d",[roll1 intValue]+[roll2   intValue]];
self.sumLabel.text = sum;



- (void)viewDidLoad

[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

self.model = [[Model alloc]init];



- (void)didReceiveMemoryWarning

[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.


@end`

showDie

-(void) showDie:(NSTimer*)num

if (self.dieImage == nil)

    self.dieImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 90, 90)];
    [self addSubview:self.dieImage];

NSNumber *userInfo = num.userInfo;
NSString *filename = [[NSString alloc] initWithFormat:@"dice%d.png", [userInfo intValue]];
self.dieImage.image = [UIImage imageNamed:filename];

死神

 -(void) randDie

if (self.dieImage == nil)

    self.dieImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 90, 90)];
    [self addSubview:self.dieImage];

UIImage *dieOne = [UIImage imageNamed:@"dice1.png"];
UIImage *dieTwo = [UIImage imageNamed:@"dice2.png"];
UIImage *dieThree = [UIImage imageNamed:@"dice3.png"];
UIImage *dieFour = [UIImage imageNamed:@"dice4.png"];
UIImage *dieFive = [UIImage imageNamed:@"dice5.png"];
UIImage *dieSix = [UIImage imageNamed:@"dice6.png"];
NSArray *animate = [NSArray arrayWithObjects:     dieFive,dieThree,dieOne,dieFour,dieSix,dieTwo, nil];
self.dieImage.image = [UIImage animatedImageWithImages:animate duration:0.8];

应用程序正常工作并且 firstDie 中的图像不断变化(我想是 2 秒)然后应用程序停止并且当 -i think- 将参数传递给 showDie 时出现“无法识别的选择器发送到实例”问题。也许我不明白如何解决它(我是 Mac 世界和 Objective-C 的新手)。请帮助。

错误信息:

2013-07-25 02:13:40.550 test[3166:c07] -[ViewController showDie:]:无法识别的选择器发送到实例 0x8827830

2013-07-25 02:13:40.551 test[3166:c07] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[ViewController showDie:]:发送了无法识别的选择器到实例 0x8827830'

* 首先抛出调用栈: (0x1c93012 0x10d0e7e 0x1d1e4bd 0x1c82bbc 0x1c8294e 0xb192c0 0x1c52376 0x1c382906 0x1c39a82 0x1c38012 0x1c38012 0x1c3801b 0x1c38e1b 0x1b03 0x1bed668 0x14ffc 0x252d 0x2455 0x1) libc++abi.dylib:终止调用抛出异常

【问题讨论】:

发布实际的、完整的错误信息。 @rdelmar 我刚刚发布了 嗯......这很奇怪,看起来你肯定有一个 showDie: 方法。是您在 ViewController.m 中发布的所有代码吗? ViewController 没有实现 showDie:我知道你认为它有,但你在某处搞砸了。 我会发布整个 .m 文件 【参考方案1】:

NSTimer 的 userInfo: 参数是为你提供一个字典对象。您的线路:

NSNumber *userInfo = num.userInfo;

这会失败,因为对象num 是一个计时器,而userInfo 对象实际上是一个NSDictionary。您遇到的选择器错误可能是您在此对象上调用 intValue 时发生的。

正确的做法是先将你的 NSNumber 折叠成一个 NSDictionary 对象:

NSDictionary *info = [NSDictionary dictionaryWithObjectsAndKeys:roll1,@"Roll1Key",nil];
[NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(showDie:)    userInfo:info repeats:NO];

//in showDie
NSDictionary *info = num.userInfo;
NSNumber *roll1 = [info objectForKey:@"Roll1Key"];
NSInteger rollInteger = [roll1 intValue];
//continue...

【讨论】:

"NSTimer 的 userInfo: 参数是为你提供一个字典对象" -- 不正确,它的类型是 id,所以你可以传递任何对象。 我的错误。我想我应该让他发布实际的异常消息

以上是关于无法识别的选择器发送到 NSTimer scheduleTimerWithTimeInterval 中的实例的主要内容,如果未能解决你的问题,请参考以下文章

无法识别的选择器发送到 NSTimer scheduleTimerWithTimeInterval 中的实例

[__NSCFTimer copyWithZone:]:无法识别的选择器发送到实例

UITableViewController 无法识别的选择器发送到实例

无法识别的选择器发送到实例

[UICollectionViewCell imageView]:无法识别的选择器发送到实例

UISwipeGesture '发送到实例的无法识别的选择器'