1)使用retain的原因是什么?
例如,在 setter 方法中:
- (void) setCount: (int) input {
[intCount autorelease];
intCount = [input retain];
}
2)自动释放方法:是删除旧对象还是准备新对象?
3) 为什么在输入对象处调用保留方法?
将
intCount = input;
是错的?为什么?
1)使用retain的原因是什么?
例如,在 setter 方法中:
- (void) setCount: (int) input {
[intCount autorelease];
intCount = [input retain];
}
2)自动释放方法:是删除旧对象还是准备新对象?
3) 为什么在输入对象处调用保留方法?
将
intCount = input;
是错的?为什么?
保留用于增加retainCount
对象的。 NSObjects
有一个名为的属性retainCount
,它维护一个对象上当前持有的引用数量的计数。当retainCount
对象的值达到0时,可以从内存中释放该对象。如果对象仍在其他地方使用,这实际上可以防止对象从内存中释放。
该autorelease
方法不会删除旧对象,也不会准备新对象。它实际上是一个先发制人的调用来释放对象(自动释放比这复杂得多,你应该在内存管理指南中阅读它。)
在您的情况下intCount = input
不会错,因为您正在使用原始语言。但是,如果输入是一个对象,那么您需要在其上调用保留。事实上,您甚至不需要为原始对象(或对象)编写自己的 getter/setter,而是应该使用Declared Properties。事实上,使用 Declared Properties 几乎总是更好,如果您确实想自己动手,请先了解这样做的陷阱。
我建议你阅读这个。http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html
你的问题的答案已经得到了很好的回答,所以让我补充一下,如果你可以使用垃圾收集,你应该这样做。它使一切变得容易得多。它不是灵丹妙药,您仍然应该学习使用保留/释放机制,但除非您处理一些大容量内存调用、创建和删除大量对象,否则只需使用垃圾收集。
它可以在项目 | 下找到。编辑项目设置 | 建造
然后只需搜索“垃圾”,您就会看到它。
如果你正在做 iOS 开发并且不能使用垃圾收集,我很抱歉提供了无用的信息,但它仍然代表非 iOS 开发。
具体回答你的问题:
1)。保留的用途是声明一个对象的所有权。在这种情况下,intCount保留input的所有权,以防输入在其他地方释放,您仍然可以使用intCount。
2)。intCount的自动释放是放弃旧值的所有权。这避免了旧值的内存泄漏。如果你不释放旧值,并且你给这个指针分配一个新值,旧对象将永远存在并且永远不会被释放,这将导致内存泄漏。
3)。如果您不保留输入,并且输入的参数在其他地方被释放。那么如果没有其他地方保留这个对象,它将被释放。所以你也不能使用intCount。这就是为什么你需要保留它或复制它。
但我认为如果你这样做intCount = input;
应该没问题。因为 int 不是一个对象,它只是一个类型。所以我觉得整个方法可以这样写:
- (void) setCount: (int) input {
intCount = input;
}
但是如果它是一个指针,你不应该直接将新值分配给旧值。