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