2011-07-27 56 views

回答

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

另请注意,正如Sascha指出的那样,如果您提供自定义setter,则需要您自行释放/保留参考。 – devios1

+0

请注意,自定义getter和setter与普通SELECTOR类似,因此yourSetter:必须有尾部冒号 – onmyway133

0

实施

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

它也许应该看起来像

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

@Sascha几乎是正确的,但他的代码中有一个微小的错误;)

它看起来像是:

A)

-(void)setBut:(UIButton *)value { 
    if (but != value) { 
     [but release]; 
     but = [value retain]; 
    } 
} 

或B)

-(void)setBut:(UIButton *)value { 
    [but autorelease]; 
    but = [value retain]; 
} 

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


为什么我们需要在选项(A)的if语句,而不是仅仅释放&保留@萨沙的回答?

如果您传入同一对象两次会发生什么?

// 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它。然后我们会尝试retain一个不存在的对象,导致崩溃。

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

1

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

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

该解决方案将防止出现问题,其中一个子对象。

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

-(void)setBut:(UIButton *)value { 
    if (but != value) { 
     [value retain] 
     //insert here but's cancel, invalidate, delegate = nil, ... 
     [but release]; 
     but = value; 
    } 
} 

该解决方案将防止出现问题,其中一个子对象。 它可以让你添加一个NSURLConnection的cancel,一个NSTimer或NSPort的invalidate,一个委托为零,...

0

我相信这是@synthesised制定者如何做到这一点,它适用于所有情况,无论您分配相同的对象与否:

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

不能出错,只要我能看到。

相关问题