2013-04-09 4 views
12

Я работаю с программированием сокетов. Я просто хотел убрать сомнения, связанные с кодом, который я загрузил с - mobileorchard.com - Chatty. В то время как R & D, я увидел вызов функции в ChatRoomViewController.m файлаПочему мы вызываем doesNotRecognizeSelector: метод?

[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]; 
} 

я гугл на «doesNotRecognizeSelector:», согласно Apple его для обработки ошибок, заявив, что «Исполняющая система вызывает этот метод, когда объект получает сообщение aSelector он не может ответить или переадресовать» мой вопрос в том, почему разработчик вызывает функцию broadcastChatMessage: fromUser:, если ее не использовать там и обрабатывать исключение «selector not found» этого метода?

Согласно Stackovrflow, его использовали для создания абстрактного класса, в соответствии с этим Question, чтобы избежать предупреждения «Неполная реализация».

Я до сих пор не понимаю, почему этот метод используется в этом Chatty Code. Пожалуйста, помогите мне понять причину использования этого метода.

+1

Похоже, что первоначальный разработчик приложения пытался эмулировать функции абстрактного базового класса C++, в том случае, если он недействителен. Это просто более экстремальная форма создания методов ничего не делает или возвращает значение заполнителя (обычно 0 или NULL). – CodaFi

ответ

11

Это метод, который существует на каждом производном объекте NSObject, который запускает путь к исключению, когда метод не распознается во время выполнения. Например, если вы попытаетесь отправить сообщение на NSString под названием -foo, оно будет там, так как это недействительный метод на NSString.

В этом случае класс Chatty Room является базовым классом, который никогда не используется напрямую. LocalRoom и RemoteRoom вытекают из него, и оба этих класса обеспечивают основную реализацию -broadcastChatMessage:fromUser. Никто никогда не называет эту версию базового класса, но для «полноты» программист гарантировал, что подкласс должен переопределить это, реализуя этот метод, но затем оборачиваясь и вызывая это, чтобы вызвать исключение.

Вещь, это не специально идиоматическая цель-C. «Абстрактный» класс - это концепция из C++ и других языков; это базовый класс, который существует только как «шаблон», из которого в подкласс. (В ObjC это часто делается путем создания формального @protocol, когда нет значимого состояния, поскольку там (в основном) здесь нет).

Обратите внимание, что звонок -doesNotRecognizeSelector: является произвольным. Здесь нет необходимости избегать предупреждений компилятора (так как этот метод фактически реализован), и исходный писатель мог просто просто выбросить исключение напрямую или вместо этого ничего не делать.

4

Мне кажется, что вы уже ответили на свой вопрос. В Objective-C нет метода создания абстрактных классов, поэтому самое близкое к тому, чтобы это сделать, чтобы методы, которые вам нужно переопределить исключения исключения. Если вы переопределите этот метод в подклассе, то doesNotRecognizeSelector: больше не будет вызываться. В принципе, это способ заставить разработчика пообещать реализовать этот метод в своем подклассе.

Кроме того, как вы упомянули, если вы не введете это, компилятор выдаст предупреждение, поскольку для метода, определенного в заголовке, не существует реализации. Это будет выполнять то же поведение, что и не реализовывать его, но компилятор поймет, что вы делаете это специально.

Смежные вопросы