Cannot use respondsToSelector using ARC on Mac

Objective CMacosAutomatic Ref-Counting

Objective C Problem Overview


When I call respondsToSelector in an ARC environment, I get the following error message Automatic Reference Counting Issue No known instance method for selector respondsToSelector:

This is the header

#import <AppKit/AppKit.h>


@class MTScrollView;

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


@interface MTScrollView : NSScrollView 
{
    
}

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

@end

This is the implementation file

#import "MTScrollView.h"

@implementation MTScrollView

@synthesize delegate;


- (void)reflectScrolledClipView:(NSClipView *)aClipView
{
	[super reflectScrolledClipView:aClipView];
    
	if([delegate respondsToSelector:@selector(scrollViewDidScroll:)])
    {
		[delegate scrollViewDidScroll:self];
	}
}

@end

Any suggestions on why I am getting this error?

Objective C Solutions


Solution 1 - Objective C

Make the protocol conform to NSObject

@protocol MTScrollViewDelegate <NSObject>

Otherwise the compiler doesn't think that the object will respond to NSObject messages like respondsToSelector, and will generate a warning. It will succeed at runtime without issues either way.

Solution 2 - Objective C

For Swift this becomes:

@objc protocol MTScrollViewDelegate: NSObjectProtocol

> The NSObject protocol groups methods that are fundamental to all Objective-C objects.

For more information on what NSObjectProtocol is: https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/index.html

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDavidView Question on Stackoverflow
Solution 1 - Objective CJason HarwigView Answer on Stackoverflow
Solution 2 - Objective CniketView Answer on Stackoverflow