Iphone @property的自定义设置器?

Iphone @property的自定义设置器?,iphone,objective-c,ios,Iphone,Objective C,Ios,合成以下属性后,如何使用自定义setter @property (nonatomic,retain) UIButton *but 实施 - (void)setBut:(UIButton *)aButton; 它应该看起来像 - (void)setBut:(UIButton *)aButton { [but release]; but = [aButton retain]; // whatever } @萨沙几乎是对的,但他的代码中有一个小错误;) 它看起来可能是:

合成以下属性后,如何使用自定义setter

@property (nonatomic,retain) UIButton *but 
实施

- (void)setBut:(UIButton *)aButton;
它应该看起来像

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

@萨沙几乎是对的,但他的代码中有一个小错误;)

它看起来可能是:

(A)

或B)

(A) 是(非常)稍微更有效,(B)更可读


为什么我们需要选项(A)中的if语句,而不仅仅是@Sascha答案中的release&retain

如果将同一对象传递两次会发生什么情况

i、 e

如果我们没有检查
但是
不是一个不同的对象,那么我们在setter中要做的第一件事就是
释放它。然后,我们将尝试
保留一个不再存在的对象,从而导致崩溃

注意:我们不需要选项(B)中的if语句,因为自动释放不会立即释放按钮,因此我们有时间在不释放按钮的情况下再次保留按钮。

A B+)deanWombourne解决方案的替代方案:

-(void)setBut:(UIButton *)value {
    [value retain]
    [but release];
    but = value;
}
-(void)setBut:(UIButton *)value {
    if (but != value) {
        [value retain]
        //insert here but's cancel, invalidate, delegate = nil, ...
        [but release];
        but = value;
    }
}
此解决方案将防止值是but的子对象的问题

deanWombourne解决方案的A+替代方案:

-(void)setBut:(UIButton *)value {
    [value retain]
    [but release];
    but = value;
}
-(void)setBut:(UIButton *)value {
    if (but != value) {
        [value retain]
        //insert here but's cancel, invalidate, delegate = nil, ...
        [but release];
        but = value;
    }
}
此解决方案将防止值是but的子对象的问题。
它将允许您为NSURLConnection添加
cancel
,为NSTimer或NSPort添加
invalidate
为NSTimer或NSPort,为委托添加nil,

我相信@synthesisted setters就是这样做的,它在所有情况下都能工作,无论您是否分配相同的对象:

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

就我所见,不会出错。

另请注意,正如Sascha指出的,如果您提供自定义setter,则您需要自己释放/保留引用。请注意,自定义getter和setter与普通选择器类似,因此您的setter:必须有尾随冒号
-(void)setBut:(UIButton *)value {
    if (but != value) {
        [value retain]
        //insert here but's cancel, invalidate, delegate = nil, ...
        [but release];
        but = value;
    }
}
- (void)setBut: (UIButton*)aButton
{
    id oldObject = but;
    but = [aButton retain];
    [oldObject release];
}