Я нахожусь на финальной стадии моего первого проекта iphone SDK. Я работаю трудно удалить утечки памяти из моего приложения, и в основном преуспел в этом. Но там я борюсь с одним из них. У меня есть экран контактов с кнопкой, которая выбирает веб-просмотр, но только при наличии сетевого подключения. Если не появляется предупреждение. Это прекрасно работает на практике, но l-e-a-k-s.
Все утечки указывают на одно и то же место в коде. Вот первый пример кода (инструменты указывают на первую из этих строк):
BOOL nett=[self connectedToNetwork];
if (!nett)
{
errorView=[[UIAlertView alloc] initWithTitle:@"Netverksfeil" message:@"Nettet er nede" delegate:self
cancelButtonTitle:@"Filler´n!" otherButtonTitles:nil];
[errorView show];
[errorView release];
}
else{
iCodeBrowserViewController *browserView=[[iCodeBrowserViewController alloc]initWithNibName:@"iCodeBrowserViewController" bundle:[NSBundle mainBundle]];
[[self navigationController] pushViewController:browserView animated:YES];
[browserView release];
}
Полагаю, это означает, что утечка находится где-то внутри этой функции ...
Следующие спотовые инструменты, на которые указывает инструмент, находятся в этом примере:
// Создать ноль адди
- (BOOL) connectedToNetwork{ struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
// Recover reachability flags
SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
SCNetworkReachabilityFlags flags;
BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
CFRelease(defaultRouteReachability);
if (!didRetrieveFlags)
{
printf("Error. Could not recover network reachability flags\n");
return 0;
}
BOOL isReachable = flags & kSCNetworkFlagsReachable;
BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
BOOL nonWiFi = flags & kSCNetworkReachabilityFlagsTransientConnection;
return ((isReachable && !needsConnection) || nonWiFi) ?
(([[[NSURLConnection alloc] initWithRequest:[NSURLRequest
requestWithURL: [NSURL URLWithString:@"http://www.apple.com/"]
cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0]
delegate:self]autorelease]) ? YES : NO) : NO;}
Эта строка будет конкретной:
return ((isReachable && !needsConnection) || nonWiFi) ?
Кто-нибудь из вас может видеть, что просачивается в этот код? Я скопировал эту часть откуда-то еще, и мне удалось немного изменить ее. Но я должен признать, что не понимаю весь код этой функции ...