Пытаюсь выяснить, является ли это утечкой памяти: Xcode

#iphone #objective-c #ios #xcode

#iPhone #objective-c #iOS #xcode

Вопрос:

У меня есть следующий метод, и я хотел бы знать, если бы я запустил это сто раз, была бы это утечка памяти.

 -(void)displayPointsOnBoard:(int)wordPoints atCoor:(NSNumber*)coor{

    NSLog(@"%i", wordPoints); 

    CGPoint p = [[points objectForKey:[coor stringValue]] CGPointValue];
    UIImageView* pointDisplay = [[UIImageView alloc] initWithFrame:CGRectMake((p.x - 15), (p.y - 35), 76.f, 40.f)];
    pointDisplay.backgroundColor = [UIColor clearColor];
    pointDisplay.image = [UIImage imageNamed:@"point_display_box.png"];
    [self addSubview:pointDisplay];

    [UIView beginAnimations:@"" context:NULL]; // Begin animation
    [UIView setAnimationDuration:.4];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    pointDisplay.frame = CGRectOffset(pointDisplay.frame, 0.f, -35.f);
    [UIView commitAnimations]; // End animations

    [UIView beginAnimations:@"" context:NULL]; // Begin animation
    [UIView setAnimationDuration:.3];
    [UIView setAnimationDelay:.3];
    pointDisplay.alpha = 0;
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    [UIView setAnimationDidStopSelector:@selector(removeDisplay:)];
    [UIView commitAnimations]; // End animations

    [pointDisplay release];
}
  

Я выпускаю pointDisplay , но он все еще у меня на виду (хотя его альфа равна 0.0). И мне интересно, может ли это вызвать проблемы. Любая помощь была бы потрясающей! Спасибо!

Комментарии:

1. Я не думаю, что это приведет к утечке памяти, но почему бы вам не удалить его из супервизора?

Ответ №1:

Это не приведет к утечке памяти, управление памятью на нем выглядит нормально … если вы вызовете это 100 раз, ваша память будет продолжать увеличиваться, но это не будет считаться утечкой, потому что, если вы отпустите добавляемое представление, UIImageViews также будут выпущены… Утечка памяти возникает, когда вы выделяете какой-либо объект или данные, а затем не можете освободить их позже … например

 -(void)blah
{
   NSString *s=[[NSString alloc] init];

}
  

вышеизложенное приведет к утечке памяти, поскольку метод создает строку с количеством ссылок 1, когда метод завершается, у вас больше нет ссылки на строку, поэтому вы не сможете ее освободить, и система не восстановит память, выделенную для string..in ваш пример, тотДобавляемый вами UIView сохраняет UIImageView, но когда вы выпускаете UIView, все UIImageViews на нем также будут выпущены.

Надеюсь, это поможет

Ответ №2:

 [pointDisplay release];
  

Противодействует

 UIImageView* pointDisplay = [[UIImageView alloc] initWithFrame:CGRectMake((p.x - 15), (p.y - 35), 76.f, 40.f)];
  

Затем добавляем вложенное представление

 [self addSubview:pointDisplay];
  

увеличил количество сохранений pointDisplay; соответствующий релиз будет автоматически отправлен в pointDisplay при удалении из его супервизора или при освобождении self (UIView автоматически освобождает свои подпросмотры в своем dealloc). Тот факт, что он имеет 0.0 alpha или скрыт, не имеет никакого значения.

Ответ №3:

если вы хотите избавиться от pointdisplay из вашего представления, см. Ниже Код

 [pointDisplay removeFromSuperView];
  

Ответ №4:

ЕСЛИ вы копируете, выделяете или создаете один раз, вы выпускаете только один раз.

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html