Подтвердить что ты не робот

Пользовательский сеттер для @property?

Как я могу использовать пользовательский сеттер для следующего свойства после того, как я его синтезировал?

@property (nonatomic,retain) UIButton *but 
4b9b3361

Ответ 1

@property (getter=yourGetter,setter=yourSetter:) UIButton *but;

Ответ 2

@Саша почти прав, но его код имеет крошечную ошибку;)

Он будет выглядеть так:

А)

-(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.

Ответ 3

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, нуль для делегата,...

Ответ 4

Выполнить

- (void)setBut:(UIButton *)aButton;

Вероятно, он должен выглядеть примерно так:

- (void)setBut:(UIButton *)aButton {
    [but release];
    but = [aButton retain];
    // whatever
}

Ответ 5

Я считаю, что это делают @synthesised seters, и он работает во всех ситуациях, независимо от того, назначаете ли вы один и тот же объект:

- (void)setBut: (UIButton*)aButton
{
    id oldObject = but;
    but = [aButton retain];
    [oldObject release];
}

Не могу ошибиться, насколько я могу судить.