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

 黄乐瞳_319 发布于 2023-02-13 17:05

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

-(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.

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

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

1 个回答
  • 我想打印(日志)下面的变量存储在堆栈和堆中.我想知道这些下面的变量存储在这个程序中的哪个位置.

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

    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.

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

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

    2023-02-13 17:08 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有