在 objective-c 中,如果显式声明 属性 的备份 ivar 会怎样?

In objective-c what if a property's backup ivar is declared explicitly?

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

好的,看来我的问题没说清楚,放了一些demo代码,希望有人能解答。

头文件:

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

impl 文件:

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

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

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

@synthesize propertyName = ivarName;

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

@synthesize propertyName = _propertyName;

我希望,我回答了你的问题。

I just wondered if the signal's backup ivar is the _signal

也许……

  • 如果实现文件有 no @synthesize signal 任何形式然后 属性 是自动实现(标准方法)和 ivar _signal 将用作支持变量。如果没有ivar _signal 那么会自动创建一个。

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

  • 如果有@synthesize signal那么会引入一个ivarsignal作为后备变量,声明的ivar_signal不会关联无论如何到 属性.

  • 最后如果有@synthesize signal = _signal那么ivar_signal将被用作后备变量。

附录:comment/question编辑后

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

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

记住 属性 是 readonly 所以唯一的赋值方式是在实现中使用对 _signal 的赋值,编译器会检查这样的赋值类型 RACSubject *(或子类型)。

class 的客户端使用 属性 读取值并被告知该值是 RACSignal * 类型,因为 RACSubject 是一个子class of RACSignal 所以一切都是正确的。

对 ivar 使用 RACSubject * 是一种在实现中改进检查的方法 - 即 属性 return 和 RACSignal * 但实现知道它会总是 return subclass RACSubject 所以为什么不声明这样编译器会在它不捕获的情况下捕获?

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

HTH