Свойство доступно только для чтения в статической библиотеке

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

Примером может быть следующее:

Button.h

@property (nonatomic, strong, readonly) NSString *button_id;

Проблема, с которой я столкнулся, заключается в том, что я собираюсь предоставить код в виде статической библиотеки, но я не хочу, чтобы кто-то мог изменить код заголовка и разрешить запись переменной.

Как вы можете видеть, я не очень хорошо разбираюсь в Objective C, какой была бы лучшая стратегия, чтобы избежать чего-то подобного?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
101
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В 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"; }

Другие вопросы по теме