为什么我们调用doesNotRecognizeSelector:方法?

Har*_*hIT 13 iphone objective-c nsobject ios

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

 [chatRoom broadcastChatMessage:input.text fromUser:[AppConfig getInstance].name];
Run Code Online (Sandbox Code Playgroud)

当我在Room.m 文件中看到,用于执行上面的调用; 它是

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

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

根据Stackovrflow,它用于创建抽象类,根据这个问题,它避免了"不完整实现"的警告.

我仍然没有理解为什么在Chatty Code中使用该方法,请帮助我理解使用该方法的原因.

Ben*_*tto 12

这是在每个NSObject派生对象上存在的方法,当在运行时调用中无法识别方法时,该方法会触发异常路径.例如,如果您尝试向NSString被叫方发送消息-foo,那么它将结束,因为这不是一个有效的方法NSString.

在这种情况下,Chatty类Room是一个永远不会直接使用的基类.LocalRoomRemoteRoom从中派生出来,这两个类都提供了一个重写的实现-broadcastChatMessage:fromUser.从来没有人调用基类版本,但对"完整性"的程序员保证一个subclasser必须通过实施该方法,但随后转身,并呼吁这触发异常覆盖.

事实上,这不是特定的惯用Objective-C."抽象"类是来自C++和其他语言的概念; 它的基类只存在于子类的"模式"中.(在ObjC中,这通常@protocol是在没有有意义的状态时创建正式的,因为(大多数)不在这里).

请注意,调用-doesNotRecognizeSelector:是任意的.没有必要在这里避免编译器警告(因为该方法实际上是已实现的)并且原始编写者可以很容易地直接抛出异常,或者不做任何事情.