2016-12-08 7 views
1

私はカスタムボタンを作成する以下の機能を持っています。私がinitKeyboard()を呼び出すたびに、それは14回呼び出されます。私のアプリケーションの途中で、ユーザーはinitKeyboardを何度も呼び出すボタンを押します。ユーザーがボタンを押すたびに、私はclearButtonArray()を呼び出します。効果的にUIButtonメモリを解放します

私は、使用中のメモリが徐々に増加していることに気付きました.200MB程度になると、アプリで視覚的な減速が見られます。アニメーションはスムーズではありません。

私の質問は、毎回14個のボタンで使用されるメモリをどのように効果的に解放するのですか。 clearButtonArray()はそのジョブを実行していないようです。

私はARCを使用しています。

ありがとうございました。

- (void)initKeyboard:(int)scaleNo 
{ 
    [self clearButtonArray]; 
    // call createGlideButton 14 times... 
} 

- (void)createGlideButton:(int)noteVal 
          string:(NSString *)noteStr 
          keyMod:(int)key 
         chromatic:(BOOL)chrOn 
           x:(int)xPos 
           y:(int)yPos 
{ 

    GlideButton *button = [GlideButton buttonWithType:UIButtonTypeCustom]; 
    [button setTag:noteVal + key]; 
    [button setUserInteractionEnabled:YES]; 
    [button addTarget:self 
       action:@selector(notePressedDown:withEvent:) 
    forControlEvents:UIControlEventTouchDown]; 
    [button addTarget:self 
       action:@selector(notePressedUp:withEvent:) 
    forControlEvents:UIControlEventTouchUpInside]; 
    [button addTarget:self 
       action:@selector(notePressedUp:withEvent:) 
    forControlEvents:UIControlEventTouchUpOutside]; 
    [button addTarget:self 
       action:@selector(notePressedUp:withEvent:) 
    forControlEvents:UIControlEventTouchDragExit]; 

    [button addTarget:self 
       action:@selector(notePressedUp:withEvent:) 
    forControlEvents:UIControlEventTouchCancel]; 
    [button addTarget:self 
       action:@selector(notePressedUp:withEvent:) 
    forControlEvents:UIControlEventTouchDragOutside]; 

    UIImage *buttonbkImage = [UIImage imageNamed:@"TF8UIElements_smallKeysBtn"]; 
    UIImage *buttonlightImage = [UIImage imageNamed:@"TF8_smallKeysBtnBright"]; 
    [button setBackgroundImage:buttonbkImage forState:UIControlStateNormal]; 
    [button setBackgroundImage:buttonlightImage 
         forState:UIControlStateHighlighted]; 

    [KeyboardView addSubview:button]; 
    [_buttonArray addObject:button]; 


} 

-(void)clearButtonArray 
{ 
     for (int i=0; i < [_buttonArray count]; i++) 
     { 
      [[_buttonArray objectAtIndex:i] removeFromSuperview]; 
      [[_buttonArray objectAtIndex:i] setImage:nil forState:UIControlStateNormal]; 
      [[_buttonArray objectAtIndex:i] setImage:nil forState:UIControlStateHighlighted]; 
     } 
     [_buttonArray removeAllObjects]; 
} 
+0

まず、ボタンが実際に原因であることを確認します。 – Kreiri

+0

なぜそれを多くのイベントにバインドする必要がありますか? – thedp

+0

@Kreiriはい、私はこれに絞った。ボタン作成コード全体のチャンクを無効にします。メモリは増えません。 – lppier

答えて

0

UIButtonのすべてのターゲットを削除してから参照しないようにしてください。

[[_buttonArray objectAtIndex:i] removeTarget:nil 
        action:NULL 
     forControlEvents:UIControlEventAllEvents]; 

私は、forループで一度にKeyboardViewからではなく、それらをすべて削除することをお勧めします。だから、

KeyboardViewが唯一のサブビューとしてボタンを持っている場合:本当に

[[KeyboardView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; 
[_buttonArray removeAllObjects]; 
+0

そこに運がない..私はまだメモリが上昇するのを見ます。たぶん私はボタンを作成し破壊する代わりに常にボタンを見つけるべきでしょうか? – lppier

0

ない答えを、しかし最終的に、私は初期化時に一度だけunbuttonsを作成し、自分のニーズに従ってボタンのプロパティを変更。

関連する問題