【发布时间】:2017-01-25 22:18:12
【问题描述】:
我之所以问,是因为我正在涉足一些复杂的块代码,我没想到下面的代码可以正常工作。
假设我们有一个 BOOL 属性,如下所示:
@property (nonatomic, assign) BOOL isCancelled;
它是自动合成的,没有自定义 getter,没有 setter,没有显式 ivar。
然后,有这段代码......完美运行
dispatch_async(queue, ^{
id result = block(&_isCancelled);
if (!_isCancelled) { ... }
}
但是,我希望它适用于 block() 调用,但不适用于 if,我认为它会捕获 _isCancelled 的值并将其保持为常量,而不是让它在整个执行过程中发生变异。尽管如此,在运行时,_isCancelled 的值在块内部/外部始终是一致的,就好像它实际上是 BOOL *
谁能解释这是怎么回事?
【问题讨论】:
-
在给定的代码中实际上没有使用任何属性,
_isCancelled只是一个普通的 ivar 尽管隐式声明。 -
同意,但因为它没有明确声明,我可以假设它被声明为指针而不是原语。这可以解释这种行为(除非我遗漏了什么)
-
属性的类型与后备ivar的类型相同。声明属性
BOOL isCancelled意味着将合成一个ivarBOOL _isCancelled。就是这样。 -
那么,为什么
_isCancelled不在块内保持 const 呢? -
@CatalinaM 为什么会这样?它是一个实例变量,而不是局部变量。该块实际上正在捕获
self。不是伊瓦尔。_isCancelled实际上意味着self->_isCancelled。见stackoverflow.com/questions/5807022/…
标签: objective-c properties ivar