在具有ARC的void *指针中分配Objective-C对象
发布时间:2020-12-16 03:06:56 所属栏目:百科 来源:网络整理
导读:我需要在C#中指定一个Objective C对象.此结构体在外部库中定义,我无法更改定义. 我们假定它定义为: struct c_context { void* user_data;}; 我在代码中需要做的是这样的: struct c_context *context;...context-user_data = [[MYObjCClass alloc] init];
我需要在C#中指定一个Objective C对象.此结构体在外部库中定义,我无法更改定义.
我们假定它定义为: struct c_context { void* user_data; }; 我在代码中需要做的是这样的: struct c_context *context; ... context->user_data = [[MYObjCClass alloc] init]; 但是,我需要确保MYObjCClass对象将被保留. 所以我的问题是: >如何转换(或桥接)它无效*告诉编译器保留obj-c对象? 解决方法
You cannot use ARC to manage an object in a struct.您有责任手动跟踪其内存管理.你不鼓励以这种方式存储对象.
如果您必须以这种方式跟踪内存,则必须告诉ARC,当您将其放入结构体时,您将对该对象承担责任: context->user_data = CFBridgingRetain([[MYObjCClass alloc] init]); 这告诉ARC,它不再对init返回的对象负责,并添加了手动保留,以便context-> user_data现在是所有者. 完成对象后,您可以将其传回ARC,或者将其释放.将其传回ARC: MYObjCClass *something = CFBridgingRelease(context->user_data); context->user_data = NULL; 这告诉ARC它负责该对象并删除您的保留.您应该使指针为空,因为context-> user_data不再拥有此对象,并且对象可能随时消失. 你也可以直接发布它: CFRelease(context->user_data); context->user_data = NULL; 再次,这是最后的手段.一般来说,您不应该在结构体中存储ObjC对象,因为ARC无法管理它们. 作为一个附注,虽然我通常不推荐ObjC,可以使用具有析构函数的C struct来自动化.在某些情况下,这可能优于C手动内存管理 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |