По большей части ваш код правильный.
+initWithBytes:length:
скопирует отправленный буфер, поэтому вам не нужно беспокоиться об освобождении буфера после данных, вы можете сначала безопасно освободить данные.
Согласно документации, вы НЕ освобождаете данные после того, как с ними покончено:
Если вы указываете ненулевые значения для buffer_ptr или size_ptr, значения возвращаются в
эти переменные действительны только до тех пор, пока вы не освободите вновь созданные данные отправки
объект. Вы можете использовать эти значения как быстрый способ доступа к данным нового
объект данных.
Вы просто отпускаете переменную new_data_file
(ARC не сделает этого за вас).