objective-c - 关于dispatch_async和nsdata的xcode ios ARC(自动引用计数)

标签 objective-c ios memory-management automatic-ref-counting grand-central-dispatch

我有一个关于xcode ARC的初学者问题。由于ARC释放了内存,因此以下代码可以正常工作而不会出现内存问题。

- (void)viewDidLoad
{
    [super viewDidLoad];    
    // test nsmutabledata
    dispatch_queue_t testQueue = dispatch_queue_create("testQueue", NULL);
    dispatch_async(testQueue, ^{
        while (1) {
            NSMutableData *testData = [[NSMutableData alloc]initWithCapacity:1024*1024*5];
            NSLog(@"testData size: %d", testData.length);
        }
    });
}

但是,以下内容没有,并在几秒钟后为我提供了内存分配错误。
+ (NSMutableData *) testDataMethod
{
    NSMutableData *testDataLocal =  [[NSMutableData alloc]initWithCapacity:1024*1024*5];
    return testDataLocal;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // test nsmutabledata
    dispatch_queue_t testQueue = dispatch_queue_create("testQueue", NULL);
    dispatch_async(testQueue, ^{
        while (1) {
            NSMutableData *testData = [RootViewController testDataMethod];
            NSLog(@"testData size: %d", testData.length);
        }
    });
}

我对ARC的理解有误吗?我虽然只对testDataLocal进行了一次计数,但是当方法退出时超出了范围。 testData是另一个计数,但是在循环的下一次迭代中,testData应该没有计数,并且应由系统释放。

最佳答案

在代码的第一位,在每次循环迭代结束时释放NSMutableData对象,这避免了任何内存问题。

在代码的第二位,testDataMethod的返回值很可能会自动释放。由于您的应用程序处于紧密循环中,因此自动释放池从来没有机会被刷新过,因此您很快就会耗尽内存。

尝试将第二段代码更改为此:

while (1) {
    @autoreleasepool {
        NSMutableData *testData = [RootViewController testDataMethod];
        NSLog(@"testData size: %d", testData.length);
    }
}

关于objective-c - 关于dispatch_async和nsdata的xcode ios ARC(自动引用计数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13458595/

相关文章:

objective-c - 从打开附件 View 的 UITableView 存储值的最有效方法

ios - 自动重新加载 UiLabel 数据

ios - 如何在 safari 和 chrome 中运行共享扩展?

c++ - 使固定大小的 block 池分配器适应某些 STL 容器

c - 从虚拟内存地址查找物理内存地址

objective-c - ios Three20 背面动画

ios - 当我们清除通知时,Apple 推送通知信息丢失

c++ - 如何在 C++ 中使用 new 运算符初始化内存?

ios - SQLite3多线程

iOS 自动布局忽略 "trailing space"约束,而是使用宽度/内容大小?