【问题标题】:Does anything prevent -[NSData bytes] from becoming a dangling pointer?有什么能阻止 -[NSData bytes] 成为悬空指针吗?
【发布时间】:2016-04-06 04:22:58
【问题描述】:

在这样的情况下,我有一个关于 Objective-C 如何处理内存的基本问题:

void testimage(){
    UIImage * iu = [UIImage imageNamed:@"testimage"];
    NSData *imageData = UIImagePNGRepresentation(iu);
    giveimage(imageData.bytes);
}

我没有明确分配任何内存,因此我也没有删除任何内存。我将二进制信息传递给另一个 C 函数(库 API 的一部分)giveimage,然后将其用于非 Objective-C 代码库中的纹理。

我的问题是:这些数据有多稳定?它只是指向内存中某些数据的指针。在这种情况下,是什么阻止系统用其他数据覆盖此内存?我自己也没有坚持,所以这里有顾虑吗?

【问题讨论】:

    标签: ios objective-c cocoa-touch memory-management


    【解决方案1】:

    在这种情况下,是什么阻止了系统用其他数据覆盖此内存?

    约定:Cocoa rules about memory management。在这里,你在惯例的错误一边。 bytes 指针的持续时间不会超过其 NSData 实例。 NSDataUIImage 的生命周期都限于 testimage 函数。

    在这种情况下,您应该使用getBytes:length: 将数据复制到您自己的缓冲区中,或者执行复制。否则你的担心会成真,testimage返回时数据将失效。

    【讨论】:

    • 小问题。一旦您从 PNG 表示中获得了 NSData,它就完全独立于原始的 UIImage。换句话说,imageData 不会受到iu 发生的事情的影响。
    • 嗯。我认为这是某种内部指针,如果 UIImage 将被销毁,我需要进行显式复制。谢谢指正。
    【解决方案2】:

    你肯定有问题。在testimage 函数结束时,imageData 超出范围并将被释放。这将带上它的bytes

    如果传递给giveimage 的数据需要在调用giveimage 之后继续存在,那么您的giveimage 函数需要制作自己的字节副本,而不是依赖传递给giveimage 的指针。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-18
      • 2014-12-04
      • 2021-12-18
      • 2023-03-17
      • 2011-04-04
      • 2011-05-19
      相关资源
      最近更新 更多