Я не знаком с объективным c++, и вот мой вопрос: предположим, у меня есть класс
class MyTestClass
{
public:
int memLength_;
char *mem;
MyTestClass(int memLength)
{
memLength_ = memLength;
mem = new char[memLength_];
}
~MyTestClass()
{
delete []mem;
}
}
Теперь я хочу создать объект MyTestClass
с помощью Objective c++, и я сделал следующее:
@interface ObjectRetriever : NSObject
+ (MyTestClass)ObtainMyTestClass; // Function 1
+ (MyTestClass*)ObtainMyNextTestClass; //Function 2
@end
+(MyTestClass)ObtainMyTestClass
{
int memLen = 100;
MyTestClass myClass(memLen)
return myClass;
}
+ (MyTestClass*)ObtainMyNextTestClass
{
MyTestClass *myClassPtr;
myClassPtr = new MyTestClass(memLen)
return myClassPtr;
}
Поэтому, когда я использую ObjectRetriever
для создания объекта MyTestClass
, я сделаю так
MyTestClass testClassObject1 = [ObjectRetriever ObtainMyTestClass];
MyTestClass *testClassObjectPtr2 = [ObjectRetriever ObtainMyNextTestClass];
Теперь мои вопросы заключаются в следующем:
ObtainMyTestClass
и ObtainMyNextTestClass
, какой из них лучше?Благодарю.
Во-первых, короткие ответы на ваши конкретные вопросы
Если я реализую и использую класс таким образом, у меня будет опасность утечки памяти?
Да. Если вы не удалите [] массив int в будущем, он будет потерян. Кроме того, во второй (указатель) реализации вы можете дополнительно потерять экземпляр MyTestClass.
ObtainMyTestClass и ObtainMyNextTestClass, какой из них лучше?
ObtainMyTestClass, потому что нет никакой опасности потерять экземпляр MyTestClass.
Теперь длинная часть. Главная проблема в том, что мне непонятно, чего вы действительно хотите. Заголовок вопроса предполагает, что вы хотите четко управлять (т.е. сохранять/освобождать) свои данные. Однако в описании вы указываете, что данные управляются вручную пользователем вашего класса, и вы хотите его таким образом. Затем в примерах кода вы пытаетесь сделать смесь обоих (инициализация массива выполняется автоматически ObjectRetriever, удаление массива зависит от пользователя). Итак, вот мои предложения:
a) Если вы хотите, чтобы управление памятью было до пользователя, вам не нужен класс Objective-C Wrapper. Когда вы используете Objective- C++, вы можете использовать MyTestClass точно так же, как в C++, например, в вашем втором блоке кода.
b) Если вы хотите безопасное управление памятью, и вы не можете или не хотите изменять MyTestClass, я предлагаю обернуть создание и удаление массива int в init и dealloc объекта ObjC. Это должно работать с ARC или без него.
@interface TestClassWrapper :NSObject{
int* array;
}
-(MyTestClass) getTestClass;
@end
@implementation TestClassWrapper
-(id)init{
if(![super init])return nil;
array=new int[100];
return self;
}
-(void)dealloc{
delete[] array;
[super dealloc];
}
-(MyTestClass)getTestClass{
return MyTestClass(100,array);
}
}
@end
c) Если вы хотите безопасное управление памятью, а вы можете и хотите изменить MyTestClass, я предлагаю переписать MyTestClass, чтобы не требовать управления внешней памятью.