2010-05-29 5 views
2

Я не мог найти четкое объяснение, просто попросив быть уверенным; C-типы данных обрабатываются одинаково (с точки зрения управления памятью) в Obj.C? т. е. они созданы в стеке, сразу выпущены и т. д.? Значит, они отличаются от объектов Obj.C? Или мы можем сделать аналогию с C# (просто аналогию не точно), чтобы типы C обрабатывались как «типы значений» и объекты Obj.C как «ссылочные типы»?C Объекты в Objective-C

ответ

3

Objective-C - это чистое супермножество C, поэтому все, что работает в C, работает одинаково в Objective-C.

Поведение типов данных C не изменилось. Только объекты Objective-C (экземпляры классов) имеют свои собственные методы распределения.

1

В отличие от C++, который фактически расширяет C, так что вы можете делать такие вещи, как «новый» char *, ObjC, как говорит porneL, чисто надмножество и во многом просто какой-то причудливый синтаксический сахар. + alloc даже не является строгой конструкцией языка. Это всего лишь код ObjC, который в конечном итоге вызывает malloc() и сохраняет некоторые вещи в указателе struct objc_object, к которому вы можете получить доступ вручную, используя стандартную нотацию C ->.

Если вам интересно, как все это работает, The ObjC Runtime Programing Guide - это хорошее место для начала (хотя он не обсуждает и не выделяет особенно, он демистифицирует objc_msgsend).

К вашему конкретному вопросу, типы данных C помещаются в стек, если вы не выделяете их в кучу с помощью malloc(). Объекты ObjC всегда выделяются в куче. Но аналогия с C# на самом деле не очень полезна. Учитывайте следующее:

int x; 
int *y; 
NSObject *z; 

«x» - это то, что вы называете «типом значения». И y и z - это то, что вы называете «ссылочными типами». Дело не в том, что два являются C, а один - ObjC; это то, что два из них являются указателями, и поэтому почти наверняка указывают на динамическую память в куче. Вот почему у вас никогда нет объекта ObjC без указателя («id» - это просто указатель на структуру objc_object). Вот почему вы можете использовать нотацию C-указателя на объектах ObjC для извлечения их ivars (вы не должны, но можете). Это всего лишь C.

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