2013-05-24 2 views
2

В чем разница между этими двумя объектно-ориентированными операторами?Objective-c - NSData initWithContentsOfFile и dataWithContentsOfFile

NSData *documentBytes = [NSData dataWithContentsOfFile:filePath]; 

против этого:

NSData *documentBytes = [NSData initWithContentsOfFile:filePath]; 

От NSData класса ссылочной страницы Apple, говорится следующее о каждом

dataWithContentsOfFile - Создает и возвращает объект данных, читая каждые байты из файла, указанного по заданному пути.

initWithContentsOfFile - возвращает объект данных, инициализированный считыванием в него данных из файла, заданного заданным путем.

Для меня это кажется функционально эквивалентным, но я очень сомневаюсь, что они делают то же самое во всех случаях, верно?

Заранее спасибо ... -Ergin

ответ

4

При использовании init, вы всегда должны использовать alloc, например, так:

NSData *documentBytes = [[NSData alloc] initWithContentsOfFile:filePath]; 

Это возвращает объект NSData с удержанием графом 1, теперь вы являетесь владельцем ссылки и несете ответственность за освобождение его.

dataWithContentsOfFile При использовании

NSData *documentBytes = [NSData dataWithContentsOfFile:filePath]; 

Вы получаете обратно в autoreleased объект NSData. Вы можете использовать его и забыть об этом, пул авторефератов позаботится об этом. Если вы хотите сохранить его, вы должны его сохранить.

Конечно, когда вы используете ARC, вы можете забыть обо всем этом ;-), методы по существу одинаковы.

+0

Отлично, спасибо вам, сэр! – Ergin

0

Второй

NSData *documentBytes = [NSData initWithContentsOfFile:filePath]; 

не будет компилировать вам нужно будет Alloc это первый, будет выглядеть примерно так:

NSData *documentBytes = [[NSData alloc] initWithContentsOfFile:filePath]; 

Но тот или другой будет работать одинаково, в конце концов у вас будет NSData, у которого есть контур файла. Первый - это ярлык.

Так о ваших сомнениях:

Первые вам не нужно Alloc объект первой, метод возвратит объект для вас, если вы не используете ARC (я не думаю, что так), то первый возвращает объект, который система будет заботиться.

Во-вторых, вам нужно будет сначала выделить объект, метод только инициализирует ваш объект, и если вы не используете ARC, вам нужно будет позаботиться о его освобождении.

+0

Хорошо, что имеет смысл, и вы правы, initWithContentsOfFile не компилируется без alloc. Спасибо, теперь это намного яснее! – Ergin

+0

Я рад помочь вам, Эргин, поэтому, если он разъяснит ваши сомнения, отметьте его как принятый ответ. – ggrana

Смежные вопросы