友人と私は、が有効になって@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
このメソッドの名前の言葉によるものだと思います。
アプリケーションがそのように機能する理由を誰かが知っているのではないでしょうか?