Task
是 NSManagedObject
的后代。它有一个ivar checked
。 checked
是 NSNumber
的类型,它包装了一个 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/