web-dev-qa-db-ja.com

MacでARCを使用してrespondsToSelectorを使用できない

ARC環境でrespondsToSelectorを呼び出すと、次のエラーメッセージが表示されますAutomatic Reference Counting IssueNo 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

このエラーが発生する理由に関する提案はありますか?

83
David

プロトコルをNSObjectに準拠させる

@protocol MTScrollViewDelegate <NSObject>

そうしないと、コンパイラは、オブジェクトがrespondsToSelectorのようなNSObjectメッセージに応答することを認識せず、警告を生成します。どちらの方法でも問題なく実行時に成功します。

273
Jason Harwig

Swiftの場合、これは次のようになります。

@objc protocol MTScrollViewDelegate: NSObjectProtocol

NSObjectプロトコルは、すべてのObjective-Cオブジェクトに不可欠なメソッドをグループ化します。

NSObjectProtocolの詳細について: https://developer.Apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/index.html

4
niket