示例代码中的AVFoundation.Framework中的静态void指针

时间:2013-06-05 09:48:56

标签: ios objective-c static avfoundation

我正在浏览AVFoundation.Framework的示例代码 - > AVSimpleEditoriOS&我发现以下一行我无法理解。

static void *AVSEPlayerItemStatusContext = &AVSEPlayerItemStatusContext;
static void *AVSEPlayerLayerReadyForDisplay = &AVSEPlayerLayerReadyForDisplay;

考虑以下

static void *AVSEPlayerItemStatusContext = nil;
static void *AVSEPlayerLayerReadyForDisplay = nil;

在上面的两行中,我可以看出那些是2个静态的void / generic指针,带有一些奇特的名字。

现在回到这两行,我再次粘贴它,

static void *AVSEPlayerItemStatusContext = &AVSEPlayerItemStatusContext;
static void *AVSEPlayerLayerReadyForDisplay = &AVSEPlayerLayerReadyForDisplay;

上述意思是,2个静态void / generic指针存储它自己的&为什么它需要在什么意义上呢?

我只需要很少的指导来学习这种编码模式。 等待知识。

1 个答案:

答案 0 :(得分:6)

自引用指针

static void *foo = &foo;

只是 一种在编译时创建唯一指针的方法

在该"AVSimpleEditoriOS"示例项目中,这些指针稍后用作<{p>}的context参数

[self addObserver:self forKeyPath:@"player.currentItem.status" options:NSKeyValueObservingOptionNew context:AVSEPlayerItemStatusContext];

[self addObserver:self forKeyPath:@"playerLayer.readyForDisplay" options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:AVSEPlayerLayerReadyForDisplay];

context参数的实际值根本不重要,它只是一些独特的 传递给

的值
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
     if (context == AVSEPlayerItemStatusContext) {
        // Notification for @"player.currentItem.status"
        // ...
     } else if (context == AVSEPlayerLayerReadyForDisplay) {
        // Notification for @"playerLayer.readyForDisplay"
        // ...
     } else {
        // Something else, pass to superclass:
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
}

(或者,可以检查keyPath中的observeValueForKeyPath参数。) 请参阅下面的@Bavarious'评论,了解为什么唯一的上下文指针通常比键路径字符串更受欢迎。