Ios 有效释放UIButton内存
我有以下创建自定义按钮的功能。每次调用initKeyboard(),它都会被调用14次。在我的应用程序中,用户按下一个按钮,多次调用initKeyboard。每次用户按下按钮时,我都调用clearButtonArray() 我注意到使用的内存逐渐增加,当它达到200MB左右时,我确实看到我的应用程序中出现了一些视觉减速。动画不平滑等 我的问题是,如何有效地释放14个按钮每次使用的内存。看起来clearButtonArray()没有完成这项工作 我正在使用ARC 谢谢你的帮助Ios 有效释放UIButton内存,ios,objective-c,uibutton,Ios,Objective C,Uibutton,我有以下创建自定义按钮的功能。每次调用initKeyboard(),它都会被调用14次。在我的应用程序中,用户按下一个按钮,多次调用initKeyboard。每次用户按下按钮时,我都调用clearButtonArray() 我注意到使用的内存逐渐增加,当它达到200MB左右时,我确实看到我的应用程序中出现了一些视觉减速。动画不平滑等 我的问题是,如何有效地释放14个按钮每次使用的内存。看起来clearButtonArray()没有完成这项工作 我正在使用ARC 谢谢你的帮助 - (void)in
- (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];
}
-(void)initKeyboard:(int)scaleNo
{
[自动清除按钮阵列];
//呼叫createGlideButton 14次。。。
}
-(无效)createGlideButton:(int)noteVal
字符串:(NSString*)noteStr
keyMod:(int)键
彩色:(布尔)时间
x:(int)xPos
y:(int)yPos
{
GlideButton*button=[GlideButton按钮类型:UIButtonTypeCustom];
[按钮设置标签:noteVal+键];
[按钮setUserInteractionEnabled:是];
[按钮添加目标:自我
操作:@selector(注意:按下按钮:withEvent:)
forControlEvents:UIControlEventTouchDown];
[按钮添加目标:自我
操作:@selector(注意按UP:withEvent:)
forControlEvents:UIControlEventTouchUpInside];
[按钮添加目标:自我
操作:@selector(注意按UP:withEvent:)
forControlEvents:UIControlEventTouchUpOutside];
[按钮添加目标:自我
操作:@selector(注意按UP:withEvent:)
forControlEvents:UIControlEventTouchDragExit];
[按钮添加目标:自我
操作:@selector(注意按UP:withEvent:)
forControlEvents:UIControlEventTouchCancel];
[按钮添加目标:自我
操作:@selector(注意按UP:withEvent:)
对于控制事件:UIControlEventTouchDragOutside];
UIImage*ButtonKimage=[UIImage ImageName:@“TF8UIElements_smallKeysBtn”];
UIImage*buttonlightImage=[UIImage ImageName:@“TF8_smallKeysBtnBright”];
[按钮setBackgroundImage:ButtonKimage for状态:uicontrol状态正常];
[按钮设置背景图像:按钮灯光图像
forState:uicontrol状态突出显示];
[键盘视图添加子视图:按钮];
[\u buttonArray addObject:button];
}
-(无效)clearButtonArray
{
对于(int i=0;i<[u buttonArray count];i++)
{
[[u buttonArray objectAtIndex:i]从SuperView中移除];
[[[u buttonArray objectAtIndex:i]setImage:nil for状态:UIControlStateNormal];
[[u buttonArray objectAtIndex:i]setImage:nil for状态:uicontrol状态高亮显示];
}
[_buttonarrayremoveallobjects];
}
删除ui按钮的所有目标,然后再将其删除,以避免保留引用
[[_buttonArray objectAtIndex:i] removeTarget:nil
action:NULL
forControlEvents:UIControlEventAllEvents];
我建议立即从键盘视图
中将它们全部删除,而不要在for循环中
因此,如果键盘视图
仅将按钮作为子视图:
[[KeyboardView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
[_buttonArray removeAllObjects];
在删除ui按钮之前,请先删除它的所有目标,以避免保留引用
[[_buttonArray objectAtIndex:i] removeTarget:nil
action:NULL
forControlEvents:UIControlEventAllEvents];
我建议立即从键盘视图
中将它们全部删除,而不要在for循环中
因此,如果键盘视图
仅将按钮作为子视图:
[[KeyboardView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
[_buttonArray removeAllObjects];
这不是一个真正的答案,但最终我只在初始化时创建了一次取消按钮,并根据需要更改了按钮的属性 这不是一个真正的答案,但最终我在初始化时只创建了一次取消按钮,并根据需要更改了按钮的属性 首先确保你的按钮确实是原因。为什么你需要将它绑定到这么多事件?@Kreiri是的,我把它缩小到了这个范围。禁用整个按钮创建代码块,不会增加内存。首先,确保您的按钮确实是原因。为什么需要将其绑定到这么多事件?@Kreiri是的,我将其缩小到了这个范围。禁用整个按钮创建代码块,没有内存增加。没有运气。。我仍然看到记忆在上升。也许我应该找到一个替代品,来取代一直在创建和销毁按钮的做法?没有运气。。我仍然看到记忆在上升。也许我应该找到一个替代方法,来代替一直创建和销毁按钮?