Ios 块中的块不’;不执行

Ios 块中的块不’;不执行,ios,objective-c,grand-central-dispatch,Ios,Objective C,Grand Central Dispatch,我有一个带有-updateUI方法的ViewController。在AVPlayer播放时,需要定期调用它 这是in-viewDidLoad(注意,self.track不是AVPlayer实例,它是类track的实例,使用的方法与AVPlayer几乎相同): 这是Track类中此方法的实现: - (void) addPeriodicTimeObserverForInterval:(CMTime)interval queu

我有一个带有-updateUI方法的ViewController。在AVPlayer播放时,需要定期调用它

这是in-viewDidLoad(注意,self.track不是AVPlayer实例,它是类track的实例,使用的方法与AVPlayer几乎相同):

这是Track类中此方法的实现:

- (void) addPeriodicTimeObserverForInterval:(CMTime)interval
                                      queue:(dispatch_queue_t)queue
                                 usingBlock:(void (^)(void))block
{
        self.periodicObserverBlock = block;
        self.observeQueue = queue;
        self.observeInterval = interval;
        self.waitingToObserve = YES;
}
财产申报:

typedef void(^observeHandler)();
@property (nonatomic, strong) observeHandler periodicObserverBlock;
@property (nonatomic) CMTime observeInterval;
@property (nonatomic) dispatch_queue_t observeQueue;
我把它留着等AVPlayer准备好的时候用。准备好后,我会这样做:

- (void) afterLoadingMethod
{
        __weak Track *selfWeak = self;
        [self.player addPeriodicTimeObserverForInterval:self.observeInterval
                                                  queue:self.observeQueue
                                             usingBlock:^(CMTime t){
                                                 (void) selfWeak.periodicObserverBlock;
                                                 NSLog(@“THIS BLOCK EXECUTES”);
                                             }];
}
问题是说-updateUI的块没有执行。(它用NSLog(@“THIS BLOCK not EXECUTE”)标记)。在Track类中调用的块会执行。所以我认为问题出在存储属性的某个地方,这里的某个地方

self.periodicObserverBlock = block;
或在此:

@property (nonatomic, strong) observeHandler periodicObserverBlock;
但我没弄明白。
提前感谢。

您只是在引用块:

(void) selfWeak.periodicObserverBlock;
要调用块,请使用括号:

selfWeak.periodicObserverBlock();

Timothy搞定了。顺便说一句,如果
selfWeak
periodicObserverBlock
可能是
nil
,那么在调用此块之前,您应该检查以确保这一点,因为与向对象发送消息不同,调用
nil
块会使您的应用程序崩溃。此外,请确保您正确处理竞态条件。另外,苹果建议将块属性定义为
copy
,而不是
strong
。谢谢你的建议!我不知道copy。在这种情况下,getter总是会返回块的副本吗?那么
selfWeak
怎么可能为零呢?它是从
self
分配的。如果
self
nil
,那么该方法将永远不会被使用即使执行了.Re
copy
,也会显示:"注意:您应该将
copy
指定为属性属性,因为需要复制块以跟踪其原始范围之外的捕获状态。使用自动引用计数时,您不必担心这一点,因为它会自动发生,但最好将属性属性结果行为如何。“关于自我弱,需要担心的场景是块启动或被分派到一个队列,而对象被释放到另一个队列的竞争条件。也许编写代码是为了缓解这种情况,但实际上,
内存语义意味着”对象可以解除分配,并且此指针可以设置为
nil
”,因此您应该防范这种情况。每当您使用
变量编写代码时,您应该确保处理
nil
情况。感谢您的解释!事情变得非常复杂。。
selfWeak.periodicObserverBlock();