Инициализация объектов / ARC - PullRequest
1 голос
/ 12 декабря 2011

На днях я задал тупой вопрос ( тупой вопрос ) о разнице между:

// line1
NSMutableData* myData = [NSMutableData data];
// line2
NSMutableData* myData = [[NSMutableData alloc] init];

Это был глупый вопрос, и я вовремя не уловил свою ошибку. Я хотел спросить, в чем разница между:

// line1 -- added retain
NSMutableData* myData = [[NSMutableData data] retain]; // added retain
// line2
NSMutableData* myData = [[NSMutableData alloc] init];

Это может легко все же быть глупым вопросом ... извинения, если это так! Есть ли реальная разница? С дугой? Я видел, как примеры NSXMLParser используют оба метода (некоторые примеры Apple используют [[[NSMutableData alloc] init] autorelease]), и мне не ясно, есть ли на самом деле разница?

1 Ответ

7 голосов
/ 12 декабря 2011

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, я был бы удивлен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...