Lorsque j'appelle respondsToSelector
dans un environnement ARC, j'obtiens le message d'erreur suivantAutomatic Reference Counting Issue
No known instance method for selector respondsToSelector:
C'est l'en-tête
#import <AppKit/AppKit.h>
@class MTScrollView;
@protocol MTScrollViewDelegate
-(void)scrollViewDidScroll:(MTScrollView *)scrollView;
@end
@interface MTScrollView : NSScrollView
{
}
@property(nonatomic, weak) id<MTScrollViewDelegate>delegate;
@end
Ceci est le fichier d'implémentation
#import "MTScrollView.h"
@implementation MTScrollView
@synthesize delegate;
- (void)reflectScrolledClipView:(NSClipView *)aClipView
{
[super reflectScrolledClipView:aClipView];
if([delegate respondsToSelector:@selector(scrollViewDidScroll:)])
{
[delegate scrollViewDidScroll:self];
}
}
@end
Des suggestions sur pourquoi j'obtiens cette erreur?
respondsToSelector
est une méthode d'instance deNSObject
donc le système doit savoir que le délégué fait partie de la sous-classe deNSObject
respondsToSelector:
fait partie du protocole NSObject. Ladelegate
propriété est déclarée commeid <MTScrollViewDelegate>
, ce qui indique uniquement que le délégué répond aux messages déclarés dans ce protocole. Ainsi, vous avez besoin que ce protocole soit conforme au protocole NSObject pour que le compilateur sache qu'il enrespondsToSelector:
fait partie.delegate
n'est pas déclarée avec un nom de classe, donc la classe NSObject n'est pas pertinente ici - le compilateur ne sait pas et ne sait toujours pas que ces deux choses sont liées. Le «NSObject» qui fait partie de la solution est le protocole NSObject , car c'est là querespondsToSelector:
est déclaré. developer.apple.com/library/mac/documentation/Cocoa/Reference/…Pour Swift, cela devient:
@objc protocol MTScrollViewDelegate: NSObjectProtocol
Pour plus d'informations sur ce qu'est NSObjectProtocol: https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/index.html
la source