2012-06-07 6 views
5

У меня есть MeetingUser C++ класс new_meetingUser является объектомДобавление C++ объект в NSMutableArray

Я хочу, чтобы добавить его в NSMutableArray meetingUsersList, который я сделал с помощью NSValue но я канты сделать, как обращаться память объекта и владение NSMutableArray.

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

ответ

4

Вы можете добавить объект C++ в такой массив, но массив не будет владеть объектом. Вы должны будете гарантировать, что объект не будет удален, пока он находится в массиве, иначе он станет свисающим указателем. Затем вам нужно удалить объект вручную позже, когда вы знаете, что это безопасно.

Если вы хотите, чтобы массив владел объектом, вам необходимо использовать CFMutableArray. CFMutableArray позволяет вам указывать функции, вызываемые при удалении объектов из массива или при освобождении массива. В вашем случае вы хотите установить CFMutableArray для вызова delete на объекты.

+0

Предостережение. Наличие массива удаления объектов может быть опасным, если могут быть другие ссылки на них. Это зависит от того, является ли это единственным способом, когда объекты могут быть добавлены в массив. – Chuck

+0

Caveat II: 'delete' не является функцией, поэтому вам придется написать функцию обратного вызова itty bitty, чтобы ее обернуть. – duskwuff

+0

Да. Если вы хотите, чтобы объект C++ считался ссылкой как обычный 'NSObject', вам, вероятно, понадобится создать класс-оболочку, который' delete 'является объектом в' dealloc', а затем добавляет объект-оболочку в 'NSMutableArray'. –

1

По существу, вы не можете. Объекты C++ и объекты Objective-C - это совершенно разные вещи, несмотря на то, что оба они называются «объектами». NSArray может содержать объекты Objective-C. Он не может содержать примитивы, структуры, объекты C++ или что-либо еще, что не является объектом Objective-C. Лучшим обходным решением является создание класса Objective-C, который обертывает ваш класс C++ и сохраняет , что в массиве.

1

Один из подходов - написать небольшой класс ObjC для переноса вашего объекта C++. Это может быть так же просто или сложнее, как вам нужно - единственное, что ему нужно сделать, это сохранить объект C++ в поле, а delete - в dealloc.

Смежные вопросы