2

1)使用retain的原因是什么?

例如,在 setter 方法中:

- (void) setCount: (int) input {
    [intCount autorelease];
    intCount = [input retain];
}

2)自动释放方法:是删除旧对象还是准备新对象?

3) 为什么在输入对象处调用保留方法?

intCount = input;

是错的?为什么?

4

4 回答 4

4
  1. 保留用于增加retainCount对象的。 NSObjects有一个名为的属性retainCount,它维护一个对象上当前持有的引用数量的计数。当retainCount对象的值达到0时,可以从内存中释放该对象。如果对象仍在其他地方使用,这实际上可以防止对象从内存中释放。

  2. autorelease方法不会删除旧对象,也不会准备新对象。它实际上是一个先发制人的调用来释放对象(自动释放比这复杂得多,你应该在内存管理指南中阅读它。

  3. 在您的情况下intCount = input不会错,因为您正在使用原始语言。但是,如果输入是一个对象,那么您需要在其上调用保留。事实上,您甚至不需要为原始对象(或对象)编写自己的 getter/setter,而是应该使用Declared Properties。事实上,使用 Declared Properties 几乎总是更好,如果您确实想自己动手,请先了解这样做的陷阱

于 2010-10-19T15:16:48.383 回答
2

我建议你阅读这个。http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

于 2010-10-19T15:00:28.267 回答
1

你的问题的答案已经得到了很好的回答,所以让我补充一下,如果你可以使用垃圾收集,你应该这样做。它使一切变得容易得多。它不是灵丹妙药,您仍然应该学习使用保留/释放机制,但除非您处理一些大容量内存调用、创建和删除大量对象,否则只需使用垃圾收集。

它可以在项目 | 下找到。编辑项目设置 | 建造

然后只需搜索“垃圾”,您就会看到它。

如果你正在做 iOS 开发并且不能使用垃圾收集,我很抱歉提供了无用的信息,但它仍然代表非 iOS 开发。

于 2010-10-19T19:09:01.410 回答
0

具体回答你的问题:

1)。保留的用途是声明一个对象的所有权。在这种情况下,intCount保留input的所有权,以防输入在其他地方释放,您仍然可以使用intCount

2)。intCount的自动释放是放弃旧值的所有权。这避免了旧值的内存泄漏。如果你不释放旧值,并且你给这个指针分配一个新值,旧对象将永远存在并且永远不会被释放,这将导致内存泄漏。

3)。如果您不保留输入,并且输入的参数在其他地方被释放。那么如果没有其他地方保留这个对象,它将被释放。所以你也不能使用intCount。这就是为什么你需要保留它或复制它。

但我认为如果你这样做intCount = input;应该没问题。因为 int 不是一个对象,它只是一个类型。所以我觉得整个方法可以这样写:

- (void) setCount: (int) input {
    intCount = input;
}

但是如果它是一个指针,你不应该直接将新值分配给旧值。

于 2010-10-19T15:16:04.597 回答