2013-11-30 3 views
3

Я хотел бы напечатать (журнал), что следующие переменные хранятся в стеке и куче. Я хочу знать, где хранятся эти нижеперечисленные переменные в этой программе. Я чувствую это, кроме первых двух переменных, другие хранят в куче.iOS/Obj C: Переменные распределения и освобождение

-(void) MyFunction 
{ 
    flat value = 9.5; // Stored in Stack? 
    int count; // Stored in Stack? 
    NSString *myString = @"Incoming message"; // Stored in Heap 
    NSArray *myArr = [[NSArray alloc] init]; // Stored in Heap 

    ....... 
    ....... 
} 

В этом случае, как я могу их освободить, используя 'release'?

  1. Как я могу печатать/записывать, где эти переменные хранятся в стеке/куче?
  2. Является ли мое предположение о сохранении местоположения (кучи/стека), упомянутого в вышеуказанной программе, правильным или неправильным?
  3. Если выделенные объекты, хранящиеся в памяти кучи, их ссылки также будут находиться в куче (или), ссылка будет находиться в стеке?
+0

'NSString * myString = @" Входящее сообщение "; // Хранится в «Куче» - откуда у вас эта идея? –

+1

Это не страшная идея; в этом случае это просто неверно. В gcc, без '-fconstant-cfstrings', он фактически может быть сохранен в куче (мне нужно будет дважды проверить). –

+0

@RobNapier Я не сказал, что это ужасная идея - что с этим не так, так это то, что она основана на предположении, что OP не проверяет, является ли это истиной или ложью. –

ответ

0
  1. Вы можете регистрировать значения переменных-указателей в формате %p спецификатора, например: NSLog(@"%p", myString); Однако это само по себе не скажет вам, является ли данный адрес в определенном сегменте памяти (хотя вы можете как правило, делают некоторые обоснованные предположения на основе диапазонов адресов - например, адреса стека начинаются в конце адресного пространства программы, поэтому их значения обычно намного больше, чем адреса кучи, однако различие адресов кучи от статических адресов может быть немного затруднительным) ,

  2. Вы правы, думая, что value и count будет хранить в стеке, но объект myString относится к будет храниться в статической памяти, а не в куче. Однако myArr будет выделено в кучу.

  3. Автоматические переменные (аргументы метода и функции, а также локальные переменные, явно не объявленные static), выделяются в стеке независимо от значений, которые вы инициализируете.

5

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

Это очень маловероятно, что вы действительно хотите сделать это, но вы можете, как это:

NSLog(@"value:%p", &value); 
NSLog(@"count:%p", &count); 
NSLog(@"myString:%p", myString); 
NSLog(@"myArr:%p", myArr); 

Что касается где они хранятся:

float value = 9.5; // Stored in Stack? 

Возможно, если вы на самом деле изменить Это. Он также может храниться в регистре. Или это может быть полностью оптимизировано, если оно окажется постоянным. Вышеуказанные операторы журналов заставят его хранить в стеке (поэтому он может иметь адрес), поэтому запрос, где хранится переменная, может фактически измениться там, где он хранится.

Но да, в качестве приближения обратной последовательности неоптимизированного кода в стек хранятся автоматические переменные.

int count; // Stored in Stack? 

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

NSString *myString = @"Incoming message"; // Stored in Heap 

Постоянная строка, в которой это указывает, сохраняется в текстовом сегменте (в самом коде). Однако сам указатель myString является автоматической переменной и хранится в стеке, как указано выше.

NSArray *myArr = [[NSArray alloc] init]; // Stored in Heap 

Это может быть оптимизировано вплоть до постоянного пустого массива, хранящегося в структуре. Или это может быть на куче.

В этом случае, как я могу освободить их, используя «release»?

Нет. Вы управляете ими с помощью ARC, который будет управлять сохранением и выпуском для вас. Вы не должны вручную вызывать выпуск в большинстве кодов.

Если выделенные объекты, хранящиеся в памяти кучи, их ссылки также будут находиться в куче (или), ссылка будет находиться в стеке?

Переменная указателя хранится в стеке.

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