我刚刚开始学习使用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.status
和self.status = @{}
? 在iOS 7 / Xcode 5中,我不需要这个虚拟/复合属性可被KVO。
@synthesize prop = _prop;
。-关于@dynamic
方面没有任何变化。它表示访问器将在运行时提供(例如,Core Data动态创建访问器方法)。 - Martin R