我们假定它定义为:
struct c_context { voID* user_data;};
我在代码中需要做的是这样的:
struct c_context *context;...context->user_data = [[MYObjcclass alloc] init];
但是,我需要确保MYObjcclass对象将被保留.
所以我的问题是:
>如何转换(或桥接)它无效*告诉编译器保留obj-c对象?
>当我需要清理数据时,如何释放对象?
如果您必须以这种方式跟踪内存,则必须告诉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手动内存管理
总结以上是内存溢出为你收集整理的在具有ARC的void *指针中分配Objective-C对象全部内容,希望文章能够帮你解决在具有ARC的void *指针中分配Objective-C对象所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)