web-dev-qa-db-fra.com

Impossible d'utiliser respondsToSelector à l'aide d'ARC sur Mac

Lorsque j'appelle respondsToSelector dans un environnement ARC, j'obtiens le message d'erreur suivant Automatic Reference Counting IssueNo known instance method for selector respondsToSelector:

Ceci est l'en-tête

#import <AppKit/AppKit.h>


@class MTScrollView;

@protocol MTScrollViewDelegate
-(void)scrollViewDidScroll:(MTScrollView *)scrollView;
@end


@interface MTScrollView : NSScrollView 
{

}

@property(nonatomic, weak) id<MTScrollViewDelegate>delegate;

@end

Ceci est le fichier d'implémentation

#import "MTScrollView.h"

@implementation MTScrollView

@synthesize delegate;


- (void)reflectScrolledClipView:(NSClipView *)aClipView
{
    [super reflectScrolledClipView:aClipView];

    if([delegate respondsToSelector:@selector(scrollViewDidScroll:)])
    {
        [delegate scrollViewDidScroll:self];
    }
}

@end

Des suggestions sur la raison pour laquelle j'obtiens cette erreur?

83
David

Rendre le protocole conforme à NSObject

@protocol MTScrollViewDelegate <NSObject>

Sinon, le compilateur ne pense pas que l'objet répondra aux messages NSObject comme respondsToSelector et générera un avertissement. Il réussira au moment de l'exécution sans aucun problème.

273
Jason Harwig

Pour Swift cela devient:

@objc protocol MTScrollViewDelegate: NSObjectProtocol

Le protocole NSObject regroupe les méthodes fondamentales pour tous les objets Objective-C.

Pour plus d'informations sur ce qu'est NSObjectProtocol: https://developer.Apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/index.html

4
niket