gpt4 book ai didi

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

转载 作者:技术小花猫 更新时间:2023-10-29 10:24:13 27 4
gpt4 key购买 nike

我正在使用套接字编程。我只是想澄清与我从 - 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com