objective-c – 在返回后使用NSOperationQueue延迟释放malloc’d
我正在使用NSInvocation来获取一些方法返回,不幸的是我似乎有泄漏,但是在我从NSInvocation返回之后无法弄清楚如何释放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; 回答 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; 解决方法
您可以从NSMutableData获取void *,就像您可以从malloc()获得一样,并且实质上将其转换为实例变量,以便分配的生命周期与实例的生命周期相关联.我从
Mike Ash开始就得到了这个技巧.我最近一直在做自己的一些NSInvocation.这是NSInvocation中的一个类别(当然,您应该使用自己的方法前缀):
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()认为它没有.因此,您会收到有关未分配它的错误. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |