Objective-C:自定义BOOL访问器(getter& setter)方法

时间:2011-05-03 15:36:54

标签: objective-c custom-attributes boolean accessor

我知道有人已经问过Writing getter and setter for BOOL variable。但是,如果我正在定义一个定制的吸气剂和放大器setter方法setImmediate& isImmediate,我也希望passcode.immediate = NO能够工作。

我没有任何实例变量,但也许我应该?我可以为NSDate *lastUnlocked添加一个。

到目前为止,这是相关的代码:

// PasscodeLock.h

extern NSString *const kPasscodeLastUnlocked;

@interface PasscodeLock : NSObject {

}

- (BOOL)isImmediate;
- (void)setImmediate:(BOOL)on;

- (NSDate *)lastUnlocked;
- (void)resetLastUnlocked;
- (void)setLastUnlocked:(NSDate *)lastUnlocked;

@end


// PasscodeLock.m

#import "PasscodeLock.h"

NSString *const kPasscodeLastUnlocked    = @"kPasscodeLastUnlocked";

@implementation PasscodeLock

#pragma mark PasscodeLock

- (BOOL)isImmediate {
    return self.lastUnlocked == nil;
}

- (void)setImmediate:(BOOL)on {
    if (on) {
        [self resetLastUnlocked];
    } else {
        self.lastUnlocked = nil;        
    }
}

- (NSDate *)lastUnlocked {
    return [[NSUserDefaults standardUserDefaults] objectForKey:kPasscodeLastUnlocked];
}

- (void)resetLastUnlocked {
    NSDate *now = [[NSDate alloc] init];
    self.lastUnlocked = now;
    [now release];
}

- (void)setLastUnlocked:(NSDate *)lastUnlocked {
    [[NSUserDefaults standardUserDefaults] setObject:lastUnlocked forKey:kPasscodeLastUnlocked];
}

然后,在一个以PasswordLock *passwordLock作为实例变量的视图控制器中,我想做passcode.immediate = NO,但是我在“PasscodeLock *”类型的对象上找不到“属性'立即'的错误”“。

如何让passcode.immediate = NO工作?

3 个答案:

答案 0 :(得分:10)

你需要像

这样的东西
@property (nonatomic, getter=isImmediate) BOOL immediate;
您的.h文件中的

,当然还有.m文件中的@synthesize语句。这将创建属性AND并定义您的getter方法名称。

答案 1 :(得分:6)

在@interface中声明这样的属性:

@interface PasscodeLock : NSObject {

}
@property(dynamic, getter=isImmediate,
                   setter=setImmediate:) BOOL immediate;
// etc.
@end

setter=部分是可选的)

答案 2 :(得分:3)

我认为问题在于你的getter和setter名称不一致。默认情况下,如果你有

foo.immediate

在您的代码{4}中,getter和setter分别命名为-immediate-setImmediate:。您的getter未正确命名。 最好的方法是声明一个属性,Mark和Kenny已经说过但你可以也改变你的getter的名字。

关键是你没有需要声明的属性来使用点语法,但如果你打算使用点语法,那么声明的属性是声明getter和setter的推荐方法。