1

xcodeARCについて初心者の質問があります。次のコードは、メモリが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は1回カウントされますが、メソッドが終了するとスコープから外れます。testDataは別のカウントですが、ループの次の反復では、testDataはカウントを持たず、システムによって解放されます。

4

1 に答える 1

3

コードの最初のビットでは、NSMutableDataオブジェクトは各ループ反復の終わりに解放され、メモリの問題を回避します。

コードの 2 番目のビットでは、 の戻り値testDataMethodが自動解放されている可能性が最も高いです。アプリがタイトなループで実行されているため、自動解放プールがフラッシュされる機会が与えられないため、すぐにメモリが不足します。

コードの 2 番目のビットを次のように変更してみてください。

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