我想打印(日志)下面的变量存储在堆栈和堆中.我想知道这些下面的变量存储在这个程序中的哪个位置.我的感觉是,除前两个变量外,其他变量都存储在堆中.
-(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'发布这些内容?
我如何打印/记录这些变量存储在堆栈/堆中的位置?
我的假设存储上述程序中提到的位置(堆/堆栈)是正确还是错误?
如果分配的对象存储在堆内存中,它们的引用也将只在堆中(或)引用将在堆栈中?
Rob Napier.. 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管理这些,它将为您管理保留和发布.您不应该在大多数代码中手动调用release.
如果分配的对象存储在堆内存中,它们的引用也将只在堆中(或)引用将在堆栈中?
指针变量本身存储在堆栈中.
我想打印(日志)下面的变量存储在堆栈和堆中.我想知道这些下面的变量存储在这个程序中的哪个位置.
你真的不想这样做,但你可以这样:
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.
如果分配的对象存储在堆内存中,它们的引用也将只在堆中(或)引用将在堆栈中?
指针变量本身存储在堆栈中.