我有 MeetingUser C++类;new_meetingUser是它的对象。
我想把它添加到NSMutableArray meetingUsersList中,这是我使用NSValue做的。但是,我无法弄清楚如何处理对象的内存和 NSMutableArray 的所有权。
MeetingUser *new_meetingUser = new MeetingUser(userName, dispName );
[meetingUsersList addObject:[NSValue valueWithPointer:new_meetingUser]];
您可以像这样将C++对象添加到数组中,但数组不会取得该对象的所有权。您必须确保对象在数组中时不会被删除,否则它将成为悬空指针。然后,当您知道这样做是安全的时,您必须稍后手动删除对象。
如果您希望数组获得对象的所有权,则必须使用 CFMutableArray
. CFMutableArray
允许您指定在从数组中删除对象或解除分配数组时调用的函数。在这种情况下,您希望将CFMutableArray
设置为在对象上调用delete
。
本质上,你不能。C++对象和Objective-C对象是完全不同的东西,尽管两者都被称为"对象"。NSArray 只能保存 Objective-C 对象。它不能容纳基元、结构、C++对象或任何其他不是 Objective-C 对象的东西。最好的解决方法是创建一个Objective-C类来包装C++类并将其存储在数组中。
一种方法是编写一个小的 ObjC 类来包装你的C++对象。这可以像您想要的那样简单或复杂 - 它唯一需要做的是将C++对象存储在字段中,并将其delete
dealloc
中。
我遇到了类似的问题
创建目标 C 包装类MeshHolder.hh
#import <Foundation/Foundation.h>
#include "Sculpt.h"
NS_ASSUME_NONNULL_BEGIN
@interface MeshHolder : NSObject
-(void) setupMesh:(Mesh_CPP *)mesh;
-(Mesh_CPP *)getMesh;
@end
NS_ASSUME_NONNULL_END
和。MM 文件
#import "MeshHolder.hh"
@implementation MeshHolder
Mesh_CPP * meshTEMP_;
-(void) setupMesh:(Mesh_CPP *)mesh {
meshTEMP_ = mesh;
}
-(Mesh_CPP *)getMesh {
return meshTEMP_;
}
@end
如何使用它
@property(strong,nonatomic) NSMutableArray<MeshHolder*> *arrMeshes;
MeshHolder *meshH = [MeshHolder new];
[meshH setupMesh:meshTemp];
[_arrMeshes addObject:meshH];
希望它作为一个快速示例有所帮助