Как обеспечить дополнительную пользовательскую реализацию методов доступа при использовании @synthesize?

Ответ, кажется, "нет", но если все, в чем Вы нуждаетесь, является типом, который может действовать как оба, можно использовать объединение:

union int_ptr_t {
    int i;
    void* p;
};
6
задан 19 September 2012 в 13:56
поделиться

3 ответа

Вы можете использовать @property и @synthesize , как обычно, но предоставьте собственный сеттер или геттер (или оба), и они будут использоваться вместо этого. Обычно я делаю что-то вроде этого:

// Override the setter
- (void)setName:(NSString *)aName
{
    if (name == aName)
        return;

    [name release];
    name = [aName retain];

    //custom code here
}

Когда я использую свойство set, оно вызывает мой собственный метод. Тем не менее, get все равно будет синтезирован.

5
ответ дан 17 December 2019 в 07:07
поделиться

Если вы предоставляете реализацию для сеттеров или получателей, она будет использовать ее вместо сгенерированной реализации. Несложно реализовать аспект "сохранения" геттеров и сеттеров, которые генерируются для вас компилятором при синтезе, поэтому вы можете просто написать свои собственные геттеры и сеттеры, я бы сказал, и продолжайте с этим.

1
ответ дан 17 December 2019 в 07:07
поделиться

Да, в объявлении @property вы можете указать методы получения и установки.

@property (readwrite,getter=privateGetFoo,setter=privateSetFoo:) NSObject * foo;

В ваших методах foo и setFoo: , вызовите [self privateGetFoo] или [self privateSetFoo: f] затем свой собственный код.

Объект также может установить наблюдателя на себя с помощью addObserver: forKeyPath: options: context: .

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

-2
ответ дан 17 December 2019 в 07:07
поделиться