Вопрос

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

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

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

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

Хм

Это было полезно?

Решение

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

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

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

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

Нет. Пользователи - это адреса памяти; это все.

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

Видеть мой указатель Чтобы получить больше информации.

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

Хм

Указатель - это адрес памяти. Таким образом, это относится к памяти по этому адресу. Дереферное приложение Указатель получает доступ к этой памяти.

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

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

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

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

Другие советы

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

РЕДАКТИРОВАТЬ: Любой учебник по указателям C подойдет. Например http://home.netcom.com/~tjensen/ptr/pointers.htm

В какао вы никогда не будете использовать стек, выделенные объектами; Все объекты будут предназначены * (помните, что тип «ID» - это действительно еще одно слово «указатель на какой -то объект») и создан на куче.

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

NSArray     *myArray;

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

NSArray     myArray;

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

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

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

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, 

В объектив-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];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top