2010-01-27 1 views
0

У меня есть определенный домен ошибок, который я хочу опубликовать в протоколе. Домен определяется в файле реализации, как это:Как опубликовать статический void NSString в протоколе?

//in the .m file 
static void *MyErrorDomain = (void *)@"MyErrorDomain"; 

.h файл реализует протокол, и я хотел бы опубликовать MyErrorDomain там. Однако я не могу определить правильную форму. Тот, который дает наименьшее количество ошибок:

// in the protocol  
static extern void * TBPluginErrorDomain; 

ошибка Xcode является: «Несколько классов хранения в декларации спецификаторов».

Я думал, что статическая конструкция пустот превращает MyErrorDomain в некую функцию, но «статический extern void TBPluginErrorDomain();» только увеличил количество ошибок. Короче говоря, я блуждаю в болоте невежества, и все указания будут очень благодарны.

ответ

2

На верхнем уровне static означает «не доступен непосредственно (без указателя) вне этого файла» (область содержимого). extern означает «определенный в каком-либо другом объектном файле». static extern на самом деле не имеет никакого смысла. Это похоже на запрос доступа к частному члену из другого класса. Вы не хотите использовать здесь static.

Просто сделайте нормальное определение в вашем .m:

void *MyErrorDomain = @"MyErrorDomain"; 

И сделать Экстерн заявление в вашем .h:

extern void *MyErrorDomain; 

обязательно связать в .o с .m всякий раз, когда Вы связываетесь вместе с тем, что использует переменную (после включения файла .h). В Xcode на вкладке «Цели» окна «Информация о продукте» для файла .m обязательно проверьте каждую цель, использующую переменную (возможно, немного отличающуюся в новых версиях, моя старая!).

Возможно, вы можете добавить в const (const … и extern const …), но экземпляры NSString неизменяемы, поэтому это не является абсолютно необходимым. Вы можете сделать это в указателе const, хотя, поэтому указатель не может быть напрямую изменен во время выполнения (без отбрасывания const). Вместе вы имеете const void * const MyErrorDomain в определении. Просто префикс его в объявлении extern.

Кроме того, в зависимости от ваших целей, вы можете использовать NSString * вместо void *.

+0

Не беспокоиться о отсутствии futzing, нет. Я реализовал ваше решение, но, к сожалению, теперь я получаю сообщение об ошибке «Conflicting types for MyErrorDomain». Я прочитал, что указатель (void *) будет автоматически добавлен к правильному типу, так что это довольно озадачивает. –

+0

Ошибка «конфликтующих типов» означает, что в определении или декларации есть что-то лишнее (или что-то не хватает). Скопируйте и вставьте один в строку перед другим, а затем сравните или просто замените тип определения типом объявления (без 'extern'). –

+0

Stare-and-compare? Будет хорошим именем для компании, но слишком большая честность, вероятно, не продается. Во всяком случае, находка по всему проекту показала, что я уже определил MyErrorDomain как NSString const где-то в другом месте. Могу ли я спросить, почему вы изменили void * MyErrorDomain = (void *) @ "MyErrorDomain"; до void * MyErrorDomain = @ "MyErrorDomain"; ? –

0

Протоколы определяют только имена и параметры методов, которые должны быть реализованы другими классами. Они не содержат никаких данных или функционального кода.

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

+0

Что заставило вас думать, что я пытаюсь включить данные или функциональный код в протокол? Я отредактировал свой вопрос, чтобы показать, какую строку кода я поместил в файл реализации и который в протоколе. –

+0

Потому что вы сказали, что хотите опубликовать домен ошибки в протоколе. Протокол не имеет файла реализации. Протокол - это ничего, кроме объявлений методов между '@protocol ... @ end'.Вы не можете «публиковать» какие-либо переменные вообще в протоколе. Я думаю, что вы можете вводить в заблуждение протокол с интерфейсом. – TechZen

+0

А, я думаю, у нас есть другая интерпретация слова «публикация». Я имел в виду «позвольте миру в целом знать о его существовании», вы читаете его как «обеспечиваете ценность». Интересно, что онлайн-словарь Merriam-Webster поддерживает оба значения [www.merriam-webster.com/dictionary/publish]. –

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