#ios #objective-c #c #unity3d
#iOS #objective-c #c #unity3d
Вопрос:
Я получаю ошибку malloc:
«свободный указатель не был выделен»
Я пытаюсь создать простой тестовый плагин iOS для Unity.
Файл H — это просто объявления, а файл M -:
const char* _getDayAsString(int day)
{
return [[DotWPlugin getDayAsString:day] UTF8String];
}
@implementation DotWPlugin
(NSString*)getDayAsString:(int)day
{
if(day == 0)
return @"Sunday";
else if(day == 1)
return @"Monday";
else if(day == 2)
return @"Tuesday";
else if(day == 3)
return @"Wednesday";
else if(day == 4)
return @"Thursday";
else if(day == 5)
return @"Friday";
else if(day == 6)
return @"Saturday";
else
return @"Invalid";
}
@end
Похоже, проблема в том, что я пытаюсь превратить NSString* в const char *, и ему это не нравится.
Комментарии:
1. Не совсем. Кажется, что вы пытаетесь
free()
вернутьconst char *
указатель. Не делайте этого. (О, и КСТАТИ, эта длинная цепочкаif
ужасна, вместо этого используйте массив. И не вызывайте свой методgetDayAsString:
,get
префикс зарезервирован для чего-то совершенно другого в Cocoa.)2. должен быть переключатель (), а не if/elseif
3. Сам код, оператор include the IF, в значительной степени не имеет значения. Я просто хотел убедиться, что у меня правильный синтаксис IF, поскольку я никогда раньше не использовал obc. Как только я выясню эту проблему, я заменю ее реальным кодом.
Ответ №1:
Согласно NSString
ссылке, UTF8String
метод:
Возвращаемая строка C является указателем на структуру внутри объекта string, срок службы которой может быть короче, чем у объекта string, и, безусловно, не будет иметь более длительного срока службы. Поэтому вам следует скопировать строку C, если ее необходимо сохранить вне контекста памяти, в котором вы вызвали этот метод.
В вашем случае NSString
возвращаемый getDayAsString:
методом освобождается при выходе из _getDayAsString()
функции. То есть, char*
возвращаемый UTF8String
методом, также освобождается.
В вашем _getDayAsString()
, пожалуйста, создайте копию строки с нулевым завершением, возвращаемой UTF8String
методом, и верните эту копию.
Комментарии:
1. Я попробовал: const char* str = [[DotWPlugin getDayAsString:day] UTF8String]; а затем вернул это, но это не сработало. Я понимаю, что мне нужно выделить память для указателя, но я не помню, как это сделать. C # сделал меня мягким в голове.
2. Спасибо. Я использовал метод malloc для создания нового символа *. Если есть лучший способ, пожалуйста, дайте мне знать, но на данный момент проблема решена.
3. Спасибо за это! Я работал с iOS 8 с Unity и столкнулся с этой проблемой. Приветствия! 1