Вы должны реализовать его как Экстерн строк, как в вашем примере:
ехЬегп NSString * сопзЬ MyPluginErrorDomain;
или предоставить функции extern, которые возвращают данные статического хранилища. Например:
/* h */
extern NSString * MyPluginErrorDomain();
/* m */
NSString * MyPluginErrorDomain() {
static NSString * const s = @"MyPluginErrorDomain";
return s;
}
Причина заключается в том, что строки и ключи часто используются и сравниваются по значению указателя или хэш-значением, а не истинное сравнение строк (isEqualToString :).
На уровне реализации, есть большая разница между:
В коде, это значит, что если сравнивать строки определены в нескольких двоичных файлов:
Say «MyPluginErrorDomain» и «ключевых» имеют идентичные строковые значения, но определяются в разных двоичных файлах (то есть на хосте плагина, один в плагине).
/////// Pointer comparison (NSString)
BOOL a = [MyPluginErrorDomain isEqualToString:key];
BOOL b = MyPluginErrorDomain == key;
// c may be false because a may be true, in that they represent the same character sequence, but do not point to the same object
BOOL c = a == b;
/////// Hash use (NSString)
// This is true
BOOL d = [MyPluginErrorDomain hash] == [key hash];
// This is indicative if true
BOOL e = [MyPluginErrorDomain hash] == [someOtherStringKey hash];
// because
BOOL f = [MyPluginErrorDomain isEqualToString:someOtherStringKey];
// g may be false (though the hash code is 'generally' correct)
BOOL g = e == f;
Поэтому во многих случаях необходимо предоставить ключи. Это может показаться тривиальной точкой, но трудно диагностировать некоторые проблемы, связанные с различием.
Кодирование хэшей и сравнение указателей используются во всех форматах Foundation и других objc-технологий во внутренних словах хранения словарей, кодировании ключевых значений ... Если ваш словарь идет прямо в xml, это одно, но использование во время выполнения - другое, есть несколько предостережений в деталях реализации и времени выполнения.
удалить C, C++ теги - это объективный вопрос C – zaharpopov
Отмеченный для C++, см. Также мой комментарий к интересному ответу Нила Баттерворта. Я все еще задаюсь вопросом, не существует ли также решения C, я не могу быть первым человеком в истории C, который хотел достичь этого. –
Так как это константы C, этот C не нужно удалять. – iCaramba