私はカスタムボタンを作成する以下の機能を持っています。私が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];
}
まず、ボタンが実際に原因であることを確認します。 – Kreiri
なぜそれを多くのイベントにバインドする必要がありますか? – thedp
@Kreiriはい、私はこれに絞った。ボタン作成コード全体のチャンクを無効にします。メモリは増えません。 – lppier