5

我有 MeetingUser C++ 类;new_meetingUser 是它的对象。

我想将它添加到我使用 NSValue 所做的 NSMutableArray meetingUsersList。但是,我无法弄清楚如何处理对象的内存和 NSMutableArray 的所有权。

MeetingUser *new_meetingUser = new MeetingUser(userName, dispName );
[meetingUsersList addObject:[NSValue valueWithPointer:new_meetingUser]];
4

4 回答 4

3

您可以像这样将 C++ 对象添加到数组中,但数组不会获得该对象的所有权。您必须确保对象在数组中时不会被删除,否则它将成为一个悬空指针。然后,当您知道这样做是安全的时,您必须稍后手动删除该对象。

如果您希望数组拥有该对象的所有权,那么您将不得不使用CFMutableArray. CFMutableArray允许您指定在从数组中删除对象或释放数组时调用的函数。在您的情况下,您希望设置CFMutableArray调用 delete对象。

于 2012-06-07T05:57:32.750 回答
1

本质上,你不能。C++ 对象和 Objective-C 对象是完全不同的东西,尽管它们都被称为“对象”。NSArray 只能保存 Objective-C 对象。它不能保存原语、结构、C++ 对象或任何不是 Objective-C 对象的东西。最好的解决方法是创建一个包含 C++ 类的 Objective-C 类并将其存储数组中。

于 2012-06-07T05:58:04.710 回答
1

一种方法是编写一个小的 ObjC 类来包装您的 C++ 对象。这可以像您想要的一样简单或复杂 - 它需要做的唯一主要事情是将 C++ 对象存储在一个字段中,并将delete其存储在dealloc.

于 2012-06-07T05:58:49.747 回答
0

我有类似的问题

创建Objective C Wrapper类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];

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

于 2022-03-03T13:03:55.753 回答