无法在Mac上使用ARC使用respondsToSelector

Dav*_*vid 83 macos objective-c automatic-ref-counting

当我respondsToSelector在ARC环境中调用时,收到以下错误消息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
Run Code Online (Sandbox Code Playgroud)

这是实现文件

#import "MTScrollView.h"

@implementation MTScrollView

@synthesize delegate;


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

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

@end
Run Code Online (Sandbox Code Playgroud)

有关我为什么会收到此错误的任何建议?

Jas*_*wig 274

使协议符合NSObject

@protocol MTScrollViewDelegate <NSObject>
Run Code Online (Sandbox Code Playgroud)

否则编译器不会认为该对象会响应NSObject消息respondsToSelector,并会生成警告.它会在运行时成功,没有任何问题.

  • @piobyz,`respondsToSelector`是`NSObject`的实例方法,所以系统需要知道委托是`NSObject`的子类. (2认同)
  • 在ARC之前的"旧世界"中的@piobyz,编译器假设你知道你在做什么,并且在编译时忽略了一些东西.现在ARC为您管理保留和发布.为了能够确保存在方法,必须在项目中找到该方法.使用id时,编译器找不到任何符号.通过将协议限制为NSObject ARC,确切地知道任何可能的委托都将包含"respondsToSelector".这确保了一致性,您的内存管理将始终很好.如果用作委托,则与NSObject不匹配的类将导致错误. (2认同)

小智 5

对于 Swift,这变成了:

@objc protocol MTScrollViewDelegate: NSObjectProtocol
Run Code Online (Sandbox Code Playgroud)

NSObject 协议对所有 Objective-C 对象的基础方法进行分组。

有关 NSObjectProtocol 是什么的更多信息:https : //developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/index.html