无法识别的选择器发送到实例,performSelector:withObject:afterDelay:和Delegates

时间:2014-07-29 19:09:47

标签: ios objective-c exception unrecognized-selector

将xCode 5与ARC,Objective-C

一起使用

我有简单的程序,在那里我为新的委托添加了附加的协议类(非常简单)。

ArrayGenerator.h

#import <Foundation/Foundation.h>
@protocol ArrayGeneratorDelegate <NSObject>
@required
-(void)StartTask:(NSMutableArray*)array;
@end

@interface ArrayGenerator : NSObject
@property (nonatomic, weak) id <ArrayGeneratorDelegate> delegate;
-(void)ArrayGenerator;
@end

ArrayGenerator.m

#import "ArrayGenerator.h"
@implementation ArrayGenerator

-(void) ArrayGenerator{
//create selector for method in Protocol
SEL mySelector = @selector(StartTask:); 
if (self.delegate && [self.delegate respondsToSelector:@selector(StartTask:) ] ){   
    //call to method    
    [self performSelector:mySelector withObject:array afterDelay:1];
}
@end

ViewController.h 中添加

#import "ArrayGenerator.h"
@interface ViewController : UIViewController <ArrayGeneratorDelegate>
@end

ViewController.m 中添加

 ...
 - (void)viewDidLoad
{
[super viewDidLoad];
ArrayGenerator *ag = [[ArrayGenerator alloc ]init];
ag.delegate = self;
[ag ArrayGenerator];
}
...
-(void)StartTask:(NSMutableArray*)array{
NSLog( @"StartTask" );
}

所以我实现了,在Log中运行应用程序1秒后我可以看到&#34; StartTask&#34;,但是我只是得到了像

这样的异常

DelegatesWithDelay[2240:90b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ArrayGenerator StartTask:]: unrecognized selector sent to instance 0x8b55200'

enter image description here

花了很多时间找到与所描述的解决方案类似的问题(这里和其他网站,但没有任何帮助&#39; s)。

还可以找到替代解决方案: 而不是[self performSelector:mySelector withObject:array afterDelay:1];我打电话给[NSTimer scheduledTimerWithTimeInterval:3.0 target:self.delegate selector:mySelector userInfo:nil repeats:NO]; - 并且它的工作正常,但我想知道为什么performSelector:withObject:afterDelay:的第一个变种无效? (的问题

enter image description here

也尝试:

  • 重新创建项目 - 几乎不同 - 没有帮助 - 同样的问题 这种方法,但与NSTimer - al的作品;
  • @property attributs从(非原子,弱)更改为 (非原子的,释放的)(在某些解决方案中推荐给类似物 问题 - 没有帮助
  • 尝试to use another variants performSelector方法 - 不是 帮助
  • 尝试change mySelector@selector(StartTask:) - 不是 帮助

依旧......没什么帮助,也许我想念一些东西?

2 个答案:

答案 0 :(得分:4)

应该是这样的:

if (self.delegate && [self.delegate respondsToSelector:@selector(StartTask:) ] ){     
     NSInteger delay = 1;
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
          [self.delegate performSelector:mySelector withObject:array];
     });
}

您的自我(ArrayGenerator)没有选择器StartTask,但是您的代表确实如此。

答案 1 :(得分:0)

最后,我找到了这个例外的真正原因(有问题的描述)。

方法performSelector:withObject:afterDelay:在NSObject上定义 - 但id不仅适用于NSObject(因此我必须更具体而不仅仅是&#39; id&#39;)。

需要改变什么 -

@interface ArrayGenerator : NSObject
@property (nonatomic, weak) id <ArrayGeneratorDelegate> delegate;
-(void)ArrayGenerator;
@end

@interface ArrayGenerator : NSObject
@property (nonatomic, weak) NSObject <ArrayGeneratorDelegate> delegate;
-(void)ArrayGenerator;
@end

实际上回答here