Ios 块中的块不’;不执行
我有一个带有-updateUI方法的ViewController。在AVPlayer播放时,需要定期调用它 这是in-viewDidLoad(注意,self.track不是AVPlayer实例,它是类track的实例,使用的方法与AVPlayer几乎相同): 这是Track类中此方法的实现: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
- (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
,那么该方法将永远不会被使用即使执行了.Recopy
,也会显示:"注意:您应该将copy
指定为属性属性,因为需要复制块以跟踪其原始范围之外的捕获状态。使用自动引用计数时,您不必担心这一点,因为它会自动发生,但最好将属性属性结果行为如何。“关于自我弱,需要担心的场景是块启动或被分派到一个队列,而对象被释放到另一个队列的竞争条件。也许编写代码是为了缓解这种情况,但实际上,弱
内存语义意味着”对象可以解除分配,并且此指针可以设置为nil
”,因此您应该防范这种情况。每当您使用弱
变量编写代码时,您应该确保处理nil
情况。感谢您的解释!事情变得非常复杂。。
selfWeak.periodicObserverBlock();