Objective-C:自定义布尔访问器(getter和setter)方法
我知道有人已经问过了。但是,如果我分别定义自定义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
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
。