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

ma1*_*w28 3 boolean objective-c accessor custom-attributes

我知道有人已经问过为BOOL变量编写getter和setter.但是,如果我定义自定义的getter和setter方法setImmediateisImmediate分别,我想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];
}
Run Code Online (Sandbox Code Playgroud)

然后,在具有PasswordLock *passwordLock实例变量的视图控制器中,我想这样做passcode.immediate = NO,但是我在"PasscodeLock*"类型的对象上找不到"属性'立即'的错误."

我怎么passcode.immediate = NO去上班?

Mar*_*off 10

你需要类似的东西

@property (nonatomic, getter=isImmediate) BOOL immediate;
Run Code Online (Sandbox Code Playgroud)

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

  • 非原子部分对于assign属性是多余的. (2认同)

ken*_*ytm 6

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

@interface PasscodeLock : NSObject {

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

(该setter=部分是可选的)


Jer*_*myP 3

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

foo.immediate
Run Code Online (Sandbox Code Playgroud)

在您的代码中,假设getter 和 setter 分别命名为-immediate-setImmediate:。您的 getter 命名不正确。解决这个问题的最好方法是像 Mark 和 Kenny 已经说过的那样声明一个属性,但你也可以更改 getter 的名称。

要点是,您不需要声明属性即可使用点语法,但如果您要使用点语法,则声明属性是声明 getter 和 setter 的推荐方法。