【问题标题】:How to do a dynamic/computed property in iOS 7如何在 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.statusself.status = @{}?在 iOS 7 / Xcode 5 中。我不需要这个虚拟/复合属性是 KVO'able。

【问题讨论】:

    标签: ios objective-c ios7 properties xcode5


    【解决方案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 notationmessage notation 的优点的讨论正在进行中。你可能想看看: Dot notation vs. message notation for declared properties

    【讨论】:

    • 这样做你隐式指定@property (assign, atomic)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    • 2021-01-13
    相关资源
    最近更新 更多