Iphone @property的自定义设置器?
合成以下属性后,如何使用自定义setterIphone @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 } @萨沙几乎是对的,但他的代码中有一个小错误;) 它看起来可能是:
@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];
}