Ios 有效释放UIButton内存

Ios 有效释放UIButton内存,ios,objective-c,uibutton,Ios,Objective C,Uibutton,我有以下创建自定义按钮的功能。每次调用initKeyboard(),它都会被调用14次。在我的应用程序中,用户按下一个按钮,多次调用initKeyboard。每次用户按下按钮时,我都调用clearButtonArray() 我注意到使用的内存逐渐增加,当它达到200MB左右时,我确实看到我的应用程序中出现了一些视觉减速。动画不平滑等 我的问题是,如何有效地释放14个按钮每次使用的内存。看起来clearButtonArray()没有完成这项工作 我正在使用ARC 谢谢你的帮助 - (void)in

我有以下创建自定义按钮的功能。每次调用initKeyboard(),它都会被调用14次。在我的应用程序中,用户按下一个按钮,多次调用initKeyboard。每次用户按下按钮时,我都调用clearButtonArray()

我注意到使用的内存逐渐增加,当它达到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];
}
-(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是的,我将其缩小到了这个范围。禁用整个按钮创建代码块,没有内存增加。没有运气。。我仍然看到记忆在上升。也许我应该找到一个替代品,来取代一直在创建和销毁按钮的做法?没有运气。。我仍然看到记忆在上升。也许我应该找到一个替代方法,来代替一直创建和销毁按钮?