0

感谢您查看这篇文章,如果你们能帮助我,那就太好了。我一直在做一些objective-c,并了解了objective-c的内存管理方式,比如确保在我拥有对象时调用release,何时调用autorelease等。我也不想使用ARC或新引入的 GC 因为我喜欢管理自己的内存,我计划稍后进入 iOS 开发,并且我知道管理自己的内存是一个好习惯。但是还有一个小细节我似乎碰到了一堵砖墙。它与向对象发送 -retain 消息有关。我了解到发送 -retain 消息会使引用计数增加 1。但这是否是发送 -retain 的合适时间?:

      - (void) setName : (NSString* ) theName 
      {
          // name is an instance variable of type NSString
          [theName retain]; // Must release this
          name = [theName copy]; // Must release this in dealloc
          [theName release]; // decrement the reference count because of retain
      }

我应该在这里调用retain,以便我暂时拥有这个论点,并确保它在我开始使用它之前不会以某种方式被释放吗?

任何帮助,将不胜感激!谢谢!

4

1 回答 1

4

不,作为方法参数提供的对象通常会在您的方法返回之前一直存在。您不需要那里的保留消息。您在此处复制字符串以在方法返回后保留它。

这在“避免导致您正在使用的对象的重新分配”部分中记录在此页面上的 Apple 文档中。具体来说:

Cocoa 的所有权策略指定接收到的对象通常应该在调用方法的整个范围内保持有效。还应该可以从当前范围返回接收到的对象,而不必担心它被释放。对象的 getter 方法返回缓存的实例变量或计算值对您的应用程序来说并不重要。重要的是该对象在您需要的时间内保持有效。

顺便说一句,你真的应该考虑使用 ARC。管理自己的记忆并不是一个好习惯。不管一个人在管理自己的内存方面有多好,LLVM 编译器仍然更好。管理自己的记忆将导致难以解决仅由您自己引起的问题。这是你真正不必处理的额外认知负荷,当你最终放弃手动记忆管理时,你会为你甚至不知道的所有精神开销松一口气。

于 2012-11-17T15:06:26.850 回答