5

目前,我正在跳入被称为“iPhone OS 中的内存管理”的冰冷水中。

这是我学到的一条规则:

每次在我的方法中看到一个 alloc 时,我都会在方法的底部释放相应的变量。

每次我在我的头文件中创建一个 @property(...) 表示复制或保留时,我都会将该变量上的释放消息放入 dealloc 方法中。

每次我有一个 IBOutlet 时,我都会做同样的事情。唯一的例外:如果 IBOutlet 有类似 @property(...assign) 的东西,或者换句话说:如果它有 assign 关键字。然后我不在乎在dealloc方法中释放它。

我觉得还有很多好的规则要知道!只要写下你有什么。让我们一起刮掉它们。也欢迎提供精彩描述的链接。

4

4 回答 4

4

实际上,每当您初始化一个对象并且方法名称包含“init”时,您都有责任释放它。如果您使用不包含“init”一词的 Class 方法创建对象,那么您不会。

例如:

  NSString *person = [NSString stringWithFormat:"My name is %@", name];

不需要发布。但:

  Person *person = [[Person alloc] init];

需要释放(如您在问题中所述)。同样地:

  Person *person = [[Person alloc] initWithName:@"Matt"]];

也需要发布。

这是一个约定,而不是语言规则,但您会发现它适用于所有 Apple 提供的 API。

于 2009-04-24T16:17:31.540 回答
4

我使用的规则

  • 释放您使用名称以“alloc”或“new”开头或包含“copy”的方法创建的所有对象。

  • 释放您保留的所有对象。

  • 不要释放使用 +className 便利构造函数创建的对象。(类创建它并负责释放它。)

  • 不要释放您以其他方式收到的对象 例如 mySprockets = [widget sprockets];

  • 如果您将收到的对象存储在实例变量中,请保留或复制它。(除非它是弱引用——只是指向另一个对象的指针,通常是为了避免循环引用。)

  • 接收到的对象在(通常)接收它们的方法中是有效的,并且如果传递回调用者也是有效的。

一些很好的链接:

  1. http://www.gehacktes.net/2009/02/iphone-programming-part-2-objective-c-memory-management/
  2. http://mauvilasoftware.com/iphone_software_development/2008/01/iphone-memory-management-a-bri.html
于 2009-04-25T05:35:20.420 回答
2

当您看到每个看似无辜的代码行都出现段错误时,内存管理似乎令人生畏,但一旦您掌握了它,它实际上就很容易了。花一点时间阅读这个页面,然后阅读Apple 的文档,你应该很快就能编写出没有错误的代码。

于 2009-04-24T21:04:33.610 回答
1

我倾向于只创建自动释放的对象,要么使用类方法,要么在创建后立即自动释放它,除非我可以说明不这样做的理由。例如:

  • 我将它分配给一个成员变量,因为我打算保留它一段时间。
  • 我只是创建它以立即将其传递给另一个方法,并在该方法调用之后立即向它发送一条发布消息。
  • 出于性能原因,我需要在最近的 NSAutoreleasePool 释放之前释放该内存,例如在循环内创建大量对象或对象持有大量数据(例如图像)。

这样,我不太可能泄漏对象。默认情况下,我创建它们是自动释放的,当我故意决定不自动释放它们时,我立即面临它们将在哪里释放的问题。

对于对象属性,我喜欢将 nil 分配给它们,而不是在我的 dealloc 方法中释放它们。这样,保留或复制的属性会被发送一个版本,而分配的属性会被简单地覆盖,如果我将属性更改为保留/保留,我不必更新我的 dealloc 方法。

于 2009-04-24T16:43:25.203 回答