Протокол target-c определен в его собственном файле .h? - PullRequest
18 голосов
/ 06 июня 2009

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

Ответы [ 6 ]

20 голосов
/ 06 июня 2009

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

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

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

3 голосов
/ 06 июня 2009

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

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

С уважением, Frank

3 голосов
/ 06 июня 2009

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

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

0 голосов
/ 25 марта 2011

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

0 голосов
/ 06 июня 2009

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

0 голосов
/ 06 июня 2009

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

...