2011-08-23 55 views
0

TaskNSManagedObject后代。它有一个ivar checkedcheckedNSNumber的类型,它包含BOOL值。布尔值自定义访问器

工作访问:

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

但我想somethink这样的:

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];。它仍然崩溃。哪里不对?谢谢。

回答

3

self.checked相当于[self checked]。所以-(BOOL)checked被卡在一个无限循环调用自己。

使用NSNumber *访问器而不是基本访问器的好处是,您可以确定属性是已设置为true还是false,或者根本没有设置。在这种情况下,它可能并不重要,但通常它可能是有用的信息。

核心数据动态生成的访问器给你,所以我建议是这样的:

@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 
+0

嗯......我希望它会覆盖自动生成的访问器。您的解决方案不像我想要的那么甜蜜,但如果这只是方法,那么比谢谢! – user500

+0

你可能可以直接使用你的代码,但用'self.checked'代替'[self primitiveChecked]',它应该可以正常工作。我只是不喜欢重写自动访问器。 – sbooth

1

你不想创建原始的存取,但定制存取。但是,您还应该声明原始访问器。尽管它可以与valueForKey:setValue:forKey:一起使用,但根据Apples文档,原始访问器比KVC快很多。

在你Task.h文件中声明:

@property (nonatomic, assign) BOOL checked; 

在您的实现申报原始的存取方法:

@interface Task (PrimitiveAccessors) 
- (void)setPrimitveChecked:(NSNumber *)value; 
- (NSNumber *)primitiveChecked; 
@end 

最后实现自定义的存取方法:

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

- (BOOL)checked 
{ 
    [self willAccessValueForKey:@"checked"]; 
    flag = [[self primitiveChecked] boolValue]; 
    [self didAccessValueForKey:@"checked"]; 

    return flag; 
} 

你现在可以访问并设置您的已检查属性作为布尔值。