Когда эти объекты будут выпущены в рамках ARC? - PullRequest
3 голосов
/ 30 декабря 2011

У меня есть несколько вопросов об ARC (автоматический подсчет ссылок):

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 *url = [[NSURL alloc] initWithString:@"/something"];
url = nil;
//Question 4: What about this?

1 Ответ

5 голосов
/ 30 декабря 2011
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 кедаете его сами), объект немедленно умрет.

...