在objective-c中,如果明确声明了属性的备份ivar,该怎么办?

时间:2016-07-29 02:12:24

标签: objective-c properties reactive-cocoa ivar

在ReactiveCococa 2.5中,RACMulticastConnection具有信号属性,这是 RACSignal ,而在其实现中,它具有ivar _signal ,这是一个 RACSubject 。我只是想知道信号的备份ivar是否是_signal,如何解释它?

好吧,似乎我的问题不明确,我在这里放了一些演示代码,希望有人能回答。

头文件:

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

impl文件:

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

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

2 个答案:

答案 0 :(得分:0)

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

即可
@synthesize propertyName = ivarName;

如果您不提供名称,则编译器会使用模板为您执行此操作:

@synthesize propertyName = _propertyName;

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

答案 1 :(得分:0)

  

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

也许......

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

留下两个主要是历史的选项:

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

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

附录:评论/问题编辑后

您对该问题的修改只是修复了第一个项目符号的上述答案(无@synthesize案例)。

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

请记住该属性为readonly,因此分配给它的唯一方法是在实现中使用_signal赋值,编译器将检查此类赋值是否具有{{1}类型}(或子类型)。

该类的客户端使用该属性读取值,并告知该值为RACSubject *类型,并且RACSignal *RACSubject的子类,因此一切都是类型正确的。

RACSignal用于ivar是一种改进实现中检查的方法 - 即属性返回RACSubject *但实现知道它将始终返回子类RACSignal *,为什么没有说明编译器会在没有情况时捕获案例吗?

为了演示编译器正在检查尝试更改RACSubject的类型,比如_signal,您将收到编译器错误,指出该类型不符合属性所需的类型。

HTH