Они делают autorelease
здесь на случай, если newSprocket
и mainSprocket
окажутся одним и тем же объектом. Вызов release
может непреднамеренно освободить объект, прежде чем его можно будет сохранить на следующей строке, тогда как autorelease
не будет обрабатываться до тех пор, пока пул автообновления не будет слит в конце цикла событий.
Рассмотрим этот сценарий:
Sprocket *mySprocket = [Sprocket spacelySprocket];
[sprocketManager setMainSprocket:mySprocket];
Sprocket *anotherPointerToMySprocket = mySprocket;
[sprocketManager setMainSprocket:anotherPointerToMySprocket];
Последняя строка вызовет проблему, если mainSprocket
не будет автоматически выпущен. Другое соглашение, которое вы иногда можете увидеть для установочного кода, который делает то же самое:
– (void)setMainSprocket:(Sprocket *)newSprocket {
if (newSprocket != mainSprocket) {
[mainSprocket release];
mainSprocket = [newSprocket retain];
}
}
Я оставлю это на усмотрение других, чтобы прокомментировать, что является более подходящим или эстетически приятным: -)