Пожалуйста, прочитайте Руководство по программированию управления памятью .Все это объясняется там.Также проверьте Learn Objective-C .
Почему им нужно вызывать alloc для соединения, а не для запроса?
Всякий раз, когда вам нужно владеть объектом, чтобы он жил дольше, чем область действия функции, объект должен быть -retain
ed.Конечно, вы можете использовать
NSURLConnection* theConnection = [NSURLConnection connectionWithRequest:theRequest
delegate:self];
, но соединение будет -autorelease
d.Но поскольку у соединения есть время для завершения, эта переменная должна быть -retain
ed, чтобы соединение не стало недействительным.Конечно, тогда вы можете сделать
NSURLConnection* theConnection = [[NSURLConnection connectionWithRequest:theRequest
delegate:self] retain];
Но это эквивалентно +alloc
→ -init
→ -autorelease
→ -retain
, последние два шага излишни.Вероятно, именно поэтому Apple решает использовать +alloc
/ -init
здесь.
(Кстати, этот стиль будет вызывать жалобы статического анализатора. Лучше хранить theConnection
в виде ивара, напримеробъект делегата.)
С другой стороны, NSURLRequest - это просто временный объект, поэтому для завершения функции он должен быть -release
d.Опять же, вы можете использовать
NSURLRequest* theRequest = [[NSURLRequest alloc] initWithURL:...];
...
[theRequest release];
, это еще более эффективно, так как пул автоматического выпуска не будет заполнен, но при использовании этого метода можно забыть -release
и вызвать утечку.
Но все функции "initWithXXX" возвращают автоматически выпущенные объекты.
Нет, -init…
никогда не должен возвращать -autorelease
d объект.