Wenn ich respondsToSelector
in einer ARC-Umgebung anrufe, wird die folgende Fehlermeldung angezeigtAutomatic Reference Counting Issue
No known instance method for selector respondsToSelector:
Dies ist der Header
#import <AppKit/AppKit.h>
@class MTScrollView;
@protocol MTScrollViewDelegate
-(void)scrollViewDidScroll:(MTScrollView *)scrollView;
@end
@interface MTScrollView : NSScrollView
{
}
@property(nonatomic, weak) id<MTScrollViewDelegate>delegate;
@end
Dies ist die Implementierungsdatei
#import "MTScrollView.h"
@implementation MTScrollView
@synthesize delegate;
- (void)reflectScrolledClipView:(NSClipView *)aClipView
{
[super reflectScrolledClipView:aClipView];
if([delegate respondsToSelector:@selector(scrollViewDidScroll:)])
{
[delegate scrollViewDidScroll:self];
}
}
@end
Irgendwelche Vorschläge, warum ich diesen Fehler erhalte?
respondsToSelector
ist eine Instanzmethode von,NSObject
so dass das System wissen muss, dass der Delegat einige der Unterklasse vonNSObject
respondsToSelector:
Teil des NSObject-Protokolls ist. Diedelegate
Eigenschaft wird als deklariertid <MTScrollViewDelegate>
, was nur besagt, dass der Delegat auf in diesem Protokoll deklarierte Nachrichten antwortet. Daher muss dieses Protokoll mit dem NSObject-Protokoll übereinstimmen, damit der Compiler weiß, dassrespondsToSelector:
es sich um ein Protokoll handelt.delegate
wird nicht mit einem Klassennamen deklariert, daher ist die NSObject-Klasse hier nicht relevant - der Compiler weiß und weiß immer noch nicht, dass diese beiden Dinge zusammenhängen. Das „NSObject“, das Teil der Lösung ist, ist das NSObject- Protokoll , da dortrespondsToSelector:
deklariert wird. developer.apple.com/library/mac/documentation/Cocoa/Reference/…Für Swift wird dies:
Weitere Informationen zu NSObjectProtocol finden Sie unter: https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/index.html
quelle