1

我有一个关于 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 应该没有计数,并被系统释放。

4

1 回答 1

3

在第一段代码中,NSMutableData对象在每次循环迭代结束时被释放,从而避免了任何内存问题。

在第二段代码中,返回值testDataMethod很可能是自动释放的。由于您的应用程序在一个紧密的循环中运行,因此自动释放池从未有机会被刷新,因此您很快就会耗尽内存。

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

while (1) {
    @autoreleasepool {
        NSMutableData *testData = [RootViewController testDataMethod];
        NSLog(@"testData size: %d", testData.length);
    }
}
于 2012-11-19T17:05:51.713 回答