У меня есть класс с некоторыми свойствами, некоторые из них должны быть доступны только для чтения, иначе они могут вызвать системные проблемы.
Примером может быть следующее:
Button.h
@property (nonatomic, strong, readonly) NSString *button_id;
Проблема, с которой я столкнулся, заключается в том, что я собираюсь предоставить код в виде статической библиотеки, но я не хочу, чтобы кто-то мог изменить код заголовка и разрешить запись переменной.
Как вы можете видеть, я не очень хорошо разбираюсь в Objective C, какой была бы лучшая стратегия, чтобы избежать чего-то подобного?
В Objective-C вы можете легко обойти аннотацию readonly
, и общее соглашение заключается в том, что кто-то другой не будет возиться с кодом таким образом, если только он не захочет...
Я хочу сказать, что вы должны просто отметить это как readonly
, как вы делаете сейчас, и не слишком беспокоиться. Если вы имеете дело с некоторыми чувствительными вещами, которые действительно не следует изменять, вам нужно сделать это по-другому, используя, например. шифрование, но по крайней мере ниже, это способ сделать его немного сильнее, чем просто readonly
.
В приведенном ниже коде используется не свойство, а метод класса. Вы также можете использовать метод экземпляра, но здесь класс имеет больше смысла. Это немедленно приводит к тому, что его нельзя установить, поэтому вы избегаете многих случаев, когда кто-то может намеренно или случайно установить его. Вы также вынимаете его из заголовочного файла и прочно вставляете в (скомпилированный) файл класса.
Атрибут direct
также означает, что его нельзя переопределить в подклассе. Это настолько хорошо, насколько это возможно. Это полное излишество для идентификаторов кнопок в пользовательском интерфейсе и недостаточно, например. банковский счет, но он настолько силен, насколько вы можете его сделать.
Заголовочный файл/интерфейс
+ ( NSString * ) password __attribute__ ( ( objc_direct ) );
Выполнение
+ ( NSString * ) password __attribute__ ( ( objc_direct ) )
{
return @"abc";
}
Использовать
NSLog ( @"The password is %@", MyClass.password );
РЕДАКТИРОВАТЬ
FWIW, если вы просто хотите иметь кучу идентификаторов только для чтения, просто введите что-то вроде ниже в заголовке
+ ( NSString * ) id1;
+ ( NSString * ) id2;
и реализовать это как-то так
+ ( NSString * ) id1 { return @"1"; }
+ ( NSString * ) id2 { return @"2"; }