通过引用传递布尔值

时间:2014-01-09 03:25:36

标签: objective-c boolean pass-by-reference

目标c中是否可以通过引用传递布尔值?我有许多布尔属性需要管理,所以我想将这些值的切换封装到一个函数中,我可以从每个按钮单击事件中调用它。这是一个例子:

@interface MyViewController()
@property (nonatomic) BOOL *sendEmails;
@end

然后在UIButton点击事件中,我有这个方法调用:

[self updateEmailPreference:self.sendEmails button:self.noEmailsCheckBox];

调用此方法:

- (void) updateEmailPreference : (BOOL *) b
                        button : (UIButton *) button
{
    if (*b) {*b = NO;}
    else {*b = YES;}

    if (*b) {
        [button setBackgroundImage:[UIImage imageNamed:@"checked_checkbox"] forState:UIControlStateNormal];
    } else {
        [button setBackgroundImage:[UIImage imageNamed:@"unchecked_checkbox"] forState:UIControlStateNormal];
    }
}

但遗憾的是,这会在if (*b)...区块崩溃。这可能吗?谢谢!

2 个答案:

答案 0 :(得分:2)

可能做得更好:

@interface MyViewController()
@property (nonatomic) BOOL sendEmails;
@end

对于方法调用:

[self updateEmailPreference:&(self ->_sendEmails) button:self.noEmailsCheckBox];

方法仍然是:

- (void) updateEmailPreference : (BOOL *) b
                        button : (UIButton *) button
{
    if (*b) {*b = NO;}
    else {*b = YES;}

    if (*b) {
        [button setBackgroundImage:[UIImage imageNamed:@"checked_checkbox"] forState:UIControlStateNormal];
    } else {
        [button setBackgroundImage:[UIImage imageNamed:@"unchecked_checkbox"] forState:UIControlStateNormal];
    }
}

(请注意,对于要在call语句中使用的变量可能存在混淆。如果它是sa属性,则必须使用ivar引用而不是dot-qualified属性,并且ivar名称必须具有{ {1}}前缀与否取决于您的属性的声明方式。或者只使用局部变量,并根据需要将属性值复制到其中。)

答案 1 :(得分:1)

它很可能由于取消引用空指针而崩溃,你必须指向某个有效值

e.g。

@implementation MyViewController
{
    BOOL _sendEmailsVal;
}

- (BOOL *)sendEmails
{
    return &_sendEmailsVal;
}

if (*b) {*b = NO;}
else {*b = YES;}

可以替换为

*b = !*b;

实际上你不需要传递指针,它主要用于拥有多个返回值

@interface MyViewController()
@property (nonatomic) BOOL sendEmails;
@end

- (BOOL) updateEmailPreference : (BOOL) b
                        button : (UIButton *) button
{
    if (b) {
        [button setBackgroundImage:[UIImage imageNamed:@"checked_checkbox"] forState:UIControlStateNormal];
    } else {
        [button setBackgroundImage:[UIImage imageNamed:@"unchecked_checkbox"] forState:UIControlStateNormal];
    }
    return !b;
}

self.sendEmails = [self updateEmailPreference:self.sendEmails button:self.noEmailsCheckBox];