3

我在编译 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 属性应用于非变量对象?

4

1 回答 1

13

您不能拥有__block实例变量,因为它完全没有必要。

也就是说,当你这样做时:

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

该块正在捕获一个不可变的、保留的、对selfiVar 的间接引用和引用,因此,__block由于该变量既不是 const 复制的也不是只读的,因此什么也不做。

顺便说一句,这也是为什么在 ARC 下,您在使用 iVar 时可能会收到“循环引用”警告。

注意:我们试图在定义块语法时考虑一种表示这种微妙之处的语法,但我们决定,除非有任何明显的(没有明显的),否则 ARC 环境和/或 LLVM 的改进内存管理分析静态分析器使它变得不必要。

于 2012-05-12T18:23:27.713 回答