【问题标题】:iphone where are variables allocated in heapiphone在堆中分配的变量在哪里
【发布时间】:2011-07-20 04:20:45
【问题描述】:

我来自微控制器编程世界,我正在学习在 iOS 上编程,

我有一个困扰我的问题:

  • 如何知道分配给对象的内存的物理地址?

     NSString *nombre = [[NSString alloc] initWithString:@"nombreName"];
    

喜欢十六进制地址??在哪里可以看到这个?

  • 堆有多大?我可以在开始和分配给对象之后看到堆吗?

【问题讨论】:

    标签: iphone memory-management heap-memory


    【解决方案1】:

    在调试时使用 gdb 在运行时检查对象。

    我创建了一个简单的 UIView 对象,

    UIView *someObject = [[UIView alloc] init];
    

    并在这一行设置断点,

    越过这一行,分配 someObject 的内存,然后运行 ​​po 或在 gdb 上打印 object 会显示该对象的十六进制地址 - 0x9304090

    (gdb) po someObject
    <UIView: 0x9304090; frame = (0 0; 0 0); layer = <CALayer: 0x4b1b730>>
    

    如果对象的description 方法已被覆盖,您可能看不到十六进制地址。对于这些对象,只需打印指针

    (gdb) p someObject
    $2 = (UIView *) 0x9304090
    

    或将其转换为 int 以将内存位置视为小数。

    (gdb) p (int) someObject
    $3 = 154157200
    

    【讨论】:

      【解决方案2】:

      您可以使用 heapshots 来查看堆的状态并分析您的应用程序。

      例如:http://useyourloaf.com/blog/2011/3/8/using-heapshots-to-find-abandoned-memory.html

      【讨论】:

        【解决方案3】:

        您示例中对象的内存地址为“nombre”。你可以这样显示:

        NSLog(@"nombre address is %x", nombre);
        

        至于分析内存堆问题,你只需要看看 XCode。在运行菜单下查看。应该有一个名为“使用性能工具运行”的条目。你应该在那里找到你需要的一切。

        【讨论】:

        • 附注我不知道该告诉你什么关于“黄油”的事情。我认为他们有不同的网站。
        • 哈哈,tnx,现在换了黄油!!,还有x是什么?,名词不是字符串吗?为什么x? tnx
        • "nombre" 绝对不是字符串!但它确实“指向”了一个。
        • 关于黄油:我不判断。但过去完成时将是“一直困扰”。 :)
        • 如果您来自微控制器世界,那么您离家很远! Objective-C 的奇怪之处在于它结合了 C 的低级方面(指针是一个实际的内存地址)和 Smalltalk 的高级方面(动态运行时绑定和使用消息作为函数调用)。
        猜你喜欢
        • 2010-10-26
        • 2013-01-10
        • 1970-01-01
        • 2016-02-07
        • 1970-01-01
        • 2014-10-04
        • 1970-01-01
        • 2015-05-27
        • 1970-01-01
        相关资源
        最近更新 更多