2011-08-23 56 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; 
} 

你現在可以訪問並設置您的已檢查屬性作爲布爾值。