据我了解,任何使用alloc,new或copy创建的东西都需要手动释放.例如:
int main(void) {
NSString *string;
string = [[NSString alloc] init];
/* use the string */
[string release];
}
Run Code Online (Sandbox Code Playgroud)
不过,我的问题是,这不是有效吗?:
int main(void) {
NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];
NSString *string;
string = [[[NSString alloc] init] autorelease];
/* use the string */
[pool drain];
}
Run Code Online (Sandbox Code Playgroud) memory-management foundationkit objective-c nsautoreleasepool
在Swift中,我注意到没有@autoreleasepool{}
构造,尽管Swift确实使用ARC.在Swift中管理autoreleasepool的正确方法是什么,或者由于某种原因将其删除了?
可能重复:
为什么要使用自动释放池?
将打开所有Objective-C起始页面,其中包含@autoreleasepool{...}
main函数声明下的默认语句.但这句话到底在做什么呢?新的Objective-C自动释放对象并删除该行不会对程序产生任何影响.这个命令真的有必要吗?
我下面3"在Objective-C编程" RD版和我有第一个例子中的问题.
我一直收到这个错误:
语义问题:'NSAutoreleasePool'不可用:在自动引用计数模式下不可用
这是我的代码:
//
// main.m
// prog1 //
// Created by Steve Kochan on 1/30/11.
// Copyright 2011 ClassroomM, Inc.. All rights reserved. //
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSLog (@"Programming is fun!");
[pool drain];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
任何见解将不胜感激.
我知道在main方法中创建了一个自动释放池,并且接收自动释放消息的所有对象都存储在此池中,并在池耗尽时释放.
但总是说它可以避免自动释放对象以避免内存泄漏,从而避免应用程序崩溃.
那么我们为什么以及在哪些条件下应该使用autoreleasepool?
Apple文档建议我们在使用线程时需要使用它们,所以在线程的开头我们需要创建一个自动释放池,并在线程的最后排空它但是如果我们不在完整中创建自动释放对象该怎么办?然后在该条件下线程也需要在线程的开头创建一个autoreleasepool.
请清除我的困惑.感谢名单.
我已阅读并发编程指南
在指南中,文本指出GCD调度队列定义了他们自己的@autoreleasepool池,并提到仍然建议在每个调度级别定义一个,但是对于NSOperation没有说什么,Apple提供的示例代码也没有显示@autoreleasepool结构.在NSOperation的背景下,模糊地提到@autoreleasepool的唯一地方是修订历史,
2012-07-17 - 删除了有关自动释放池使用操作的过时信息.
查看在线提供的示例代码,例如 http://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues在基于NSOperations的对象的实现中使用@autoreleasepool,例如:
@implementation ImageDownloader
- (void)main {
@autoreleasepool {
...
}
}
@end
Run Code Online (Sandbox Code Playgroud)
nsoperation nsautoreleasepool ios automatic-ref-counting ios8
假设我有一个返回一堆自动释放的NSData对象的循环...
NSData* bigData = ...
while(some condition) {
NSData* smallData = [bigData subdataWithRange:...];
//process smallData
}
Run Code Online (Sandbox Code Playgroud)
在ARC下,我是否仍然应对@autoreleasepool
这种while
情况?
NSData* bigData = ...
@autoreleasepool {
while(some condition) {
NSData* smallData = [bigData subdataWithRange:...];
//process smallData
}
}
Run Code Online (Sandbox Code Playgroud)
我之所以问的原因是我看到我的NSData对象通过屋顶的工具中的生活分配数量调用dataWith...
方法而不是initWith...
方法.当我使用时initWith...
,生活分配数量要少得多.
initWith...
尽可能选择方法更好吗?
memory-management objective-c nsautoreleasepool automatic-ref-counting
我看了这个:
如果您在应用程序中创建了辅助线程,则需要为其提供自己的自动释放池.自动释放池及其包含的对象将在下面进一步讨论
在iOS 5开发者食谱中.
我正在用ARC编译.我一直在创建许多后台线程,似乎我做得很好.我的后台线程都没有长时间运行.所有这些对象是否会被主线程的自动释放池释放?或者是什么?
这就是我所做的调用后台线程:
+(void)doBackground:(void (^)())block
{
//DISPATCH_QUEUE_PRIORITY_HIGH
//dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^{
dispatch_async(dispatch_get_global_queue(-2,0), ^{
block();
});
}
Run Code Online (Sandbox Code Playgroud)
我应该改变吗?
+(void)doBackground:(void (^)())block
{
//DISPATCH_QUEUE_PRIORITY_HIGH
//dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^{
dispatch_async(dispatch_get_global_queue(-2,0), ^{
@autoreleasepool{
block();
}
});
}
Run Code Online (Sandbox Code Playgroud) 考虑这个例子:
- (void)doSomething {
@autoreleasepool {
if (someCondition) {
/* ... allocate some autoreleased objects here ... */
return;
}
}
}
Run Code Online (Sandbox Code Playgroud)
以前,使用手动NSAutoreleasePools,如果我们提前返回,我们需要打电话[pool drain]
,否则池不会被耗尽.随着新的@autoreleasepool {}
我正在阅读苹果关于内存管理的文档,当我开始自动发布池块时,有些东西让我思考.
Any object sent an autorelease message inside the autorelease pool block is
released at the end of the block.
Run Code Online (Sandbox Code Playgroud)
我不确定我是否完全理解这一点.在自动释放池块中创建的任何对象无论如何都会在块的末尾释放,因为这是它的生命周期.为什么当它到达块的末尾时无论如何都要释放它时,你需要调用autorelease?
为了更清楚,我将举例说明我的想法:
@autoreleasepool {
MyObject *obj = [[MyObject alloc] init]; // no autorelease call here
/* use the object*/
//....
// in the end it should get deallocated because it's lifespan ends, right?
// so why do we need to call autorelease then?!
}
Run Code Online (Sandbox Code Playgroud)
PS:请不要告诉我,因为ARC我们不需要做一些事情,因为ARC会照顾它们.我完全清楚这一点,但我想暂时将ARC放在一边,以了解内存管理的机制.
memory-management autorelease nsautoreleasepool ios objective-c-blocks
objective-c ×5
ios ×3
autorelease ×2
cocoa ×1
cocoa-touch ×1
ios8 ×1
llvm-3.0 ×1
nsoperation ×1
object ×1
release ×1
swift ×1