在 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
在 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