如何在 iOS 7 中执行动态/计算属性
Posted
技术标签:
【中文标题】如何在 iOS 7 中执行动态/计算属性【英文标题】:How to do a dynamic/computed property in iOS 7 【发布时间】:2014-02-21 19:37:32 【问题描述】:刚开始使用 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
。 “方法”部分我知道怎么写:
- (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'able。
【问题讨论】:
【参考方案1】:只需添加
@property (strong, nonatomic) NSDictionary* status;
到界面。由于您已经为该属性实现了 setter 和 getter,
编译器没有创建任何访问器方法(并且没有支持实例变量
_status
),然后调用你的方法。
【讨论】:
但我不想要/不需要任何与之相关的内存。我不需要/想要一个 _status ivar 神奇地出现。如果我按照你的建议做,这不会发生吗? @TravisGriggs:不(我只是将其添加到答案中)。如果实现了 both 访问器,则编译器不会为该属性创建任何 ivar。 那么是什么触发编译器添加支持变量呢?它如何辨别什么时候该做,什么时候不该做? @TravisGriggs:如果没有提供所有必需的访问器方法,编译器会创建 ivar。对于只读属性:如果没有提供 getter。对于读写属性:如果没有同时提供 getter 和 setter。 @TravisGriggs:如果您提供了所有必需的访问器方法,但想要支持 ivar,则可以使用@synthesize prop = _prop;
。 - @dynamic
没有任何改变。它表示访问器将在 运行时 提供(例如,Core Data 动态创建的访问器方法)。【参考方案2】:
为什么不添加一个property
:
@property NSMutableDictionary *status;
您可以认为property
声明等同于声明两个dot-accessor
方法。
关于dot notation
与message notation
的优点的讨论正在进行中。你可能想看看:
Dot notation vs. message notation for declared properties
【讨论】:
这样做你隐式指定@property (assign, atomic)
。以上是关于如何在 iOS 7 中执行动态/计算属性的主要内容,如果未能解决你的问题,请参考以下文章