ARC環境でrespondsToSelector
を呼び出すと、次のエラーメッセージが表示されます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
このエラーが発生する理由に関する提案はありますか?
プロトコルをNSObjectに準拠させる
@protocol MTScrollViewDelegate <NSObject>
そうしないと、コンパイラは、オブジェクトがrespondsToSelector
のようなNSObjectメッセージに応答することを認識せず、警告を生成します。どちらの方法でも問題なく実行時に成功します。
Swiftの場合、これは次のようになります。
@objc protocol MTScrollViewDelegate: NSObjectProtocol
NSObjectプロトコルは、すべてのObjective-Cオブジェクトに不可欠なメソッドをグループ化します。
NSObjectProtocolの詳細について: https://developer.Apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/index.html