2012-08-04 93 views
0

我正在构建一个有三种不同尺寸的益智游戏。加载的图像取决于拼图的大小。为了简单起见,我会称它们为小/中/大。当我加载我的视图时,我告诉它这个拼图的大小,我打电话给一个loadImages方法。重新分配自动释放对象

我有我们设置了这样的特性:

@property (nonatomic, retain) UIImage *solidSquare; 

所以在我loadImages方法我有:

self.solidSquare = [[[UIImage alloc] initWithContentsOfFile:solidPath] autorelease]; 

solidPath基于拼图大小动态确定。

现在,如果用户切换到不同的拼图大小,我会在游戏开始时再次调用loadImages。我如何处理这种记忆状况?我觉得我需要在我的loadImages方法开始时调用它。

[self.solidSquare release]; 

是吗?我如何评估它是第一次加载,还是我需要?

回答

6

不,你没有(或它会崩溃)。由于对象是自动释放的,因此您不必担心其引用 - 它不会使其指针悬空并且不会泄漏内存。另外,使用属性时,属性设置器会确保旧对象被自动释放。

总而言之,您可以安全地重新分配财产。

编辑:但你必须在-dealloc中将其设置为nil

+0

当我读完这个问题时,你已经有了答案。 +1解释autorelease意味着什么,特别是,该属性负责保留/释放。不过你可能想提一下,这是'保留'/'强'的属性,在这种情况下,它具有魔力。 – ATaylor 2012-08-04 15:14:39

+0

因此,当我的视图被释放时,我甚至不需要释放它?我想这是有道理的。我没有意识到如果它被重新分配,它会释放旧对象,这是很好的知道。如果我想手动管理这个,我是否需要评估solidSquare == nil,如果是的话,在分配它之前释放它? – JamesB41 2012-08-04 15:23:43

+0

@ JamesB41你必须在dealloc中将它设置为'nil'。查看更新。 – 2012-08-04 15:53:22

0

当你调用autorelease时,它会将对象添加到autorelease池中,所以你不需要明确地释放它。如果您想要控制对象何时被释放,请不要调用autorelease,并在适合的地方释放该对象。

+0

你不应该明确地在dealloc之外释放属性,并且你在那里使用后援伊娃。始终使用属性设置器并分配nil。 – logancautrell 2012-08-04 15:24:55

+0

我从来没有理解......那不是泄漏?因为原始对象从未被释放,并且你将指针设置为零,所以没有办法释放内存(除非它是自动释放的) – 2012-08-04 15:37:01

+0

@JohnCorbett对象从未被释放,但它被自动释放。 – 2012-08-04 15:54:06