编译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属性?
答案 0 :(得分:13)
您不能在实例变量上使用__block
,因为它完全没必要。
即,当你这样做时:
^{
someIvar = ....;
}();
该块正在捕获对self
的不可变的,保留的引用,并通过它间接引用iVar,因此,__block
不执行任何操作,因为该变量既不是const复制也不是readonly。 / p>
顺便说一下,这也是为什么在ARC下使用iVar时最终会出现“循环引用”警告的原因。
注意:在定义块语法时,我们试着想出一种表示这一点微妙的语法,但是决定,除非有任何明显的(没有),改进的内存管理分析ARC环境和/或LLVM静态分析仪使其变得不必要。