我正在开发一款带有迷你游戏的游戏。在一个游戏视图中,我有以下代码:
UIImage* img = [UIImage imageNamed:@"foo.png"];
someImage = CGImageRetain(img.CGImage);
[img release];
someImage的类型为CGImageRef,这在第一次没有问题。在用户输掉迷你游戏(或退出)后,游戏和所有内容似乎都得到了正确的解除。然后,如果他们回到迷你游戏中,并且游戏再次构建,则行:
someImage = CGImageRetain(img.CGImage);
导致某种错误......几乎就像我的UIImage对象已经被释放一样。我知道使用[UIImage imageNamed]有一些怪癖,但我根本无法追踪它。任何帮助将不胜感激:)
答案 0 :(得分:11)
这一行是你的问题;
[img release];
在Cocoa中,一般惯例是如果一个函数返回一个对象并且不包含单词copy或alloc,那么你就不必释放它。
返回对象的函数通常会将它们添加到自动释放池中。如果您打算保留该对象,那么您应该保留(并在以后发布)它。如果没有,那么它将自动被释放。
如果您尝试释放其中一个对象,则会导致不良。在这种情况下,我怀疑它正在释放操作系统认为它仍然拥有的资源。
This thread包含有关Cocoa内存管理的更多详细信息。