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

Objective-C:自定义布尔访问器(getter和setter)方法,objective-c,custom-attributes,boolean,accessor,Objective C,Custom Attributes,Boolean,Accessor,我知道有人已经问过了。但是,如果我分别定义自定义getter和setter方法setImmediate和isImmediate,我希望passcode.immediate=NO也能工作 我没有任何实例变量,但也许我应该?我可以为NSDate*lastUnlocked添加一个 以下是到目前为止的相关代码: // PasscodeLock.h extern NSString *const kPasscodeLastUnlocked; @interface PasscodeLock : NSObj

我知道有人已经问过了。但是,如果我分别定义自定义getter和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*”的对象上找不到属性“immediate”


如何使
passcode.immediate=NO
工作?

在@interface中声明此类属性:

@interface PasscodeLock : NSObject {

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

(setter=部分是可选的)

您需要

@property (nonatomic, getter=isImmediate) BOOL immediate;

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

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

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


关键是,使用点语法不需要声明属性,但是,如果要使用点语法,则建议使用声明的属性来声明getter和setter。

为什么
-lastUnlocked
返回NSString,而
-setLastUnlocked:
获取NSDate?对于assign属性,非原子部分是多余的。谢谢。我刚刚将getter的名称从
-isImmediate
更改为
-immediate