如何在iOS 7中执行动态/计算属性

如何在iOS 7中执行动态/计算属性,ios,objective-c,ios7,properties,xcode5,Ios,Objective C,Ios7,Properties,Xcode5,刚开始用iOS7做iPhone编程,我发现简单的属性很难掌握。当人们发现关于它们的文档(官方或其他)时,很难辨别什么是相关的,什么不再相关,因为在过去的几个版本中事情已经发生了变化 我得到了基本的模式,例如 @property (strong, nonatomic) NSString *name; 我知道如果我想直接访问,我应该引用_name,但是在完成了属性之后,我可以/应该做self.name,这会变成[self-setName:…]或[self-name]之类的事情,我甚至可以实现它们来

刚开始用iOS7做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
。“方法”部分我得到了如何写作:

- (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;
}

我不知道的是,我在哪里添加了什么魔法酱,这样我就可以使用
self.status
self.status=@{}
?在iOS 7/Xcode 5中。我不需要将此虚拟/复合属性设置为KVO'able。

只需添加

@property (strong, nonatomic) NSDictionary* status;
连接到接口。因为您已经为属性实现了setter和getter, 编译器不创建任何访问器方法(也不创建备份实例变量)
\u status
),您的方法将被调用。

为什么不添加一个
属性

@property NSMutableDictionary *status;
您可以将
属性
声明视为等同于声明两个
点访问器
方法

关于
点表示法
消息表示法
的优点,目前正在进行讨论。您可能想看看:

但我不想要/不需要任何与之相关的内存。我不需要/不希望一个身份证奇迹般地出现。如果我按照你的建议去做,这不会发生吗?@TravisGriggs:不会(我只是在答案中加了这个)。如果两个访问器都实现了,那么编译器不会为该属性创建ivar。那么是什么触发编译器添加支持变量呢?它如何区分什么时候做和不做?@TravisGriggs:如果没有提供所有必需的访问器方法,编译器将创建ivar。对于只读属性:如果未提供getter。对于读写属性:如果未提供getter和setter。@TravisGriggs:您可以使用
@synthetic prop=\u prop如果您提供了所有必需的访问器方法,但需要支持ivar。-关于
@dynamic
,没有任何变化。它表示将在运行时提供访问器(例如,动态创建的核心数据访问器方法)。这样做可以隐式指定
@property(assign,atomic)
@property NSMutableDictionary *status;