Как я могу использовать пользовательский сеттер для следующего свойства после того, как я его синтезировал?
@property (nonatomic,retain) UIButton *but
Как я могу использовать пользовательский сеттер для следующего свойства после того, как я его синтезировал?
@property (nonatomic,retain) UIButton *but
@property (getter=yourGetter,setter=yourSetter:) UIButton *but;
@Саша почти прав, но его код имеет крошечную ошибку;)
Он будет выглядеть так:
А)
-(void)setBut:(UIButton *)value {
if (but != value) {
[but release];
but = [value retain];
}
}
или B)
-(void)setBut:(UIButton *)value {
[but autorelease];
but = [value retain];
}
(A) является (очень) немного более эффективным, (B) более читабельным.
Зачем нам нужен оператор if в опции (A), а не только выпуск и сохранение в ответе @Sascha?
Что произойдет, если вы дважды перейдете к одному и тому же объекту?
то есть.
// We set our button for the first time
UIButton *test = [UIButton alloc] init];
[self setBut:test];
[test release];
// Much later in the code, we set the button again
[self setBut:test];
Если мы не отметили, что but
не был другим объектом, первое, что мы сделали бы в нашем сеттере, это release
it. Затем мы попытаемся retain
объект, который больше не существует, вызывая сбой.
NB Нам не нужен оператор if в опции (B), потому что autorelease не будет немедленно выпускать кнопку, поэтому у нас есть время, чтобы сохранить ее снова, не будучи dealloc'd.
A B +) альтернатива решениям deanWombourne:
-(void)setBut:(UIButton *)value {
[value retain]
[but release];
but = value;
}
Это решение предотвратит проблемы, в которых значение является под-объектом, но.
An A +) альтернатива решениям deanWombourne:
-(void)setBut:(UIButton *)value {
if (but != value) {
[value retain]
//insert here but cancel, invalidate, delegate = nil, ...
[but release];
but = value;
}
}
Это решение предотвратит проблемы, когда значение является под-объектом, но.
И это позволит вам добавить cancel
для NSURLConnection, invalidate
NSTimer или NSPort, нуль для делегата,...
Выполнить
- (void)setBut:(UIButton *)aButton;
Вероятно, он должен выглядеть примерно так:
- (void)setBut:(UIButton *)aButton {
[but release];
but = [aButton retain];
// whatever
}
Я считаю, что это делают @synthesised seters, и он работает во всех ситуациях, независимо от того, назначаете ли вы один и тот же объект:
- (void)setBut: (UIButton*)aButton
{
id oldObject = but;
but = [aButton retain];
[oldObject release];
}
Не могу ошибиться, насколько я могу судить.