【问题标题】:Re-Assigning an Autoreleased Object重新分配自动释放的对象
【发布时间】:2012-08-02 07:45:36
【问题描述】:

我正在构建一个具有三种不同大小的益智游戏。加载的图像取决于拼图的大小。为简单起见,我将它们称为小/中/大。当我加载视图时,我会告诉它拼图的大小并调用 loadImages 方法。

我有一个这样设置的属性:

@property (nonatomic, retain) UIImage *solidSquare;

所以在我的 loadImages 方法中我有:

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

solidPath 是根据拼图大小动态确定的。

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

[self.solidSquare release];

我会吗?我如何评估它是否是第一次加载,或者我什至需要这样做?

【问题讨论】:

    标签: objective-c ios memory-management autorelease


    【解决方案1】:

    不,你没有(否则它会崩溃)。由于对象是自动释放的,您不必再担心它的引用——它不会使其指针悬空,也不会泄漏内存。此外,在使用属性时,属性设置器会确保自动释放旧对象。

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

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

    【讨论】:

    • 当我读完这个问题时,你已经发布了答案。 +1 用于解释自动释放的含义,尤其是该属性负责保留/释放。但是,您可能想提一下,在这种情况下,正是“保留”/“强”属性发挥了作用。
    • 那么当我的视图被释放时我什至不需要释放它?我想这是有道理的。我没有意识到如果重新分配它会释放旧对象,很高兴知道。如果我想手动管理它,是否需要评估solidSquare == nil,如果是,在分配之前释放它?
    • @JamesB41 您必须在 dealloc 中将其设置为 nil。查看更新。
    • 您能详细说明原因吗?将对象设置为 nil 与释放对象有何不同?
    • @JamesB41 您没有将 object 设置为 nil,而是将 property 设置为 nil。正如我已经解释过,属性设置器在设置新对象时释放旧对象,并保留新对象。因此,当您将属性设置为 nil 时,您实际上释放了旧对象,然后进行了注释([nil retain] 是无操作)。
    【解决方案2】:

    当您调用 autorelease 时,它​​会将对象添加到 autorelease 池中,因此您不需要显式释放它。如果您想控制何时释放对象,请不要调用 autorelease 并在您认为合适的地方释放对象。

    【讨论】:

    • 你永远不应该在 dealloc 之外显式地释放属性,并且在那里你使用支持 ivar。始终使用属性设置器并分配 nil。
    • 我从来不明白...这不会是泄密吗?因为原始对象从未被释放,而您将指针设置为 nil,所以没有办法释放内存(除非它是自动释放)
    • @JohnCorbett 该对象从未被释放,但它是自动释放的。
    • @H2CO3 在这种情况下是,我说的是对象没有自动释放的情况
    • @JohnCorbett 那么你不能 alloc-init 并在其中一步分配,你必须使用MyObject *tmp = [[MyObject alloc] init]; self.foo = tmp; [tmp release];
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多