iOS / Obj C:变量分配和发布

时间:2013-11-30 19:22:48

标签: ios objective-c

我想打印(log)以下变量存储在堆栈和堆中。我想知道这些下面的变量存储在这个程序中的哪个位置。我的感觉是,除了前两个变量,其他变量存储在堆中。

-(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. 如果分配的对象存储在堆内存中,它们的引用也将只在堆中(或)引用将在堆栈中?

2 个答案:

答案 0 :(得分:5)

  

我想打印(log)以下变量存储在堆栈和堆中。我想知道这些下面的变量存储在这个程序中的哪个位置。

你真的不想这样做,但你可以这样:

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管理这些,它将为您管理保留和发布。您不应该在大多数代码中手动调用release。

  

如果分配的对象存储在堆内存中,它们的引用也将只在堆中(或)引用将在堆栈中?

指针变量本身存储在堆栈中。

答案 1 :(得分:0)

  1. 您可以使用%p格式说明符记录指针变量的值,例如:NSLog(@"%p", myString); 然而,这本身并不会告诉您给定地址是否在特定的内存段中(尽管您通常可以根据地址范围进行一些有根据的猜测 - 例如,堆栈地址从程序的地址空间的末尾开始,所以它们的值往往比堆地址大得多;虽然将堆地址与静态地址区分开来可能有些小问题。

  2. 你认为valuecount将存储在堆栈中是正确的,但是引用的对象myString将存储在静态内存中而不是存储在静态内存中堆。但是,myArr将在堆中分配。

  3. 自动变量(方法和函数参数以及未显式声明为static的局部变量)在堆栈上分配,无论您使用它们初始化它们的值。