美文网首页
关于Core Foundation 对象的一点点探索

关于Core Foundation 对象的一点点探索

作者: 不辣先生 | 来源:发表于2019-01-25 10:21 被阅读12次

注意:在ARC机制下,Foundation的对象的内存不需要开发管理,Core Foundation则需要开发者自己管理或者转换为oc对象让ARC管理,但自己手动管理时,一定要注意引用计数。
先上两个大佬的链接:
__bridge,__bridge_transfer和__bridge_retained详解
attribute 总结

接下来就是写这个文章的原因:在相机回调里另起线程去处理有关buffer的逻辑的时候遇到了一点点问题:
一开始我的代码:

didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
       fromConnection:(AVCaptureConnection *)connection{
    
    _distanceFrame ++;
    if (_distanceFrame < 20 )return;
    __weak typeof (self)weakSelf = self;
    


    NSLog(@"sampleBuffer1:%@",sampleBuffer);
    dispatch_async(_recongnitonQueue, ^{
        
        NSLog(@"sampleBuffer2:%@",sampleBuffer);

你会发现sampleBuffer1的引用计数为1;sampleBuffer2为-1(至于为啥是-1,我也想知道,欢迎大佬留言指导);当时我是没有打印这个的,一运行就奔,心里一万头草泥马奔腾,what fuck !!!左思右想这个逻辑和线程都没啥问题,后面我打印了这两个buffer看了下,发现异步代码里的那个sampleBuffer2为-1,what fuck,因为CF对象用的不多,把CF对象的内存管理策略当做oc对象一样没管了,后来找了度娘,感觉CF对象还有这么多好玩的(坑)……
解决方案:

- (void)CaptureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
       fromConnection:(AVCaptureConnection *)connection{
    
    _distanceFrame ++;
    if (_distanceFrame < 20 )return;
    __weak typeof (self)weakSelf = self;
    
    CFRetain(sampleBuffer);

    NSLog(@"sampleBuffer1:%@",sampleBuffer);
    dispatch_async(_recongnitonQueue, ^{
        
        NSLog(@"sampleBuffer2:%@",sampleBuffer);

就是在需要调用的地方 retain一下,让引用计数+1,但是千万要注意用完了一定要release掉,否则你有大麻烦了,在我这边是线程堵死了;

相关文章

网友评论

      本文标题:关于Core Foundation 对象的一点点探索

      本文链接:https://www.haomeiwen.com/subject/taxmjqtx.html