Як перевизначити @synthesized getters?


75

як замінити властивість синтезованого геттера?


2
Це не стосується ані iPhone, ані iOS. Це навіть не специфічно для будь-якої платформи чи фреймворку.

"Замінити" має особливе значення в ООП та Objective-C. На жаль, ви, мабуть, маєте на увазі щось інше: "Як запобігти синтезу геттера і замість цього застосувати його вручну?" Якщо я правильно вас тлумачу, ви прийняли неправильну відповідь.
Микола Руе

2
@ user142019: Чому це важливо?
Стюарт Макдональд,

Відповіді:


55

Всередині визначення властивості ви можете вказати способи отримання та встановлення наступним чином:

@property (nonatomic, retain, getter = getterMethodName, setter = setterMethodName) NSString *someString;

Ви можете вказати лише геттер, лише сетер або обидва.


Як вказати тільки getter / only setter?
Педро Роло,

У моєму проекті Xcode мені не потрібно @synthesize someString, як в цьому випадку я можу встановити його значення? Помилка Xcode говорить, що це незадекларована власність. Thx
містер Френк,

5
@ Mr.Frank: Xcode тепер автоматично синтезує властивості за замовчуванням. Це було додано в одній з версій Xcode (4.5?). Отже, в основному, вам більше не потрібно використовувати @synthesizeсвої змінні, вам просто потрібно @property, і там вам просто потрібно вказати ваш getter та / або setter.
matsr

76

Просто впровадіть метод вручну, наприклад:

- (BOOL)myBoolProperty
{
    // do something else
    ...
    return myBoolProperty;
}

Тоді компілятор не генерує метод отримання.


12
Зверніть увагу , що якщо ваш @propertyє atomic(за замовчуванням), ви не можете правильно підмішувати @synthesized геттер / сетер з ручним письмового геттер / сетер.
bbum

12
Боїшся чого? atomicНЕ що корисно; це нічого не гарантує цілісність даних у різьбовій програмі. Це просто запобігає виходу програми з ладу через очевидний стан перегонів. Якщо ви сильно покладаєтесь atomic, ви майже впевнено робите це неправильно ... :)
bbum

2
@bbum: чи можете ви детальніше пояснити, що ви маєте на увазі під словами "ви не можете правильно змішати синтезований геттер / сеттер із ручно записаним геттером / сеттером", коли властивість атомна? Я не розумію, яке відношення має один до іншого. Дякую.
Оле Бегеманн

6
Звичайно; stackoverflow.com/questions/588866/… може бути корисним. Зокрема, оскільки механізм блокування для реалізації atomicне виставлений, ви ніяк не можете вручну реалізувати лише сеттер або лише геттер і забезпечити атомність за допомогою @synthesized atomicсеттера / геттера.
bbum

1
якщо ви напишете метод getter таким чином, чи буде властивість автоматично читатися лише для читання? якщо ні, де зберігаються дані, якщо властивості присвоєно значення?
matthias_buehlmann

43

Просто впровадьте власний геттер, і компілятор його не генерує. Те саме стосується сетера.

Наприклад:

@property float value;

еквівалентно:

- (float)value;
- (void)setValue:(float)newValue;

10

Я просто хочу додати, я не зміг замінити властивість BOOL за допомогою getter / setter, поки не додаю це:

@synthesize myBoolProperty = _myBoolProperty;

отже, повний код:

у файлі заголовка:

@property  BOOL myBoolProperty;

у файлі реалізації:

@synthesize myBoolProperty = _myBoolProperty;


-(void)setMyBoolProperty:(BOOL) myBoolPropertyNewValue
{
    _myBoolProperty = myBoolPropertyNewValue;
}

-(BOOL) myBoolProperty
{
    return _myBoolProperty;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.