繁体   English   中英

Objective-C / iOS内存管理问题

[英]Objective-C / iOS Memory Management Questions

我有兴趣了解更多有关iOS中内存管理的实现和正确使用的信息,尤其是Objective-C。

  1. 当您-release对象时,什么时候内存才真正释放出来并可供其他人使用?
  2. ARC如何知道在编译过程中在哪里将各种-retain-release消息插入/综合到代码中(在编译过程中或其他时间发生)?
  3. 我对autorelease的正确用法和目的还不确定。 例如,当编写返回数组的方法时,我通常在函数的开头-alloc-init该数组,然后在结尾处return它。

例如:

- (NSArray *)myMethod {

   NSMutableArray *theArray = [[NSMutableArray alloc] init];

   // Do other stuff here

   return theArray;

}

我是否也应该-autorelease该数组? 例如:

- (NSArray *)myMethod {

   NSMutableArray *theArray = [[NSMutableArray alloc] init];

   // Do other stuff here

   return [theArray autorelease];

}
  1. 在什么情况下,最好在对象(例如[NSArray array] )上使用便捷构造函数,而不是-alloc-init对象?
  2. 在创建新对象并将其分配给一个strong的属性时,应该将其分配给一个中间变量而不是直接分配给该属性,以避免双重保留(一次在-alloc-init ,然后再次在分配给strong财产)?

例如,我应该这样做:

NSMutableArray *theNewArray = [[NSMutableArray alloc] init];
self.newArray = theNewArray;

而不是这样:

self.newArray = [[NSMutableArray alloc] init];

在此先感谢您对这些问题的任何帮助!

  1. 释放对象后,其他人就可以使用该内存。 后者发生在其保留计数达到0时,也就是说,每次保留都会释放一次。

  2. 在Objective-C中有一个命名约定,只要您调用一个名称中标有“ alloc”,“ copy”或“ new”的方法,您就拥有已创建的对象,并且有责任在一段时间内释放它后来。 此外,当您调用一个以您要接收的东西的名称开头的方法(例如,工厂方法,例如[NSString stringWithFormat:],[NSDate日期]等)时,返回的对象将始终自动释放,意味着您不必担心释放它。

这些命名规则变得非常重要,并且得到了很好的遵守,当ARC出现时,Apple能够在ARC本身中构建它们。 因此,在编译期间,ARC会在正确的位置为您插入发布,自动发布和保留。

  1. 自动释放将某个对象标记为稍后再释放(在下一个运行循环中),而不是像常规释放那样立即释放。 该对象将与其他也已自动释放的对象一起添加到自动释放池中。 在ARC之前,从方法返回您拥有所有权(即通过alloc,copy或new创建)的对象时,将使用autorelease。 如果只是正常释放它,则该对象可能会在调用函数可以使用之前被释放。 使用ARC,您不必担心任何这些东西,而可以直接返回对象。

  2. 有时工厂时间更方便。 [NSString stringWithFormat:]使您可以初始化通过占位符的字符串。 [NSDate date]返回您已经初始化的当前日期。 如果在这种情况下分配/初始化,则必须再增加一两行代码才能获得相同的结果。 在具有ARC的世界中,在这些情况下的内存管理实际上不再重要。

  3. 不用担心。 您可以直接分配它。 编译器将优化保留/释放。

  1. release对象时,其保留计数会减少。 当其保留计数达到0时,它将被释放;
  2. 其主要依据范围。 当指针超出范围时,如果它拥有一个拥有的引用,它将释放所指向的内容。
  3. autorelease (i)将对象添加到自动释放池; (ii)释放它。 因此,它将终止您对对象的所有权,但确保其生存期至少与当前池一样长。 如果您拥有自己的引用(来自新的,分配,保留或创建的引用),则应确保将其释放。 如果您需要释放它又返回它,则应该自动释放。
  4. 当您需要非所有者参考时;
  5. 没有。 除非你要。 不会有双重保留。 编译器并不愚蠢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM