【问题标题】:In objective-c what if a property's backup ivar is declared explicitly?在objective-c中,如果明确声明了属性的备份ivar怎么办?
【发布时间】:2016-07-29 02:12:23
【问题描述】:

在 ReactiveCococa 2.5 中,RACMulticastConnection 有一个 signal 属性,它是一个 RACSignal,而在其实现中,它有一个 ivar _signal,这是一个RACSubject。我就是想知道信号的备份ivar是不是_signal,怎么解释?

好吧,看来我的问题不是很清楚,我这里放了一些demo代码,希望有人能解答。

头文件:

@interface RACMulticastConnection : NSObject
@property (nonatomic, strong, readonly) RACSignal *signal;
...
@end

impl 文件:

@interface RACMulticastConnection () {
    RACSubject *_signal;
    ...
}
...

还有一点,它的实现中没有 @synthesize 代码,众所周知,RACSubject 是 RACSignal 的子类。

【问题讨论】:

  • 你的问题一点都不清楚。

标签: objective-c properties reactive-cocoa ivar


【解决方案1】:

我只是想知道信号的备份 ivar 是不是 _signal

也许……

  • 如果实现文件有任何形式的no @synthesize signal,则该属性是自动实现的(标准方法),并且 ivar _signal 将用作支持变量。如果没有 ivar _signal,则会自动创建一个。

剩下两个主要是历史选项:

  • 如果有 @synthesize signal,那么将引入 ivar signal 用作支持变量,并且声明的 ivar _signal 无论如何都不会与属性关联。

  • 最后,如果有@synthesize signal = _signal,那么ivar _signal 将用作支持变量。

附录:评论/问题编辑后

您对问题的编辑只是将上述答案修正为第一个项目符号(没有@synthesize 的情况)。

也许您担心属性的类型为RACSignal * 而ivar 的类型为RACSubject *

记住该属性是readonly,因此分配给它的唯一方法是在实现中使用对_signal的赋值,编译器将检查这样的赋值是否具有RACSubject *(或子类型)类型.

该类的客户端使用该属性读取值并被告知该值的类型为RACSignal *,因为RACSubjectRACSignal 的子类,所以所有内容都是正确的类型。

对 ivar 使用 RACSubject * 是一种改进实现中检查的方法 - 即,该属性返回一个 RACSignal * 但实现知道它将始终返回子类 RACSubject 所以为什么不这样说明编译器如果没有,会捕获案例吗?

为了证明编译器正在检查,尝试更改_signal 的类型,例如更改为NSArray,您将收到一个编译器错误,指出该类型不符合属性要求的类型。

HTH

【讨论】:

  • @Josscii - 见附录。 HTH
  • 好的,谢谢你的解释!当我第一次在这个源代码中看到这个时,我以前没有这样使用过,所以我想确保它是正确的以及它为什么有效。
【解决方案2】:

如果我正确理解您的问题,要为 ivar 提供明确的属性名称,只需添加

@synthesize propertyName = ivarName;

如果您不提供名称,那么编译器会使用模板为您完成:

@synthesize propertyName = _propertyName;

希望我回答了你的问题。

【讨论】:

    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 2014-03-21
    相关资源
    最近更新 更多