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 池中的对象?