Код, который вы опубликовали, верен.У любого сбоя есть другая причина.
Поскольку result
является сильной ссылкой за пределы области автоматического выпуска, ARC отвечает за поддержание его работоспособности при выходе из пула, и это так.Вам не нужно делать ничего особенного.
В частности, ARC генерирует код, эквивалентный следующему:
void *_arp = objc_autoreleasePoolPush();
temp1 = objc_retainAutoreleasedReturnValue([self stringByReplacingOccurrencesOfString:@"&" withString:@"&"]);
temp2 = objc_retainAutoreleasedReturnValue([temp1 stringByReplacingOccurrencesOfString:@"\"" withString:@"""]);
objc_release(temp1);
result = objc_retainAutoreleasedReturnValue([temp2 stringByReplacingOccurrencesOfString:@" " withString:@" "]);
objc_release(temp2);
// result is not released here
objc_autoreleasePoolPop(_arp);
return objc_autoreleaseReturnValue(result); // Result is returned autoreleased, or handed off to a matching objc_retainAutoreleasedReturnValue() in the caller.
Обратите внимание, что временные переменные обрабатываются с помощью objc_retainAutoreleasedReturnValue
/ objc_release
пар.Из-за оптимизации времени выполнения, реализованной objc_retainAutoreleasedReturnValue
и objc_retainAutoreleasedReturnValue
, это означает, что временные значения будут фактически освобождены немедленно, даже не помещаясь в пул автоматического выпуска , если -stringByReplacingOccurrencesOfString:
построен с ARC.Я думаю, что большинство системных фреймворков еще нет.