iphone - 为什么我们调用 doesNotRecognizeSelector : method?

标签 iphone ios objective-c nsobject

我正在使用套接字编程。我只是想澄清与我从 - mobileorchard.com - Chatty 下载的代码相关的疑问。 .在研发时,我在 ChatRoomViewController.m 文件中看到了一个函数调用

 [chatRoom broadcastChatMessage:input.text fromUser:[AppConfig getInstance].name];

当我在Room.m文件中看到,上面调用的实现;这是

- (void)broadcastChatMessage:(NSString*)message fromUser:(NSString*)name
{
    // Crude way to emulate an "abstract" class
    [self doesNotRecognizeSelector:_cmd];
}

根据Apple,我用谷歌搜索“doesNotRecognizeSelector:”它用于错误处理,声明“只要对象收到它无法响应或转发的 aSelector 消息,运行时系统就会调用此方法。”我的问题是,为什么开发人员调用 broadcastChatMessage:fromUser: 函数(如果它在那里没有用)并处理哪个方法的“未找到选择器”异常?

根据 Stackovrflow ,它用于创建抽象类,根据这个 Question ,它可以避免“不完整的实现”警告。

我仍然不明白为什么在 Chatty Code 中使用该方法,请帮助我理解使用该方法的原因。

最佳答案

这是存在于每个 NSObject 派生对象上的方法,当在运行时调用中无法识别方法时,它会触发异常路径。例如,如果您尝试向名为 -fooNSString 发送消息,它会在那里结束,因为这不是 NSString.

在这种情况下,Chatty 类 Room 是一个从不直接使用的基类。 LocalRoomRemoteRoom 派生自它,并且这两个类都提供了 -broadcastChatMessage:fromUser 的重写实现。没有人调用该基类版本,但为了“完整性”,程序员保证子类必须通过实现该方法来覆盖它,然后转身调用它来触发异常。

事情是,这不是特别惯用的 Objective-C。 “抽象”类是来自 C++ 和其他语言的概念;它是仅作为子类化的“模式”存在的基类。 (在 ObjC 中,这通常是通过在没有有意义的状态时创建正式的 @protocol 来完成的,因为(大部分)不在这里)。

请注意,对 -doesNotRecognizeSelector: 的调用是任意的。这里没有必要避免编译器警告(因为该方法实际上已实现),原作者可以很容易地直接抛出异常,或者什么都不做。

关于iphone - 为什么我们调用 doesNotRecognizeSelector : method?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15893996/

相关文章:

ios - 如何更新标签而不是覆盖?

ios - 使用 Twitter 在 iPhone 中登录用户并将经过身份验证的用户保存到远程 Django 应用程序

ios - 在 App Delegate 中启动时显示加载屏幕

iphone - 当我确实需要使用 [NSThread sleepForTimeInterval :1];

iphone - CAL层深度

javascript - 在 webview 中加载本地 javascript?

ios - 在 Storyboard 中向从 nib 加载的自定义类 UIViewController 添加 subview

ios - dequeueReusableCellWithIdentifier 创建重复的 UITableviewcell

ios - 如何重新创建 persistentStore 不受更改 .xcdatamodeld 的影响

objective-c - 直接通过名称绑定(bind) SQLite 参数