iOS中的所有对象都会自动添加到自动释放池中吗?

Posted

技术标签:

【中文标题】iOS中的所有对象都会自动添加到自动释放池中吗?【英文标题】:Are all objects in the iOS automatically added to the auto release pool? 【发布时间】:2017-03-22 06:54:36 【问题描述】:

什么时候ARC?如果没有,哪个会添加,哪个不添加?

例如:


  NSString *str = [[NSString alloc] init];
  NSString *str2 = [NSString string];


+ (NSString *)string 
  return [[NSString alloc] init];

str2 将被添加到自动释放池中,因为它是通过名为 'copy/mutableCopy/alloc/new' 的方法创建的。所以它不是自己创造的。但我不知道str会不会被添加,为什么?

【问题讨论】:

你为什么想知道? 【参考方案1】:

ARC 不保证哪些对象被添加到自动释放池中,哪些对象不被添加。您的示例中没有个对象很可能从未添加到 ARC 下的自动释放池中。

【讨论】:

【参考方案2】:

答案是否定的。实际上,要添加的自动释放池是方法“string”的obj。

// ARC

  NSString __strong *str = [[NSString alloc] init]; // STEP A
  NSString __strong *str2 = [NSString string]; //  STEP B
//  STEP Finish


+ (NSString *)string 
  id obj = [[NSString alloc] init];
  return obj;

这样可以帮助你理解。在ARC中,对象有__strong修饰符(默认)。因为一个对象必须有一个指向它的强指针,否则它会死。

步骤 A : str 创建一个 NSString 对象和自身的强项。 STEP B : str2 不是创建而是强指向一个对象,它是由NSString在方法字符串中创建的obj.obj,因为它需要返回,所以添加到自动释放池中。而str2的强指针指向了obj,所以obj不能通过自动释放池释放,还有一个强指针指向它。

STEP Finish,str,str2 out of method, no more strong pointer .所以他们释放了。 在STEP B,为什么需要自动释放池?因为如果不将obj放入自动释放池,它会被编译器释放,就像STEP Finish中的str一样。

所有这些都来自“ios 和 OS X 的 Pro 多线程和内存管理”一书。

忘掉我蹩脚的英语吧。

【讨论】:

以上是关于iOS中的所有对象都会自动添加到自动释放池中吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 Objective-C 中如何处理 Autorelease 池中的对象?

iOS---NSAutoreleasePool自动释放原理及详解

iPhone:自定义自动释放池中的崩溃

读书笔记iOS-自动释放池

Objective-C内存管理之自动释放池

Objective-C内存管理之自动释放池