【问题标题】:What happens behind-the-scenes when I create a new UIImage by assignment?当我通过赋值创建新的 UIImage 时,幕后会发生什么?
【发布时间】:2010-11-22 01:22:32
【问题描述】:

我收到 EXC-BAD-ACCESS 类型的错误,我通过分配预先存在的 UIImage 的值(如下所示)创建了一个新的 UIImage 实例,我试图找出问题所在。有一堆代码要整理,我不知道从哪里开始,所以我不会费心发布源代码——但它可能有助于我调查你们中的任何人都可以告诉我到底发生了什么(内存方面)当我通过从另一个分配创建新的 UIImage 时?

(in the .h)

UIImage* myExistsImage;

...

@property (retain) UIImage* myExistsImage;

...

-(UIImage*)rotateImage:(UIImage*)imageToRotate;



----------------------------------------------------


(in the .m)
@synthesize myExistsImage;

...

UIImage* myNewImage = [self rotateImage:myExistsImage];


...

-(UIImage*)rotateImage:(UIImage*)imageToRotate
{

UIImage* rotatedImage = imageToRotate;

//Rotate Image Here (details omitted)...

 return rotatedImage;
}

【问题讨论】:

    标签: iphone memory-management uikit uiimage


    【解决方案1】:
    UIImage* rotatedImage = imageToRotate;
    

    在该行中,您没有创建新的 UIImage 对象;您只是在创建一个指向旧指针的新指针。如果Rotate Image Here 暗示对rotatedImage 进行就地修改,那么您实际上也在修改myExistsImage

    如果您想创建一个新的 UIImage 对象来保存旋转的对象,您需要使用 UIImage 的allocinit 方法显式执行此操作。

    【讨论】:

    • 哦。因此,由于它只是一个指针,如果它指向的实际图像数据被释放,那么这可能是我的 EXC-BAD-ACCESS 正确的原因吗?谢谢!
    • 是的。如果您希望数据保留到两个指针都完成,只需在复制指针时添加一个保留。
    【解决方案2】:

    代码如下:

    UIImage* src;
    UIImage* dst = src;
    

    ... 你所做的只是复制一个指针。为了确保dstsrc 将继续指向有效的UIImage,您需要在UIImage 上调用retain 两次——一次用于src,一次用于dst .当您不再需要指针时,您应该在UIImage 上调用release - 当所有指针都消失时,最后一次调用release 将释放UIImage。您看到的是UIImage 正在发布,而您仍然对使用它感兴趣;然后,您需要retain 以防止这种情况发生。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-08
      • 2013-04-18
      • 1970-01-01
      • 2019-12-12
      • 2017-09-19
      • 2013-10-13
      • 1970-01-01
      相关资源
      最近更新 更多