实例变量问题的__block属性。

时间:2012-05-12 16:23:14

标签: objective-c ios objective-c-blocks

编译Objective-C类时遇到以下错误:

VideoView.h:7: error: __block attribute can be specified on variables only

此处是头文件的重要部分:

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
@interface VideoView :UIView{
@private
    __block AVPlayer *player;   
}
...

有没有解释为什么g ++认为我在非变量对象上应用__block属性?

1 个答案:

答案 0 :(得分:13)

您不能在实例变量上使用__block,因为它完全没必要。

即,当你这样做时:

^{
     someIvar = ....;
 }();

该块正在捕获对self的不可变的,保留的引用,并通过它间接引用iVar,因此,__block不执行任何操作,因为该变量既不是const复制也不是readonly。 / p>

顺便说一下,这也是为什么在ARC下使用iVar时最终会出现“循环引用”警告的原因。

注意:在定义块语法时,我们试着想出一种表示这一点微妙的语法,但是决定,除非有任何明显的(没有),改进的内存管理分析ARC环境和/或LLVM静态分析仪使其变得不必要。