objective-c - Bool 值的自定义访问器

标签 objective-c ios core-data nsmanagedobject

TaskNSManagedObject 的后代。它有一个ivar checkedcheckedNSNumber 的类型,它包装了一个 BOOL 值。

工作权限:

BOOL chcecked = [task.checked boolValue];
task.checked = [NSNumber numberWithBool:YES];

但我想要这样的想法:

BOOL checked = task.checked;
task.checked = YES;

所以我用原始访问器做了类别:

@interface Task (PrimitiveAccessors)

- (void)setChecked:(BOOL)checked;
- (BOOL)checked;

@end


@implementation Task (PrimitiveAccessors)

- (void)setChecked:(BOOL)checked
{
    [self willChangeValueForKey:@"checked"];
    self.checked = [NSNumber numberWithBool:checked];
    [self didChangeValueForKey:@"checked"];
}

- (BOOL)checked
{
    [self willAccessValueForKey:@"checked"];
    BOOL returnValue = [self.checked boolValue];
    [self didAccessValueForKey:@"checked"];
    return returnValue;
}

@end

但它不起作用...我尝试了 BOOL checked = task.checked;BOOL chcecked = [task checked];。它仍然崩溃。怎么了?谢谢。

最佳答案

self.checked 等同于[self checked]。所以 -(BOOL)checked 陷入了一个无限循环调用自身。

使用 NSNumber * 访问器而不是原始访问器的好处是您可以确定该属性是否已设置为 true 或 false,或者根本没有设置。在这种情况下,这可能无关紧要,但总的来说,了解它可能是有用的信息。

Core Data 会为您动态生成访问器,所以我会推荐类似的东西:

@interface Task : NSManagedObject
{}

@property (nonatomic, retain) NSNumber * checked;

- (BOOL) taskIsChecked;
- (void) setTaskIsChecked:(BOOL)isChecked;

@end

@implementation Task
@dynamic checked;

- (BOOL) taskIsChecked
{
  return [self.checked boolValue];
}

- (void) setTaskIsChecked:(BOOL)isChecked
{
  self.checked = isChecked ? (NSNumber *)kCFBooleanTrue : (NSNumber *)kCFBooleanFalse;
}


@end

关于objective-c - Bool 值的自定义访问器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7160643/

相关文章:

ios - 在不使用 RootViewController 的情况下显示 UITabBar

objective-c - NSException 重复 NSTask 时

ios - 具有格式字符串的 NSDateFormatter 以短样式输出时间

ios - 通过填充 UIImageView 层的边框宽度的颜色来动画进度

ios - 核心数据保存错误

swift - 核心数据对多关系导致获取的结果 Controller 崩溃

iphone - 使用函数将项目添加到 NSMutableArray 不会导致任何结果

ios - 将数据从文本字段发送到可变数组

ios - 存储 paypal api 凭据的最佳和安全方式

core-data - 从 CoreData 迁移到 Realm