Kiedy dzwonię respondsToSelector
w środowisku ARC, otrzymuję następujący komunikat o błędzieAutomatic Reference Counting Issue
No known instance method for selector respondsToSelector:
To jest nagłówek
#import <AppKit/AppKit.h>
@class MTScrollView;
@protocol MTScrollViewDelegate
-(void)scrollViewDidScroll:(MTScrollView *)scrollView;
@end
@interface MTScrollView : NSScrollView
{
}
@property(nonatomic, weak) id<MTScrollViewDelegate>delegate;
@end
To jest plik implementacji
#import "MTScrollView.h"
@implementation MTScrollView
@synthesize delegate;
- (void)reflectScrolledClipView:(NSClipView *)aClipView
{
[super reflectScrolledClipView:aClipView];
if([delegate respondsToSelector:@selector(scrollViewDidScroll:)])
{
[delegate scrollViewDidScroll:self];
}
}
@end
Jakieś sugestie, dlaczego otrzymuję ten błąd?
respondsToSelector
jest metodą instancji,NSObject
więc system musi wiedzieć, że delegat należy do podklasyNSObject
respondsToSelector:
jest częścią protokołu NSObject.delegate
Nieruchomość jest zadeklarowana jakoid <MTScrollViewDelegate>
, który mówi tylko, że reaguje delegować wiadomości zadeklarowane w tym protokole. Dlatego potrzebujesz tego protokołu, aby był zgodny z protokołem NSObject, aby kompilator wiedział, żerespondsToSelector:
jest wśród nich.delegate
nie jest zadeklarowana z nazwą klasy, więc klasa NSObject nie ma tu znaczenia - kompilator nie wie i nadal nie wie, że te dwie rzeczy są ze sobą powiązane. „NSObject” będący częścią rozwiązania jest protokołem NSObject , ponieważ jest tamrespondsToSelector:
zadeklarowany. developer.apple.com/library/mac/documentation/Cocoa/Reference/…Dla Swifta staje się to:
@objc protocol MTScrollViewDelegate: NSObjectProtocol
Więcej informacji na temat tego, czym jest NSObjectProtocol: https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/index.html
źródło