Использование Asterisk в Objective-C: связанные вопросы - PullRequest
2 голосов
/ 13 января 2010

У меня была пара вопросов, связанных с этим: Использование звездочки в Objective-C

массив NSArray; в локальной области видимости будет объект, «выделенный» в стеке. NSArray * array; указывает на объект, поддерживаемый блоком памяти, обычно выделяемым из кучи.

* +1007 *

Как узнать, когда что-то расположено в стеке и в куче? Все ли локальные переменные в стеке и все ли указатели в куче?

Поскольку вы не разыменовываете указатель на объект, и этот указатель на объект имеет решающее значение в самой реализации метода. Когда вы говорите ...

Да

Ответы [ 4 ]

9 голосов
/ 13 января 2010

Как узнать, когда что-то расположено в стеке и в куче? Все ли локальные переменные находятся в стеке ...

Это не имеет значения. Стек и куча являются деталями реализации; языки C и Objective-C не знают о них, и у вас, как правило, не должно быть причин для беспокойства, находится ли что-то в стеке или в куче.

В Mac OS X локальные переменные находятся в стеке. Но практически для всех целей это не имеет значения. Не беспокойся об этом.

… и все ли указатели в куче?

Нет. Указатели являются адресами памяти; это все.

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

См. учебник моего указателя для получения дополнительной информации.

Поскольку вы не разыменовываете указатель на объект, и этот указатель на объект имеет решающее значение в самой реализации метода. Когда вы говорите ...

Да

Указатель является адресом памяти. Таким образом, это относится к памяти по этому адресу. Разыменование указателя обращается к этой памяти.

Вы никогда не обращаетесь напрямую к памяти, которую занимает объект Какао. Вы только отправляете ему сообщения, либо задаете вопросы, либо говорите, чтобы они что-то делали. Таким образом, вы никогда не разыменовываете указатель.

«… этот указатель на объект является критическим в самой реализации метода». Означает, что объект в своих реализациях метода будет нуждаться в собственном указателе. Можно только отправить сообщение с указателем на объект (эта деталь обычно исключается). Если вы каким-то образом справитесь с этим, получатель сообщения (то есть объект, который вы отправили) не будет иметь своего собственного указателя.

Предположим, можно было отправить сообщение разыменованному объекту. Нормой по-прежнему является отправка сообщений указателям на объекты, поэтому, по всей вероятности, объект все еще будет нуждаться в этом указателе на себя, что делает эту гипотетическую способность сообщать разыменованный объект бесполезно.

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

4 голосов
/ 13 января 2010

* является оператором разыменования для C, C ++ и Objective-C. Понимание оператора разыменования и управления памятью в целом гораздо шире, чем Objective-C. Это фундаментальный навык для любого разработчика C / C ++ / Objective-C. Взгляните на множество учебников по интро C в сети, чтобы узнать больше.

Редактировать: подойдет любой учебник по c указателям. Как это http://home.netcom.com/~tjensen/ptr/pointers.htm

2 голосов
/ 13 января 2010

Надеюсь, эти примеры наивных игрушек помогут вам.

В С, в функции,

int x; // x is a variable of type int in stack
int *xp; // xp is a variable of type int * (pointer to int) in stack
int *xp2 = (int *) malloc(sizeof(int)); // xp2 is a variable in stack, it points to a memory location(size is of int) in heap
xp = &x; // xp can point to x
xp = xp2; // xp can also point to what xp2 points to
free(xp2); // now xp and xp2 point to a freed memory, BAD to use xp and xp2 now.
int **y; // y is a variable in stack, type is int **
y = (int **) malloc(sizeof(int *)); // allocate a piece of memory in heap, to hold a pointer to int(int *)
*y = (int *) malloc(sizeof(int)); // allocate a piece of memory in heap, to hold an int
**y = 100; // now we can use it
free(*y);
free(y);

В C ++, в функции или функции-члене (методе),

SomeClass a1; // a1 is an object of type SomeClass in stack
SomeClass *a2 = new SomeClass(); // a2 is a pointer(in stack) pointing to an object(of type SomeClass) located in heap
delete a2;

Таким образом, в C ++ объекты могут существовать в стеке или куче

В Java, в функции или методе,

SomeClass b1; // b1 is just a reference, no object exists yet
b1 = new SomeClass(); // in java, objects can only exist in heap
int x; // however, primitive types are in stack, 

В Objective-C, в функции или методе,

SomeClass c1; // you can't do this.
SomeClass *c2 = [[SomeClass alloca] init]; // c1 is a pointer in stack, pointing to an object in heap
[c2 release];
2 голосов
/ 13 января 2010

В Какао вы никогда не будете использовать объекты, выделенные стеком; ВСЕ объекты будут иметь префикс * (помните, что тип «id» на самом деле является еще одним словом для «указатель на НЕКОТОРЫЙ объект») и созданы в куче.

У вас всегда будет это:

NSArray     *myArray;

и никогда этого:

* +1007 *

Вы можете игнорировать второй блок, так как вы всегда разыменовываете указатель.

...