加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – 如何修复内存泄漏?

发布时间:2020-12-14 17:55:56 所属栏目:百科 来源:网络整理
导读:在进行长轮廓测试后,我发现在我的一个“.m”文件中,内存泄漏发生在viewdidload部分.我查了一下,xcode突出显示了我用值初始化选择器数组的部分.我的程序使用拣货员进行用户输入.我的程序中有3 5个不同的视图.第一个是免责声明,第二个是用户可以选择他/她想要
在进行长轮廓测试后,我发现在我的一个“.m”文件中,内存泄漏发生在viewdidload部分.我查了一下,xcode突出显示了我用值初始化选择器数组的部分.我的程序使用拣货员进行用户输入.我的程序中有3 5个不同的视图.第一个是免责声明,第二个是用户可以选择他/她想要做的计算类型的菜单.每次计算都需要用户从选择器输入的某些输入.例如.其中一个视图有5个输入,由5个不同的uipickers处理,带有用于保存值的单独数组.这些数组使用该视图的viewdidload方法中的值进行初始化.这是我在运行测试后发现的:

?
………………………………………….. ………………………………………….

这是我第一次开发应用程序时,我对于该怎么做感到困惑.任何帮助,将不胜感激.

解决方法

目标c中的对象具有保留计数.如果当对象超出范围时(当您停止使用它时)此保留计数大于0,则它会泄漏.

以下事项会增加保留计数

> [[alloc] init]
>新的
>复制
> [保留]
>将对象添加到数组中
>将对象添加为子对象(例如视图)
>可能还有更多,但您似乎没有在代码中使用任何其他内容

以下减少了保留计数

> [发布]
>从数组中删除对象
>如果你释放一个数组,它的所有对象都会被释放

您应该检查代码并确保数组的每个保留或添加都与相应的版本匹配. (您可以在dealloc方法中释放成员变量).

编辑:杰里米提出了一个有效的观点,我的答案没有

Once you add an object to an array,it takes ownership and will release the object when it is done with it. All you need to do is make sure you release anything you own according to the memory management rules

还有自动释放对象,看看这个例子;

-(init){
    ...
    stagePickerArray = [[NSMutableArray alloc] init];
    for (int i = 0; i < 3; i++)
    {
        //this string is autoreleased,you don't have call release on it.
        //methods with the format [CLASS CLASSwithsomething] tend to be autorelease
        NSString *s = [NSString stringWithFormat:@"%d",i);
        [stagePickerArray addObject:s];
    }
    ...
 }

我认为你唯一缺少的就是在你的dealloc方法中调用release

-(void) dealloc
{
    [stagepickerarray release];  //Do this for each of your arrays
    [super dealloc];
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读