ошибка malloc в плагине iOS

#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