Как опубликовать статическую пустоту NSString в протоколе? - PullRequest
0 голосов
/ 27 января 2010

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

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

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

// in the protocol    
static extern void * TBPluginErrorDomain;

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

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

Ответы [ 2 ]

2 голосов
/ 27 января 2010

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

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

void *MyErrorDomain = @"MyErrorDomain";

И сделайте внешнее объявление в вашем .h:

extern void *MyErrorDomain;

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

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

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

0 голосов
/ 27 января 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...