注意:在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掉,否则你有大麻烦了,在我这边是线程堵死了;
网友评论