iOS 7中如何创建动态/计算属性

4

我刚刚开始学习使用iOS 7进行iPhone编程,发现除了基本的使用方法,属性还有其他很难理解的部分。当我们查阅官方或非官方文档时,很难辨别哪些是相关的,哪些已经不再适用。因为属性在过去几个版本中也有所演变。

我理解了基本的用法模式,例如:

@property (strong, nonatomic) NSString *name;

我知道如果想要进行直接访问,应该引用_name。但是,已经定义了属性后,可以/应该使用self.name,并且会转换为类似于[self setName:…]或[self name]的东西,甚至可以实现它们以创建副作用,并且从中获得KVO行为。
今天我想要探索的新领域是拥有一个虚拟属性,这样当访问/设置时就可以使用点符号表示,但我将定义访问/设置方法。更具体地说,我有一个具有以下“正常”属性的对象:
@property (strong, nonatomic) NSDate* started;
@property (strong, nonatomic) NSDate* paused;
@property (assign, nonatomic) BOOL repeat;

我想添加一个status属性,它将返回/分配从那些值派生的NSDictionary。 "methods" 部分我知道如何编写:

- (NSMutableDictionary*) status {
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    if (self.started != nil)
        dict[@"started"] = self.started;
    if (self.paused != nil)
        dict[@"paused"] = self.paused;
    if (self.repeat)
        dict[@"repeat"] = @(YES);
    return dict;
}

并且

- (void) setStatus: (NSDictionary*) doc {
    self.started = doc[@"started"];
    self.paused = doc[@"paused"];
    self.repeat = doc[@"repeat"] != nil;
}

我不知道在哪里添加什么神奇的魔法,以便我只需使用self.statusself.status = @{}? 在iOS 7 / Xcode 5中,我不需要这个虚拟/复合属性可被KVO。

2个回答

15

只需添加

@property (strong, nonatomic) NSDictionary* status;

对于接口而言,由于您已经实现了属性的setter和getter方法,编译器将不会创建任何访问器方法(也不会有后备实例变量_status),而是调用您的方法。


但我不想/需要与之相关的任何内存。我不需要/想要一个状态ivar神奇地出现。如果我按照你的建议做,这种情况不会发生吗? - Travis Griggs
@TravisGriggs:不是(我刚刚把它添加到答案中)。如果两个访问器都被实现了,编译器就不会为该属性创建ivar。 - Martin R
那么是什么触发编译器添加支持变量的呢?它如何区分何时执行或不执行该操作? - Travis Griggs
6
如果未提供所有必需的访问器方法,编译器将创建实例变量。对于只读属性:如果没有提供getter。对于可读写属性:如果未提供getter和setter两者。 - Martin R
好的,我想灯泡已经亮了。接受即将到来。另外,我什么时候才会再使用其他特殊关键字(例如dynamic、synthesize等)?或者它们现在都已经过时了? - Travis Griggs
1
如果您提供了所有必需的访问器方法,但想要一个后备实例变量,则可以使用@synthesize prop = _prop;。-关于@dynamic方面没有任何变化。它表示访问器将在运行时提供(例如,Core Data动态创建访问器方法)。 - Martin R

3
为什么不直接添加一个属性呢:

@property NSMutableDictionary *status;

你可以把property声明看作声明两个点访问器方法的等价形式。
有一场关于点符号表示法消息表示法优点的持续讨论。你可能想要查看: 在声明属性时,点表示法与消息表示法之间的差异

这样做会隐式地指定 @property (assign, atomic) - kelin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接