Ответ, кажется, "нет", но если все, в чем Вы нуждаетесь, является типом, который может действовать как оба, можно использовать объединение:
union int_ptr_t {
int i;
void* p;
};
Вы можете использовать @property
и @synthesize
, как обычно, но предоставьте собственный сеттер или геттер (или оба), и они будут использоваться вместо этого. Обычно я делаю что-то вроде этого:
// Override the setter
- (void)setName:(NSString *)aName
{
if (name == aName)
return;
[name release];
name = [aName retain];
//custom code here
}
Когда я использую свойство set, оно вызывает мой собственный метод. Тем не менее, get все равно будет синтезирован.
Если вы предоставляете реализацию для сеттеров или получателей, она будет использовать ее вместо сгенерированной реализации. Несложно реализовать аспект "сохранения" геттеров и сеттеров, которые генерируются для вас компилятором при синтезе, поэтому вы можете просто написать свои собственные геттеры и сеттеры, я бы сказал, и продолжайте с этим.
Да, в объявлении @property вы можете указать методы получения и установки.
@property (readwrite,getter=privateGetFoo,setter=privateSetFoo:) NSObject * foo;
В ваших методах foo
и setFoo:
, вызовите [self privateGetFoo]
или [self privateSetFoo: f]
затем свой собственный код.
Объект также может установить наблюдателя на себя с помощью addObserver: forKeyPath: options: context:
.
Тем не менее, я не думаю, что любой из этих способов является очень чистым. Лучше написать свой собственный геттер / сеттер, как предлагали другие.