2009-10-27 64 views
0

考虑这个伪代码:IPHONE:关于发布变量的问题

// an image is initialized 
UIImage *imagePX = [[UIImage alloc]initWithContentsOfFile:... bla bla 

imagePX = [self rotateImage:imagePX]; //A 
[self doStuff:imagePX]; //B 

然后我有rotateImage方法:

- (UIImage*) rotateImage:(UIImage*)source { 
    ... rotate the image... draw on context... 
    [source drawInRect... bla bla 
    ... 

    UIImage *rotatedImage = UIGraphicsGetImageFromCurrentImageContext(); 

    return rotatedImage; 
} 

我的问题是:imagePX从未发布过。当图像传递给方法RotateImage时,我想我可以在命令[source drawInRect ...]上使用它后简单地释放它,因为我会在方法上返回一个rotateImage,但是如果我这样做,程序会崩溃,因为变量imagePX应该存在,所以A行可以评估。

我的另一个问题是图像将在B上转发到另一个例程。那么,在不失去imagePX跟踪和泄漏的情况下,使其工作的最佳方法是什么?

什么是最好的方法?

回答

1

而不是

[[UIImage alloc]initWithContentsOfFile:... bla bla 

使用

[UIImage imageWithContentsOfFile:...bla bla 

后者将被自动释放。

+0

当然!我没有忘记imageWithContentsOfFile!我正在考虑使用我使用的和[UIImage imageNamed ...],但最后一个使用我试图保存的内存缓存图像,因为我试图将我的应用放在记忆饮食上。谢谢! – SpaceDog 2009-10-27 18:35:29

0

那么[UIImage imageNamed:@“”]呢?没有分配,不需要释放)

3

没有必要分配一个UIImage的实例。 imageWithContentsOfFile是一种静态方法,可以在类本身上调用。

由于imageWithContentsOfFile不包括术语allocnew,或copy返回的对象(约定)不保留,并且将在自动释放池的第一漏极被自动释放。相反,如果您遇到过类似的情况,即在尝试访问此对象时无法弄清楚为什么会收到EXC_BAD_ACCESS错误,则很可能已经过早发布了。在这些情况下,您将希望在本课程的范围内进行手动保留/释放。