Не похоже, что вы что-то сделали с момента вашего предыдущего вопроса , ТАК действительно требует от вас некоторых усилий.
Давайте пройдемся по исходному коду, чтобы, надеюсь, помочь понять проблемы:
Я думаю, что это более поздняя проблема Xcode (я использую Xcode 11), поскольку этот код был в порядке ранее в более старых версиях.
Это не проблема Xcode per se , ваш код всегда был неправильным, но, к счастью для вас, вы получили желаемый результат, просто улучшились сообщения об ошибках и предупреждениях.
const char* szPathName = [path UTF8String];
Эта строка занимает NSString
значение, на которое ссылается path
, вызывает для него метод UTF8String
, который возвращает указатель на строковое значение C, и сохраняет эту ссылку в szPathName
. Из Objective- C вы узнаете, что значение NSString
равно неизменяемому , вы не можете изменить символы в строке. Метод UTF8String
возвращает указатель на строковое значение константы C, поэтому szPathName
имеет тип const char *
- NSString
и const char *
- это типы в Objective- C и C соответственно для переменные, хранящие ссылки на постоянные строки; аналогично NSMutableString
и char *
- это типы для ссылок на изменяемые строки.
char* pos = strrchr (szPathName, '/');
Эта строка кода ищет крайний правый /
в строке C и возвращает указатель на него. Как вы узнали из своего последнего вопроса, strrchr()
в C ++ возвращает const char *
, если передано const char *
. Эта строка кода всегда была неправильной, но похоже, что более ранний компилятор не сообщал об ошибке, которая заключалась в том, чтобы ввести pos
в качестве указателя на изменяемую строку, которой не является. Точно так же, как присвоение значения NSString *
типизированной переменной NSMutableString *
в Objective- C не приводит к изменению указанной строки, присвоение значения const char *
типизированной переменной char *
в C не делает ссылка C строка изменяема.
*pos = 0;
Эта строка верна, поскольку тип pos
равен char *
, но также неверна, поскольку значение, хранящееся в pos
, является указателем на неизменяемая C строка.
Ваш код ранее работал, поскольку C слаб, когда дело доходит до изменчивости / неизменяемости, и, к счастью, записывается в C строку , хранящуюся внутри an экземпляр NSString
(см. документацию UTF8String
) не вызвал никаких проблем.
Вы не собираетесь решать вашу проблему, но добавление или удаление const
в различных местах может привести к появлению кода который работает, но может легко сломаться в любой момент. не зная C (++), вам лучше посмотреть, что этот код пытается сделать, и закодировать это как можно больше в Objective- C.
Итак, что такое цель кода?
- Начать с пути к файлу, хранящемуся в
path
, как NSString
значение - Определить родительскую папку / каталог этого файла
- Передать эту родительскую папку в качестве константы C строковое значение функции
CreateFaceFatted
У вас уже есть код для получения пути к файлу и сохранения его в path
, так что шаг 1 не требует работы.
Вы также знаете, как создать указатель на постоянную строку C из значения NSString
- используйте UTF8String
. Итак, шаг 3.
Остается шаг 2. Ваш текущий код пытается сделать это после преобразования в строку C, и вы не знаете, как это сделать. Но вы знаете Objective- C, есть ли метод / свойство на NSString
, которое принимает путь к файлу и возвращает путь к содержащей его папке / каталогу? Хорошим местом для поиска будет документация .
Надеюсь, это поможет вам разобраться в вашей проблеме и, следовательно, быстро найти решение.