Cuando llamo respondsToSelector
en un entorno ARC, aparece el siguiente mensaje de errorAutomatic Reference Counting Issue
No known instance method for selector respondsToSelector:
Este es el encabezado
#import <AppKit/AppKit.h>
@class MTScrollView;
@protocol MTScrollViewDelegate
-(void)scrollViewDidScroll:(MTScrollView *)scrollView;
@end
@interface MTScrollView : NSScrollView
{
}
@property(nonatomic, weak) id<MTScrollViewDelegate>delegate;
@end
Este es el archivo de implementación
#import "MTScrollView.h"
@implementation MTScrollView
@synthesize delegate;
- (void)reflectScrolledClipView:(NSClipView *)aClipView
{
[super reflectScrolledClipView:aClipView];
if([delegate respondsToSelector:@selector(scrollViewDidScroll:)])
{
[delegate scrollViewDidScroll:self];
}
}
@end
¿Alguna sugerencia sobre por qué recibo este error?
respondsToSelector
es un método de instancia, porNSObject
lo que el sistema necesita saber que el delegado es una subclase deNSObject
respondsToSelector:
es parte del protocolo NSObject. Ladelegate
propiedad se declara comoid <MTScrollViewDelegate>
, que dice solo que el delegado responde a los mensajes declarados en ese protocolo. Por lo tanto, necesita que ese protocolo se ajuste al protocolo NSObject para que el compilador sepa que serespondsToSelector:
encuentra entre ellos.delegate
no se declara con un nombre de clase, por lo que la clase NSObject no es relevante aquí; el compilador no sabe, y aún no sabe, que esas dos cosas están relacionadas. El “NSObject” que forma parte de la solución es el protocolo NSObject , porque ahí es donderespondsToSelector:
se declara. developer.apple.com/library/mac/documentation/Cocoa/Reference/…Para Swift esto se convierte en:
@objc protocol MTScrollViewDelegate: NSObjectProtocol
Para obtener más información sobre qué es NSObjectProtocol: https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/index.html
fuente