名前が実際にリークされているわけではなく、リリースされていると思っているときにリリースされていないだけだと思います。ARC の下では、 をscanUpToString:intoString:
使用するメソッドと同様に定義されると思いますNSError
。つまり、かかるNSString * __autoreleasing *
。したがって、渡された値は実際には自動解放され、現在の自動解放プールが空になるまで解放されません。他に何も点在していないと仮定すると、それは実行ループが再び回る時です。そのメモリ使用量が問題になる場合は、ループの周りに明示的な自動解放プールを配置して、オブジェクトがすぐに消えるようにすることができます。
NSScanner *scanner = [[NSScanner alloc] initWithString:query];
[scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"&?"]];
@autoreleasepool
{
NSString *parameterString = [NSString new];
while ([scanner scanUpToString:ampersand intoString:¶meterString])
{
NSScanner *parameterScanner = [[NSScanner alloc] initWithString:parameterString];
NSString *name = [NSString new];
[parameterScanner scanUpToString:isEqual intoString:&name];
NSString *value = [parameterString substringFromIndex:([name length] + 1)];
[parameters setObject:value forKey:name];
}
}
ただし、これはおそらく不要であり、実行ループはとにかくオブジェクトをクリアします。
とはいえ、コンパイラが追加の一時変数を作成していることを意味する小さな問題がまだ残っています。変数name
は暗黙的__strong
に であるため、コンパイラは一時変数を挿入し__autoreleasing
、値をコピーします。NSString
を自動解放として明示的に宣言することで、これを回避できます。init
また、rckoeness が言ったように、それscanUpToString:intoString:
を行う必要はありません__autoreleasing
。(詳細については、 http://developer.apple.com/library/mac/ipad/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.htmlを参照してください)。
したがって、全体として、実際にはコードを次のようにしたいと思います。
NSScanner *scanner = [[NSScanner alloc] initWithString:query];
[scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"&?"]];
NSString __autoreleasing *parameterString = nil;
while ([scanner scanUpToString:ampersand intoString:¶meterString])
{
NSScanner *parameterScanner = [[NSScanner alloc] initWithString:parameterString];
NSString __autoreleasing *name = nil;
[parameterScanner scanUpToString:isEqual intoString:&name];
NSString *value = [parameterString substringFromIndex:([name length] + 1)];
[parameters setObject:value forKey:name];
}
それが役立つことを願っています!
私は別の考えを持っていました、おそらくname
単に赤いニシンです. リークは、割り当てが発生した場所を示しますが、name
に追加されると、このループを超えて存在し続けますparameters
。NSMutableDictionary
セレクターに基づいて、または類似していると思います。私があなただったらname
、その辞書 (または後で辞書からそれらのキーを読み取るもの) が漏洩しているため、インスタンスが漏洩していないことを確認します。