2

友人と私は、が有効になって@autoreleasepoolいると便利な場合を把握しようとしARCていましたが、アプリケーションの奇妙な動作に気付きました。複数のメソッドを作成しました。

- (NSDictionary *)autoreleaseDict {
    return [NSDictionary dictionaryWithObjectsAndKeys:@"object", @"key", nil];
}

- (NSDictionary *)regularDict {
    return [[NSDictionary alloc] initWithObjectsAndKeys:@"object",@"key", nil];
}

- (NSDictionary *)allocDict {
    return [[NSDictionary alloc] initWithObjectsAndKeys:@"object", @"key", nil];
}

- (NSDictionary *)allocAutoreleaseDict {
    return [NSDictionary dictionaryWithObjectsAndKeys:@"object", @"key", nil];
}

そしてそれらを2つのネストされたループで実行しました:

    for (int i = 0; i < 10; i++) {
        @autoreleasepool {
            for (int j = 0; j < 100000; j++) {
                NSDictionary *dict = [self autoreleaseDict];
//                NSDictionary *dict = [self regularDict];
//                NSDictionary *dict = [self allocDict];
//                NSDictionary *dict = [self allocAutoreleaseDict];
            }
        }
    }

異なる名前の同じメソッドが異なる結果を示しました (regularDictおよびallocDict):

テスト1 ( autoreleaseDict) ここに画像の説明を入力

テスト2 ( regularDict) ここに画像の説明を入力

テスト3 ( allocDict) ここに画像の説明を入力

テスト4 ( allocAutoreleaseDict) ここに画像の説明を入力

私の知る限りARC、メソッドがオブジェクトを返すとき、このオブジェクトはautorelease. これは、Test1、Test2、および Test4 に当てはまりますが、メモリ使用量が少ないため、 Test3 の ( allocDict) オブジェクトはそうではないように思えます。autoreleaseそして、それはallocこのメソッドの名前の言葉によるものだと思います。

アプリケーションがそのように機能する理由を誰かが知っているのではないでしょうか?

4

1 に答える 1

2

iOS の基本的なメモリ管理規則の1 つは、「作成したオブジェクトはすべて所有します。名前が「alloc」、「new」、「copy」、または「mutableCopy」で始まるメソッドを使用してオブジェクトを作成します」と述べています。
つまり、オブジェクトが「alloc」で始まるメソッドを使用する場合、このオブジェクトは自動解放されませんが、メソッドを呼び出したオブジェクトによって保持されます。ただし、コンパイラは解放メッセージを適切に挿入するため、オブジェクトが不要になったときに解放されます。
そのため、使用する名前に応じて、実際にメソッド間に根本的な違いがあります。

于 2013-10-18T09:51:05.503 に答える