当我通过作业创建一个新的UIImage时幕后会发生什么?

时间:2009-08-23 13:21:56

标签: iphone memory-management uikit uiimage

我收到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;
}

2 个答案:

答案 0 :(得分:2)

UIImage* rotatedImage = imageToRotate;

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

如果要创建一个新的UIImage对象来保存旋转的对象,则需要使用UIImage allocinit方法明确地这样做。

答案 1 :(得分:2)

代码如下:

UIImage* src;
UIImage* dst = src;

...你所做的只是复制一个指针。为了确保dstsrc能够指向有效的UIImage,您需要在retain上拨打UIImage两次 - 一次适用于src,适用于dst。如果您不再需要指针,则应在release上调用UIImage - 当所有指针消失后,对release的最后一次调用将取消分配UIImage。您所看到的是UIImage正在释放,而您仍然对使用它感兴趣;然后,你需要retain来阻止它发生。