无法在 Mac 上使用 ARC 使用 respondsToSelector
Posted
技术标签:
【中文标题】无法在 Mac 上使用 ARC 使用 respondsToSelector【英文标题】:Cannot use respondsToSelector using ARC on Mac 【发布时间】:2011-12-17 23:16:08 【问题描述】:当我在 ARC 环境中调用 respondsToSelector
时,我收到以下错误消息 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
关于我为什么会收到此错误的任何建议?
【问题讨论】:
【参考方案1】:使协议符合 NSObject
@protocol MTScrollViewDelegate <NSObject>
否则编译器不会认为对象会响应respondsToSelector
之类的NSObject 消息,并会生成警告。无论哪种方式,它都会在运行时成功,没有任何问题。
【讨论】:
@piobyz,respondsToSelector
是NSObject
的一个实例方法,所以系统需要知道委托是NSObject
的一些子类
@David 谢谢,你说得对,这里还有更多信息:***.com/questions/1304176/…
@piobyz 在 ARC 之前的“旧世界”中,编译器假定您知道自己在做什么,只是在编译时忽略了一些东西。现在 ARC 为您管理保留和释放。为了能够确保方法存在,必须在您的项目中找到该方法。在使用 id 时,编译器找不到任何符号。通过将协议限制为 NSObject ARC 确切地知道任何可能的委托都将包含“respondsToSelector”。这确保了一致性,并且您的内存管理将始终正常。如果将不匹配 NSObject 的类用作委托,则会导致错误。
@piobyz:因为respondsToSelector:
是 NSObject 协议的一部分。 delegate
属性被声明为id <MTScrollViewDelegate>
,它只表示委托响应在该协议中声明的消息。因此,您需要该协议符合 NSObject 协议,以便编译器知道respondsToSelector:
是其中之一。
@David:不完全是。 delegate
没有用类名声明,所以 NSObject 类在这里不相关——编译器不知道,现在也不知道这两件事是相关的。作为解决方案一部分的“NSObject”是 NSObject protocol,因为这是声明 respondsToSelector:
的地方。 developer.apple.com/library/mac/documentation/Cocoa/Reference/…【参考方案2】:
对于 Swift,这变成:
@objc protocol MTScrollViewDelegate: NSObjectProtocol
NSObject 协议对所有 Objective-C 对象的基础方法进行分组。
有关什么是 NSObjectProtocol 的更多信息:https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/index.html
【讨论】:
以上是关于无法在 Mac 上使用 ARC 使用 respondsToSelector的主要内容,如果未能解决你的问题,请参考以下文章
安装 Arc 并上传 APK 后,如何从 Mac 上的 Launchpad 中删除图标?