release
на nil
- запрет, поэтому всегда хорошо.И он не протечет, так как у вас не было объекта для запуска.
UIImage* test = [UIImage alloc];
test
уже сам по себе является UIImage
объектом (хотя вам не удалось инициализировать его в этой строке).
Вы действительно должны всегда делать alloc / init в одной и той же строке (и в одной и той же переменной) - иначе действительно трудно следовать логике кода.Ваш код генерирует только один объект, а затем присваивает его другой переменной.
Это то же самое, хотя и гораздо понятнее:
UIImage* test = [[UIImage alloc] initWithContentsOfFile:path];
UIImage* image = test;
int n = [test retainCount]
Здесь очевидно, что test
и image
являются одним и тем же объектом (и, следовательно, имеют одинаковые retainCount
).Всякий раз, когда вы отпускаете один из них, объект исчезает (если вы не retain
его раньше).
Обратите также внимание, что retainCount
это не то, на что вы должны положиться или сделатьмного предположений о.В лучшем случае это часто вводит в заблуждение.