C ++ эквивалент в Objective-C [alloc [init]] - PullRequest
2 голосов
/ 20 апреля 2011

Прав ли я, говоря, что эквивалентен:

NSMutableArray *foo;
foo = [[NSMutableArray alloc] init];
[foo release];

Является ли C ++:

NSMutableArray *foo = new NSMutableArray();
delete foo;

т.е.2-я строка Obj-C выполняет динамическое распределение памяти, а первая просто делает указатель?В этом случае, какова функция [init] VS.[alloc]?

спасибо, ребята - я почти нахожу, что немного C ++ является почти помехой для изучения Obj-C!

Ответы [ 4 ]

2 голосов
/ 20 апреля 2011

alloc является эквивалентом new(), а init является эквивалентом конструктора объекта C ++.

2 голосов
/ 20 апреля 2011

Внутренне C ++ может делать что-то очень похожее на alloc + init.В этом случае alloc выполняет фактическое выделение памяти (новое), а init действует более или менее как ваш конструктор.

1 голос
/ 21 апреля 2011

Я думаю, что ближайший эквивалент C ++ для двухэтапного alloc / init в Objective-C будет вызывать malloc для выделения буфера, а затем использовать размещение new для вызова конструктора для ранее выделенного блока памяти:*

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

Конечно, одно ключевое отличие состоит в том, что пара alloc / init в Objective-C является фундаментальной и широко используемой частьюстандартная библиотека фонда.В отличие от этого, Placement new - это странный и редко используемый уголок C ++, который загружен предостережениями и предупреждениями в онлайновом FAQ по C ++ .

.
0 голосов
/ 20 апреля 2011

В дополнение к базовой семантике кода, который вы показали, вы должны рассмотреть способ обработки памяти данными языками программирования.В Objective-C каждый объект имеет счет удержания, который используется при вызове release (и объекту требуется счет сохранения 0 перед удалением).В C ++ такого механизма нет, и вам приходится самостоятельно обрабатывать память при использовании new и delete (что может привести к утечкам памяти).

Если вы хотите управлять памятью на уровне Objective-C, вам следует проверитьзаголовок C ++ 0x, который включает в себя объект shared_ptr (который ведет себя более похожим на Objective-C).

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