zhongwuzw / zhongwuzw.github.io

blog
https://zhongwuzw.github.io
0 stars 1 forks source link

Objective-C++之内存管理 | 钟武的技术博客 #11

Open zhongwuzw opened 6 years ago

zhongwuzw commented 6 years ago

https://zhongwuzw.github.io/2017/11/16/Objective-C-%E4%B9%8B%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/

zhongwuzw commented 6 years ago

In C++, struct does have destructor function, so it's compatible with ARC, and Objective-C objects can as a member of struct.

hanjianfei commented 6 years ago

您好 有个问题 C++子线程回调回oc方法,oc方法中申请的内存是怎么管理(在C++的子线程回掉回来的),是oc申请的就走arc c回调的参数变量的管理 走C的逻辑 是这样么?

zhongwuzw commented 6 years ago

@hanjianfei , 能上一段code么,展示一下C++回调OC方法,以及OC中申请内存的方式(malloc 还是alloc?),不是很理解。 😅

hanjianfei commented 6 years ago

没有code,我在想这个问题。 alloc的方式

zhongwuzw commented 6 years ago

@hanjianfei 我从字面意思理解一下,首先C++线程回调OC方法,既然是回调,我理解成把OC对象的实例方法当做函数指针?如果是这样的话,C++是无法回调OC方法的,因为调用OC方法需要向id对象发送消息,所以本身这一步就没法实现。 其次,不管是在什么情况下,OC创建的对象都是在堆上,且使用ARCMRC进行内存管理,所以比如C++StructOC成员,那么当Struct析构时,会向OC实例发送release消息。

hanjianfei commented 6 years ago

c++不能直接调用,可以在oc申请一个c方法,然后里边调用oc方法,看来原则还是谁申请,谁释放的问题啦

在 2018-03-01 18:18:16,"Wu Zhong" notifications@github.com 写道:

@hanjianfei 我从字面意思理解一下,首先C++线程回调OC方法,既然是回调,我理解成把OC对象的实例方法当做函数指针?如果是这样的话,C++是无法回调OC方法的,因为调用OC方法需要向id对象发送消息,所以本身这一步就没法实现。 其次,不管是在什么情况下,OC创建的对象都是在堆上,且使用ARC或MRC进行内存管理,所以比如C++的Struct有OC成员,那么当Struct析构时,会向OC实例发送release消息。

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or mute the thread.

lipeji commented 6 years ago

您好,有一个将objective C对象传递给C++成员变量的问题。当在oc中调用:CppClass cppObject = new CppClass(int n, ObjcObject objcObject)时,发现CppClass的构造函数并不能将n和objcObject的值赋给CppClass的成员变量。这种方法从根本上行得通吗?如果在CppClass中定义一个static structure,然后在构造函数中可以成功给这个static structure的成员变量赋值。感觉上如果在oc中调用C++ new operator的话,new出来的对象的成员变量或者没有分配内存,或者因为某种原因不能被赋值。

zhongwuzw commented 6 years ago

@lipeji C++类中是可以保存ObjC对象作为成员的,我理解你是哪块写法可能有问题?

image