在 NSMutableArray 中添加 c++ 对象



我有 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];

希望它作为一个快速示例有所帮助

最新更新