将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'
花了很多时间找到与所描述的解决方案类似的问题(这里和其他网站,但没有任何帮助&#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:
的第一个变种无效? (的问题)
也尝试:
mySelector
到@selector(StartTask:)
- 不是
帮助依旧......没什么帮助,也许我想念一些东西?
答案 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