CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:appPath];
//Question 1: Here, I would expect the NSURL object to be autoreleased and
//therefore the CFURLRef will also be available for “a while.” Is this correct?
Да, потому что это один и тот же объект.Меняется только тип;это все та же ссылка на тот же объект.
Тем не менее, ожидание того, что объект будет оставаться «доступным некоторое время» после того, как вы отпустили свое последнее владение им, хрупко.Если вы намерены продолжать использовать этот объект, владейте им как минимум так долго.Отпустите его, когда закончите, и не раньше.
url = NULL;
//Question 2: Will this cause the NSURL to be released immediately?
NSURL *url = [NSURL fileURLWithPath:appPath];
url = nil;
//Question 3: Does the “url = nil” result in an immediate release of the NSURL?
Да и нет.
Назначение сильной переменной (и переменные неявносильный, если не указано иное) немедленно освобождает предыдущее значение и сохраняет новое значение.Каждое назначение объекта NSURL заставляло объект быть сохраненным;каждое присвоение nil
вызывало освобождение ранее удерживаемого объекта.
Однако в обоих случаях объект URL мог быть автоматически освобожден fileURLWithPath:
.Этот авто-релиз, как всегда, наступает не раньше, чем конец пула авто-релизов, поэтому объект может продолжать жить до тех пор.Как правило, это не проблема, но иногда она может появиться, если вы делаете много объектов (например, в узком цикле).
Насколько вам известно, да, каждое назначениеиз nil
освобождает объект, который находился там ранее, выполняя и заканчивая вашу ответственность перед этим владельцем.
NSURL *url = [[NSURL alloc] initWithString:@"/something"];
url = nil;
//Question 4: What about this?
То же самое здесь: Ваше назначение освобождает объект.И поскольку в этом нет авто-релиза (вы alloc
кедаете его сами), объект немедленно умрет.