目标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)...
区块崩溃。这可能吗?谢谢!
答案 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];