我想打印(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'发布它们?
答案 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)
您可以使用%p
格式说明符记录指针变量的值,例如:NSLog(@"%p", myString);
然而,这本身并不会告诉您给定地址是否在特定的内存段中(尽管您通常可以根据地址范围进行一些有根据的猜测 - 例如,堆栈地址从程序的地址空间的末尾开始,所以它们的值往往比堆地址大得多;虽然将堆地址与静态地址区分开来可能有些小问题。
你认为value
和count
将存储在堆栈中是正确的,但是引用的对象myString
将存储在静态内存中而不是存储在静态内存中堆。但是,myArr
将在堆中分配。
自动变量(方法和函数参数以及未显式声明为static
的局部变量)在堆栈上分配,无论您使用它们初始化它们的值。