2014-02-17 3 views
0

В моем проекте я реализовал анимацию тикера, которая прокручивает текст по горизонтали.UIViewAnimation Увеличить память

Моя проблема в том, что когда я перехожу в другую память, диспетчер управления начинает постоянно увеличиваться.

вот мой код тикер анимации

-(void)scrollTheBreakingNews 
{ 

if (isTicker) 
{ 
    self.ticker.text = textToScroll; 

    if (!pauseTicker) 
    { 
     if (isTicker) 
     { 
      NSAttributedString *str = [[NSAttributedString alloc]initWithString:textToScroll]; 

      CGSize textSize = [str size]; 

      if (isTicker) 
      { 
       float duration = (textSize.width + self.tickerView.frame.size.width)/65.0f; 

       float startingX=0.0f; 
       float endX=0.0f; 

       if (isTicker) 
       { 
        self.ticker.frame = scrollLabelFrame; 
        if (isTicker) 
        { 
         startingX = self.tickerView.frame.size.width; 
         endX = -textSize.width; 
         if (isTicker) 
         { 
          self.ticker.frame = CGRectMake(startingX, 0.0f, textSize.width, 25.0f); 

          [UIView beginAnimations:@"" context:nil]; 
          [UIView setAnimationCurve:UIViewAnimationCurveLinear]; 
          [UIView setAnimationDuration:duration]; 
          [UIView setAnimationDelegate:self]; 
          [UIView setAnimationDidStopSelector:@selector(tickerStop)]; 

          if (isTicker) 
          { 
           CGRect tickerFrame = self.ticker.frame; 
           tickerFrame.origin.x = endX; 
           if (isTicker) 
           { 
            [self.ticker setFrame:tickerFrame]; 
            [UIView commitAnimations]; 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

} 

-(void)tickerStop 
{ 
    if (isTicker) 
    { 
     if (!pauseTicker) 
     { 
      [self scrollTheBreakingNews]; 
     } 

    } 
    else 
    { 
     textToScroll=nil; 
    } 
} 

памяти выглядит следующим образом:

пожалуйста, помогите мне решить эту проблему. любые предложения оценены. заранее спасибо

+0

Кнопка «Профиль в инструментах» помещается туда по какой-либо причине, вы можете использовать ее, чтобы увидеть, что занимает память. –

+0

Я не очень знаком с профилированием. я профилировал мое приложение, но я не мог найти, какой объект использует больше памяти. –

+2

Это довольно интуитивно понятный инструмент для использования, но вы можете проверить документацию для начала работы: [About Instruments] (https://developer.apple.com/ библиотека/ios/documentation/developertools/conceptual/instrumentsuserguide/Introduction/Introduction.html), [Поиск проблем памяти в вашем приложении] (https://developer.apple.com/library/ios/documentation/developertools/conceptual/instrumentsuserguide/ MemoryManagementforYouriOSApp/MemoryManagementforYouriOSApp.html # // apple_ref/DOC/UID/TP40004652-CH11-SW1). –

ответ

1

ОК, первое, что нужно ... ничего себе, вам нужно улучшить стиль кода.

Lemme есть.

Во-вторых, прекратите использовать этот код анимации старого стиля. Документы даже говорят, что не используют его с iOS 4.0.

-(void)scrollTheBreakingNews 
{ 
    //You are already checking isTicker here there is 
    //no reason to check it another SEVEN times inside this block. 
    if (isTicker) 
    { 
     self.ticker.text = textToScroll; 

     if (!pauseTicker) 
     { 
      NSAttributedString *str = [[NSAttributedString alloc] initWithString:textToScroll]; 

      CGSize textSize = [str size]; 

      float duration = (textSize.width + self.tickerView.frame.size.width)/65.0f; 

      float startingX=0.0f; 
      float endX=0.0f; 

      self.ticker.frame = scrollLabelFrame; 
      startingX = self.tickerView.frame.size.width; 
      endX = -textSize.width; 
      self.ticker.frame = CGRectMake(startingX, 0.0f, textSize.width, 25.0f); 

      CGRect tickerFrame = self.ticker.frame; 
      tickerFrame.origin.x = endX; 

      [UIView animateWithDuration:duration 
            delay:0.0 
           options:UIViewAnimationOptionsCurveLinear 
          animations:^(){ 
           self.ticker.frame = tickerFrame 
          } 
          completion:^(BOOL finished){ 
           [self tickerStop]; 
          }]; 
     } 
    } 
} 

-(void)tickerStop 
{ 
    if (!pauseTicker 
     && isTicker) { 
     [self scrollTheBreakingNews]; 
    } 
    else { 
     textToScroll=nil; 
    } 
} 

Что касается проблемы с памятью. Я бы предложил найти, какая часть кода вызывает проблему, профилируя приложение с помощью инструментов.

Возможно, вы все равно улучшите использование памяти? Может быть, но не на 100% уверен в этом.

+0

ОК. Попробуй попробовать свой фрагмент ... :-), и я признаю, что мой стиль кодирования низок :-(и я определенно улучшусь :-) –

+0

Не беспокойтесь. Если ничего больше, это упростит обслуживание вашего приложения. Просматривая 8 различных операторов if, которые проверяют одно и то же, добавляет сложности без причины. – Fogmeister

+0

@MusadhikhMuhammedK учтите, что я просто удалил строку перед блоком анимации. Вам также нужно будет сделать это, если у вас есть копия/вставка моего кода. – Fogmeister

0

Возможно, я не должен критиковать, но стиль кодирования не очень хорош, и это может создать массу неприятностей в будущем. Я предполагаю, что вы пытаетесь остановить анимацию, если isTicker установлен на false, возможно, в результате действий пользователя.

Просто проверьте значение isTicker один раз перед анимацией. Интервалы вы проверяете свою ценность настолько малы, так или иначе

if (isTicker) 
{ 
    float duration = (textSize.width + self.tickerView.frame.size.width)/65.0f; 
    float startingX=0.0f; 
    float endX=0.0f; 

    if (isTicker) 

Это займет устройство несколько миллисекунд, чтобы проверить значение isTicker дважды здесь, например.

Вы должны обязательно изменить стиль кодирования, моя догадка о увеличенном потреблении памяти ниже приведенного ниже фрагмента. Вы начинаете анимацию, но тогда, если isTicker установлен в FALSE, анимации не выполняются, создается контекст анимации, но он не завершен, и, возможно, все еще сохраняется в памяти.

[UIView beginAnimations:@"" context:nil]; 
         [UIView setAnimationCurve:UIViewAnimationCurveLinear]; 
         [UIView setAnimationDuration:duration]; 
         [UIView setAnimationDelegate:self]; 
         [UIView setAnimationDidStopSelector:@selector(tickerStop)]; 

         if (isTicker) 
         { 
          CGRect tickerFrame = self.ticker.frame; 
          tickerFrame.origin.x = endX; 
          if (isTicker) 
          { 
           [self.ticker setFrame:tickerFrame]; 
           [UIView commitAnimations]; 
          } 
         } 
Смежные вопросы