이, 그것은 단순히 해제되지 않는 초기화 할 이유가 없다. ARC에서는 을 사용하는 방법과 비슷하게 scanUpToString:intoString:
을 정의한다고 생각합니다. 즉, 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
을 자동 리사이징으로 명시 적으로 선언하면이 문제를 피할 수 있습니다. 당신은 scanUpToString:intoString:
이 당신을 위해 그것을하고 있기 때문에 당신은 또한 init
을 필요로하지 않습니다. (이것은 왜 __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
은 단순히 붉은 청어입니다. 누출은 할당이 발생한 위치를 표시하지만 parameters
에 추가되면 name
은이 루프를 넘어서 계속 존재합니다. 선택자에 따라 NSMutableDictionary
또는 그와 비슷한 것으로 추정됩니다. 내가 당신이라면 name
인스턴스가 유출되지 않았 음을 확인할 것입니다. 사전 (또는 사전에서 해당 키를 읽는 것이 누출 됨)이 유출되고 있기 때문입니다.
계측기 누출 도구를 통해이 누출이 보입니까? 그런 경우 하단 패널로 이동하여 표시 옵션을 누수에서 사이클 및 루 트로 변경하여 새 유지주기 감지 도구를 표시합니다. 유지 보수주기가 ARC 하에서이 누출의 원인이되는지를 알 수 있습니다. 또한 Allocations 도구에서 힙 샷 기능을 사용하여 위 코드에 대해 각 패스에 대해 정확하게 누출 된 객체를 확인할 수 있습니다. –
이름 변수가 누수되고, 위의 코드를 각각 넘깁니다. 어떤 솔루션을 어떻게 해결할 수 있습니까? – Thys