[英]Objective C, Memory Management
1)使用保留的原因是什么?
例如,在setter方法中:
- (void) setCount: (int) input {
[intCount autorelease];
intCount = [input retain];
}
2)autorelease方法:是删除旧对象还是准备新对象?
3)为什么在输入对象上调用了保留方法?
将
intCount = input;
是错的? 又为什么呢?
保留用于增加对象的retainCount
。 NSObjects
有一个名为retainCount
的属性,该属性维护一个对象上当前持有的引用数。 当对象的retainCount
达到0时,可以从内存中释放该对象。 有效地,这可以防止某个对象在其他地方仍在使用时从内存中释放出来。
该autorelease
方法不删除旧的对象,并且不准备新的对象。 实际上,这是释放对象的先占式调用(自动释放比这要复杂得多,您应该在《 内存管理指南》中对其进行阅读。 )
在您的情况下, intCount = input
不会出错,因为您使用的是原始函数。 但是,如果输入是一个对象,则需要在其上调用retain。 实际上,您甚至不需要为基元(或对象)编写自己的getter / setter方法,而应该使用Declared Properties 。 实际上,使用声明的属性几乎总是更好,如果您想自己滚动,首先要了解这样做的陷阱 。
您的问题的答案已经得到很好的回答,所以让我补充一点,如果可以使用垃圾回收,则应该这样做。 它使一切变得如此容易。 它不是万能药,您仍然应该学习使用保留/释放机制,但是除非您要处理一些大容量的内存调用,创建和删除大量对象,然后才使用垃圾回收。
可以在Project |下找到。 编辑项目设置| 建立
然后,只需搜索“垃圾”,您就会看到它。
如果您正在进行iOS开发,并且无法使用垃圾回收,我很抱歉提供无用的信息,但仍然代表非iOS开发。
具体回答您的问题:
1)。 保留的使用是声明对象的所有权。 在这种情况下, intCount保留输入的所有权,如果输入在其他地方释放,您仍然可以使用intCount 。
2)。 自动释放intCount是放弃旧值的所有权。 那避免了旧值的内存泄漏。 如果您不释放旧值,并且给此指针分配了新值,则旧对象将始终存在且从未释放,这将导致内存泄漏。
3)。 如果您不保留input ,并且input的参数在其他地方释放。 那么如果没有其他地方保留此对象,它将被释放。 因此,您也不能使用intCount 。 这就是为什么您需要保留或复制它的原因。
但是我想如果你做intCount = input;
应该没问题 因为int不是对象,所以它只是一种类型。 所以我认为整个方法可以这样写:
- (void) setCount: (int) input {
intCount = input;
}
但是,如果它是一个指针,则您不应将新值直接分配给旧值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.