MacでARCを使用してrespondsToSelectorを使用することはできません


83

respondsToSelectorARC環境で呼び出すと、次のエラーメッセージが表示されます。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

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

回答:


276

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

@protocol MTScrollViewDelegate <NSObject>

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


2
@piobyzはのrespondsToSelectorインスタンスメソッドであるNSObjectため、システムはデリゲートが次のサブクラスの一部であることを認識する必要がありますNSObject
David

1
:@デビッドのおかげで、あなたに加えてここにいる権利は、いくつかの詳細情報ですstackoverflow.com/questions/1304176/...
ピョートルByzia

2
ARC以前の「旧世界」の@piobyzは、コンパイラーは、ユーザーが何をしているかを知っていると想定し、コンパイル時にいくつかのことを単に無視しました。これで、ARCが保持とリリースを管理します。メソッドが存在することを確認できるようにするには、プロジェクトでメソッドを見つける必要があります。idを使用している間、コンパイラーはシンボルを見つけることができません。プロトコルをNSObjectに制限することにより、ARCは、可能なデリゲートに「respondsToSelector」が含まれることを正確に認識します。これにより一貫性が確保され、メモリ管理は常に正常に行われます。NSObjectと一致しないクラスは、デリゲートとして使用するとエラーが発生します。
JackPearse 2012

1
@piobyz:respondsToSelector:はNSObjectプロトコルの一部だからです。delegateプロパティは次のように宣言されid <MTScrollViewDelegate>たメッセージへの委任応答は、そのプロトコルで宣言されたことだけを言っています、。したがって、コンパイラがNSObjectプロトコルに準拠していることを知るにrespondsToSelector:は、そのプロトコルが必要です。
Peter Hosey 2012

1
@David:そうではありません。delegateはクラス名で宣言されていないため、NSObjectクラスはここでは関係ありません。コンパイラは、これら2つのことが関連していることを認識していません。ソリューションの一部である「NSObject」はNSObjectプロトコルです。これは、ここrespondsToSelector:で宣言されているためです。developer.apple.com/library/mac/documentation/Cocoa/Reference/...
ピーターHosey

4

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

@objc protocol MTScrollViewDelegate: NSObjectProtocol

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

NSObjectProtocolの詳細については、https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/index.htmlをご覧ください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.