retain
нельзя вызвать в скомпилированном коде ARC.
Чтобы ответить на ваш вопрос, в среде без ARC они практически одинаковы.
[NSMutableData data]
возвращает автоматически выпущенный объект, вызывая retain
, на котором вы вступаете во владение и в какой-то момент отвечаете за его освобождение.
[[NSMutableData alloc] init]
возвращает объект, количество сохранений которого равно 1, и, следовательно, вы являетесь владельцем и несете ответственность за его освобождение, когда закончите с ним.
Еще раз, однако, retain
нельзя использовать в скомпилированном коде ARC, поэтому NSMutableData* myData = [[NSMutableData data] retain];
не будет компилироваться.
И для дальнейшего уточнения, если вы используете ARC, вы можете использовать любую из следующих строк и быть в безопасности, вам не нужно беспокоиться о том, как объект удерживается или освобождается.
// line1
NSMutableData* myData = [NSMutableData data];
// line2
NSMutableData* myData = [[NSMutableData alloc] init];
Редактировать
Кроме того, [[[NSMutableData data] retain] autorelease]
этот код является довольно бессмысленным и чрезмерным. Он говорит: «Дайте мне автоматически выпущенный объект NSMutableData, используя метод класса data
, сохраните этот автоматически выпущенный объект для меня и добавьте этот объект, которым я теперь владею, обратно в пул автоматического выпуска». Таким образом, по сути [NSMutableData data]
достигает того же результата с меньшим количеством кода и меньшими накладными расходами. Если бы вы действительно видели такую строку в примерах Apple, я был бы удивлен.