использование 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" );
}
Итак, я добиваюсь, чтобы после запуска приложения за 1 секунду в журнале я мог видеть «StartTask», но вместо этого я просто получил исключение, например
DelegatesWithDelay[2240:90b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ArrayGenerator StartTask:]: unrecognized selector sent to instance 0x8b55200'
Потратить уйму времени на поиск похожей проблемы с описанным решением (здесь и на других сайтах, но ничего из этого не помогает).
Так же нашел альтернативное решение: вместо [self performSelector:mySelector withObject:array afterDelay:1];
звоню на [NSTimer scheduledTimerWithTimeInterval:3.0 target:self.delegate selector:mySelector userInfo:nil repeats:NO];
- и все нормально работает, но я хочу знать, почему первый вариант с performSelector:withObject:afterDelay:
не работает??? (Вопрос)
Также попробуйте:
- пересоздать проект - почти другой - не помогает - та же проблема с этим методом, но с NSTimer - все работает;
- измените атрибуты @property с (nonatomic, weak) на (nonatomic, release) (как было рекомендовано в некоторых решениях для подобных проблема - не помогает
- попробуйте использовать другие варианты методов PerformSelector - не помогает
- попробуйте изменить
mySelector
на@selector(StartTask:)
- не помогает
и так далее....ничего не помогает, может я что-то пропустил?