Нет, это неправильно; если метод не содержит «alloc», «copy», «new» или одно из других ключевых слов, которое подразумевает, что объект будет принадлежать invoker, метод возвращает автоматически освобожденный или иным образом управляемый объект, поэтому stringByAppendingPathComponent возвращает автоматически освобожденную строку .
Кроме того, ваш метод «copyData» содержит слово «copy», означающее, что результат должен принадлежать (и освобождаться) вызывающей стороне. Тем не менее, возвращенный вами результат был автоматически выпущен, следовательно, выдается сообщение об ошибке. Если вы хотите исправить ошибку, не делайте авто-релиз. То есть:
return [path retain]
Конечно, это подразумевает, что вызывающие ваши функции должны освободить их. Кроме того, вы можете изменить название своей функции, чтобы она соответствовала рекомендациям по управлению памятью.
Название "copyData", ИМХО, все равно не интуитивно понятно. Я бы предложил вам переименовать вашу функцию в «pathToSavedDataWithData» или тому подобное. То, что говорит о том, что он на самом деле делает.