无法在 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,respondsToSelectorNSObject 的一个实例方法,所以系统需要知道委托是NSObject 的一些子类 @David 谢谢,你说得对,这里还有更多信息:***.com/questions/1304176/… @piobyz 在 ARC 之前的“旧世界”中,编译器假定您知道自己在做什么,只是在编译时忽略了一些东西。现在 ARC 为您管理保留和释放。为了能够确保方法存在,必须在您的项目中找到该方法。在使用 id 时,编译器找不到任何符号。通过将协议限制为 NSObject ARC 确切地知道任何可能的委托都将包含“respondsToSelector”。这确保了一致性,并且您的内存管理将始终正常。如果将不匹配 NSObject 的类用作委托,则会导致错误。 @piobyz:因为respondsToSelector: 是 NSObject 协议的一部分。 delegate 属性被声明为id &lt;MTScrollViewDelegate&gt;,它只表示委托响应在该协议中声明的消息。因此,您需要该协议符合 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——iOS/Mac开发ARC入门和使用

Mac Cocoa:无法释放窗口以取回其内存

如何调试旧版Mac OS X的应用程序?

安装 Arc 并上传 APK 后,如何从 Mac 上的 Launchpad 中删除图标?

我在哪里可以找到 CocoaAsyncSocket 的非 ARC 版本?

iCarousel 类不适用于 xcode 4.2 和 mac os 10.6 上的 ARC