Я записал класс сети, который справляется со всеми сетевыми вызовами для моего приложения. Существует два метода showLoadingAnimationView
и hideLoadingAnimationView
это покажет, что UIActivityIndicatorView в представлении по моему текущему viewcontroller с исчезают фон. Я получаю утечки памяти где-нибудь на этих двух методах. Вот код
-(void)showLoadingAnimationView
{
textmeAppDelegate *textme = (textmeAppDelegate *)[[UIApplication sharedApplication] delegate];
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
if(wrapperLoading != nil)
{
[wrapperLoading release];
}
wrapperLoading = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 480.0)];
wrapperLoading.backgroundColor = [UIColor clearColor];
wrapperLoading.alpha = 0.8;
UIView *_loadingBG = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 480.0)];
_loadingBG.backgroundColor = [UIColor blackColor];
_loadingBG.alpha = 0.4;
circlingWheel = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
CGRect wheelFrame = circlingWheel.frame;
circlingWheel.frame = CGRectMake(((320.0 - wheelFrame.size.width) / 2.0), ((480.0 - wheelFrame.size.height) / 2.0), wheelFrame.size.width, wheelFrame.size.height);
[wrapperLoading addSubview:_loadingBG];
[wrapperLoading addSubview:circlingWheel];
[circlingWheel startAnimating];
[textme.window addSubview:wrapperLoading];
[_loadingBG release];
[circlingWheel release];
}
-(void)hideLoadingAnimationView
{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
wrapperLoading.alpha = 0.0;
[self.wrapperLoading removeFromSuperview];
//[NSTimer scheduledTimerWithTimeInterval:0.8 target:wrapperLoading selector:@selector(removeFromSuperview) userInfo:nil repeats:NO];
}
Вот то, как я называю эти два метода
[NSThread detachNewThreadSelector:@selector(showLoadingAnimationView) toTarget:self withObject:nil];
и затем где-нибудь позже в коде я использую следующий вызов функции скрыть анимацию.
[self hideLoadingAnimationView];
Я получаю утечки памяти, когда я вызываю функцию showLoadingAnimationView. Что-то не так в коде или является там какой-либо лучшей техникой для показа загружающейся анимации, когда мы делаем сетевые вызовы?
Метод showLoadingAnimationView
возвращает неавтоматически выпущенное представление (keepCount -> 1), которое вы позже (я предполагаю) добавляете в другое представление (keepCount -> 2) .
В hideLoadingAnimationView
вы удаляете только представление из его супервизора (keepCount -> 1). В этом методе отсутствует выпуск
. Это означает, что вы не должны вызывать release
в showLoadingAnimationView
.