Когда я звоню respondsToSelector
в среду ARC, я получаю следующее сообщение об ошибкеAutomatic Reference Counting Issue
No known instance method for selector respondsToSelector:
Это заголовок
#import <AppKit/AppKit.h>
@class MTScrollView;
@protocol MTScrollViewDelegate
-(void)scrollViewDidScroll:(MTScrollView *)scrollView;
@end
@interface MTScrollView : NSScrollView
{
}
@property(nonatomic, weak) id<MTScrollViewDelegate>delegate;
@end
Это файл реализации
#import "MTScrollView.h"
@implementation MTScrollView
@synthesize delegate;
- (void)reflectScrolledClipView:(NSClipView *)aClipView
{
[super reflectScrolledClipView:aClipView];
if([delegate respondsToSelector:@selector(scrollViewDidScroll:)])
{
[delegate scrollViewDidScroll:self];
}
}
@end
Любые предложения о том, почему я получаю эту ошибку?
respondsToSelector
- это метод экземпляра,NSObject
поэтому системе необходимо знать, что делегат является одним из подклассовNSObject
respondsToSelector:
это часть протокола NSObject.delegate
Свойство объявляетсяid <MTScrollViewDelegate>
, что говорит лишь о том , что делегат отвечает на сообщения , объявленные в этом протоколе. Таким образом, вам нужно, чтобы этот протокол соответствовал протоколу NSObject, чтобы компилятор знал, чтоrespondsToSelector:
он среди них.delegate
не объявлен с именем класса, поэтому класс NSObject здесь не имеет значения - компилятор не знает и до сих пор не знает, что эти две вещи связаны. «NSObject», который является частью решения, - это протокол NSObject , потому что он тамrespondsToSelector:
объявлен. developer.apple.com/library/mac/documentation/Cocoa/Reference/…Для Swift это становится:
@objc protocol MTScrollViewDelegate: NSObjectProtocol
Для получения дополнительной информации о том, что такое NSObjectProtocol: https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/index.html
источник