2010-10-19 66 views
2

1)使用保留的原因是什么?客观C,内存管理

例如,在一个setter方法:

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

2)自动释放-方法:是否删除一个旧对象或制备新的?

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

intCount = input; 

是错的? 为什么?

+1

请注意,您的(int)不能被自动释放或保留(因为它不是一个对象) – KevinDTimm 2010-10-19 15:11:14

回答

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

  2. autorelease方法做删除旧的对象,不准备新的对象。它实际上是一个先发制人调用释放对象(自动释放复杂得多比,你应该在Memory Management Guide.读了它)

  3. 你的情况,因为你工作intCount = input不会是错误具有基础性。但是,如果输入是一个对象,那么你需要在它上面调用retain。事实上,你甚至不需要为自己的主体(或对象)编写自己的getter/setter,而应该使用Declared Properties。事实上,使用声明的属性几乎总是更好,如果你想自己推出,首先要了解pitfalls of doing so

+1

@Jacob感谢您捕捉语法错误! – 2010-10-19 15:25:56

+1

谢谢Jacob&Gavin, – 2010-10-21 14:42:23

+0

糟糕,还没有完成。好吧,我想,我明白了。我之前在C#编码,直到现在我都害怕指针。感谢您的帮助!现在我明白了为什么'retain'对于被指针引用的对象是必需的。 但还有很多东西需要学习。我也在学习C编程,因为我家里没有Mac。我正在编码的Mac(iPhoneApps)位于一家小型互联网全方位服务机构。 任何意见,以学习类似的东西在窗口 (MVC &&(C || C++)),所以我也能够学习这些概念? TNX为PITFALLS,我将需要它们 – 2010-10-21 14:53:03

0

为了回答具体乌尔问题:

1)。保留的使用是声明对象的所有权。在这种情况下,intCount保留输入的所有权,万一输入得到释放其他地方,你仍然可以使用intCount。 2)。 intCount的自动释放是放弃旧值的所有权。这避免了旧值的内存泄漏。如果你不释放旧值,并为这个指针赋值一个新值,那么旧对象将永远在那里,永远不会被释放,这会导致内存泄漏。 3)。如果你不保留输入,并且输入的参数被释放到其他地方。那么如果其他地方保留这个对象,它将被释放。所以你不能使用intCount以及。这就是为什么你需要保留它或复制它。

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

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

但是,如果它是一个指针,U应不分配新值直接在旧的。

+0

行! 谢谢! 我应该问一个被引用对象的“保留”问题。对? – 2010-10-21 14:59:13

+0

_testitalic_ ** testbold **'[test setText:@“test”]' – 2011-02-08 16:47:39

1

你的问题的答案已经得到很好的回答,所以我只是补充一点,如果你可以使用垃圾回收你应该。它使一切变得如此简单。它不是万能的,你仍然应该学习使用保留/释放机制,但除非你处理一些高容量的内存调用,创建和删除大量对象,那么就使用垃圾收集。

它可以在Project |编辑项目设置|生成

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

如果您正在进行iOS开发并且无法使用垃圾回收,那么我对提供无用信息表示歉意,但它仍然代表非iOS开发。

+0

我正在为iOS编码,但我认为最好是学会手动进行内存管理! TNX – 2010-10-21 14:55:31

+0

当然。你应该学会如何做所有可以为你自动化的东西,比如属性访问器和内存管理,但是一旦你了解它们,如果没有性能问题,你应该使用自动化方法。这是敏捷方法,代码聪明并不难。 iOS计划添加垃圾收集功能,但对于用户由于性能下降而拒绝升级的旧设备无效。对不起,我没有更多的帮助。 – 2010-10-23 22:59:42