Подтвердить что ты не робот

Objective-c протокол, определенный в собственном файле .h?

Если мне что-то не хватает, кажется произвольным, в каком файле .h я поместил определение протокола. Мне даже интересно, может ли это быть в нем собственный .h файл... (в Java, он в собственном файле)

4b9b3361

Ответ 1

Я думаю, что размещение протокола зависит от того, как вы его используете. В большинстве случаев протокол используется для определения функциональности делегата или источника данных для другого класса. Если это так, я думаю, вы можете безопасно поместить определение протокола в начало другого класса, так как они обязательно будут использоваться вместе.

Если вы определяете протокол вместо общего базового класса, вы должны, вероятно, поместить его в отдельный файл. Например, у меня есть несколько разных классов, которые реализуют протокол "Операция". Некоторые из моих других функций ожидают получить объект, реализующий протокол, и не слишком заботятся о реальных классах. В этом случае имеет смысл поставить определение протокола в свой собственный файл заголовка, чтобы вы могли включить его в свой собственный.

Бенни прав, однако - он будет технически определен независимо от того, где вы его разместите (если он включен где-то до его использования).

Ответ 2

Я думаю, что до тех пор, пока он определен где-то и включен в один из файлов, которые вы компилируете, он определен. В Objective-C нет таких соглашений, как "ClassName.java", как в Java.

Это очень полезно, если вы хотите сделать что-то вроде categories для таких вещей, как частные методы/свойства.

Ответ 3

Протоколы обычно определяются в их собственном файле .h(по моему опыту). Но они могут быть определены в файле shared.h. Было бы трудно разрешить пользователям протокола принимать протокол в общей файловой системе, и, кроме того, это загромождает ваш API. Документация и использование, вероятно, будет проще, если в протоколе есть собственный файл .h.

Кроме того, использование вашего протокола для таких вещей, как полиморфные реализации, будет иметь меньшие накладные расходы, если вам просто нужно включить файл протокола .h вместо файла .h, который имеет другие объявления классов. Я не уверен в точной стоимости/сбережениях этой идеи, но я читал, что там будут некоторые (меньшие двоичные файлы?)

С уважением, Франк

Ответ 4

Это действительно в значительной степени вопрос стиля в Objective-C. Я полагаю, что действительно "правильный" способ состоит в создании отдельного файла .h для протокола, и если бы я делал протокол, который не принадлежал ни к чему другому (например, к примеру NSCoding), я бы это сделал. С другой стороны, большую часть времени, когда я создаю протокол (или неофициальный протокол, используя категорию в NSObject), он привязан к другому классу, например, к неофициальному протоколу источника данных NSTableView. В этих ситуациях я просто поместил объявление в этот заголовочный файл класса для простоты.

Ответ 5

Также см. Apple "Общение с объектами" , в котором обсуждаются делегаты, протоколы и селектора. Хотя он указан в Mac OS X, большинство (если не все), похоже, также относятся к iOS.

Ответ 6

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