以下の両方のメソッドは、NSString を割り当ててリークします。XCode (4.6) Analyzer を実行すると、bar2 でリークが正常にフラグ付けされますが、bar1 ではそれについて言及されません。
理由がわかりません。
私の実際のプロジェクトでは、bar2 のような明らかな方法で捕捉されると予想されるリークを発見しましたが、bar1 での同じ動作のために発見されませんでした。
理由を理解するのを手伝ってください。ありがとう!
-(void)bar1
{
NSString* foo = [[NSString alloc] initWithString:@"foo"];
NSLog(@"%@", foo);
for (int i=0; i<4; i++) {
}
}
-(void)bar2
{
NSString* foo = [[NSString alloc] initWithString:@"foo"];
NSLog(@"%@", foo);
}
静的文字列のケースは「過度に考案されている」と述べている人もいます。このあまり工夫されていない例は、同じ動作を示しています。
-(void)bar1
{
NSString* foo = [[NSString alloc] initWithFormat:@"%d",rand()];
NSLog(@"%@", foo);
for (int i=0; i<4; i++) {
}
}
-(void)bar2
{
NSString* foo = [[NSString alloc] initWithFormat:@"%d",rand()];
NSLog(@"%@", foo);
}
反復回数が影響することを指摘してくれた方々に感謝します。3 ではリークを報告し、4 では報告しません。これはデッド コードのない新しい例で、反復の違いのみがあります。
リークを報告します:
-(void)bar1
{
int i=0;
while (i<3) {
i++;
}
NSString* foo = [[NSString alloc] initWithFormat:@"%d",i];
NSLog(@"%@", foo);
}
リークを報告しません:
-(void)bar2
{
int i=0;
while (i<4) {
i++;
}
NSString* foo = [[NSString alloc] initWithFormat:@"%d",i];
NSLog(@"%@", foo);
}
私の意見では、この洗練された例は、これがアナライザーのバグであることを明確に示しているため、Apple で DTS チケットをオープンしました。
DTS から、 https: //bugreport.apple.comでバグとして開くように依頼されました。問題 ID 13491388 です。
更新 2013 年 3 月 29 日: Apple は、私のバグ 13491388 がバグ 11486907 の偽物であると報告しています。しかし、バグ 11486907 を開いたり読んだりすることができないため、その情報はまったく役に立ちません。
Apple 開発者サポート FAIL :-(