大佬教程收集整理的这篇文章主要介绍了objective-c – 在返回后使用NSOperationQueue延迟释放malloc’d void *,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在下面的实现中,我尝试使用在下一个运行循环中执行的块来释放它,但是由于未分配returnBuffer而导致崩溃.
为什么我不能在块中释放returnBuffer,如果它没有被分配,为什么它通过returnBuffer!= NULL?
这是一个与IMP混合有关的特殊方法,所以我不知道方法返回类型.将它放在NSData或其他东西是行不通的.
NSUInteger length = [[invocation methodSignature] methodReturnLength]; if(length!=0){ void* returnBuffer = (void *)malloc(length); [invocation getReturnValue:&returnBuffer]; if(returnBuffer!=NULL){ void(^delayedFreE)(void) = ^{ free(returnBuffer); }; [[NSOperationQueue mainQueue] addoperationWithBlock:delayedFree]; } return returnBuffer; } return nil;
回答
由于Josh的 – [NSMutableData mutableBytes]技巧,让它按以下方式工作
NSUInteger length = [[invocation methodSignature] methodReturnLength]; if(length!=0){ NSMutableData * dat = [[NSMutableData alloc] initWithLength:length]; void* returnBuffer = [dat mutableBytes]; [invocation getReturnValue:&returnBuffer]; void(^delayedFreE)(void) = ^{ [dat release]; }; [[NSOperationQueue mainQueue] addoperationWithBlock:delayedFree]; return returnBuffer; } return nil;
static char alLOCATIOns_key; - (void *) Wool_allocate: (size_t)size { NSMutableArray * alLOCATIOns = objc_getAssociatedObject(self,&alLOCATIOns_key); if( !alLOCATIOns ){ alLOCATIOns = [NSMutableArray array]; objc_setAssociatedObject(self,&alLOCATIOns_key,alLOCATIOns,OBJC_ASSOCIATION_RETAIN); } NSMutableData * dat = [NSMutableData dataWithLength: size]; [alLOCATIOns addObject:dat]; return [dat mutableBytes]; }
我不确定你发布的代码在哪里;如果你在自己的自定义类中,则不需要处理相关的对象位 – 只需将分配设置为ivar.
将此绑定到您的代码中:
NSUInteger length = [[invocation methodSignature] methodReturnLength]; if(length!=0){ void* returnBuffer = [self Wool_allocate:length]; [invocation getReturnValue:&returnBuffer]; return returnBuffer; } return nil;
如果使用关联的对象路由,则在此实例为时,将释放alLOCATIOns数组.否则,只需将[alLOCATIOns release]放入dealloc即可.
另外,要回答你提出的问题,而不仅仅是解决问题:free()不会对你没有从malloc()获得的任何指针进行操作.当指针在Block中使用时,我很确定它会被复制,所以你最终得到另一个指针 – 仍然指向同一个内存,但free()认为它没有.因此,您会收到有关未分配它的错误.
以上是大佬教程为你收集整理的objective-c – 在返回后使用NSOperationQueue延迟释放malloc’d void *全部内容,希望文章能够帮你解决objective-c – 在返回后使用NSOperationQueue延迟释放malloc’d void *所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。