UIView的animation和内存释放

来源:互联网 发布:截取动态图片软件 编辑:程序博客网 时间:2024/06/05 06:03
应用中有这样一个操作,向主视图中分配一个subview,然后添加subview,再使用动画方式退出subview,最后remove掉。
这个过程内存使用量应该时增加,减少这样一个过程,但是在调试时,发现应用内存使用逐步增加,从不释放。

它的实现代码如下所示:


// 日历视图弹出

- (void)slideInCalView:(UITextField *)textField

{

    if (_calView==nil) {

       _calView = [[XYCalendarView allocinitWithFrame:self.view.bounds andSelectedDate:[NSDate datebottomBar:YES];

//        _calView = [[XYCalendarView alloc] initComplexGridWithFrame:self.view.bounds andSelectedDate:[NSDate date] bottomBar:YES];

        

        _calView.delegate = self;

    }

    

    _calView.frame=self.view.bounds;

    

    [self.view addSubview:_calView];

    

    [UIView animateWithDuration:0.4 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{

        _calView.frame = CGRectMake(00_calView.frame.size.width_calView.frame.size.height);

    } completion:^(BOOL finished) {

        

    }];


}

//// 日历视图关闭 使用delegate method

- (void)slideOutCalendarView:(XYCalendarDay *)selectedTileDay

{

    [UIView animateWithDuration:.5 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{

        _calView.frame = CGRectMake(0_calView.frame.size.height_calView.frame.size.width_calView.frame.size.height);

    } completion:^(BOOL finished) {

        [_calView removeFromSuperview];


    }];

    

    NSDateFormatter *dateFormatter = [[NSDateFormatter allocinit];

    [dateFormatter setDateFormat:@"yyyyMMdd"];

    NSString *strDate = [dateFormatter stringFromDate:selectedTileDay.calDate];

    

    //    GTMLoggerDebug(@"selectedTileDate is %@", strDate);

    

    _editingTextField.text=strDate;

    

    _calView=nil;

    

}



这个错误很隐蔽。
在视图划出屏幕下方后,界面已经看不到。正因为采用了划出动画操作,所以,将该视图设置为nil时,动画还没结束,导致动画结束时的removeFromSuperview发送给来一个nil对象。
所以该子视图还在主视图上,内存还占用。
将nil操作放到动画完成后执行,则内存恢复正常。


    [UIView animateWithDuration:.5 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{

        _calView.frame = CGRectMake(0_calView.frame.size.height_calView.frame.size.width_calView.frame.size.height);

    } completion:^(BOOL finished) {

        [_calView removeFromSuperview];

        NSDateFormatter *dateFormatter = [[NSDateFormatter allocinit];

        [dateFormatter setDateFormat:@"yyyyMMdd"];

        NSString *strDate = [dateFormatter stringFromDate:selectedTileDay.calDate];

        

        //    GTMLoggerDebug(@"selectedTileDate is %@", strDate);

        

        _editingTextField.text=strDate;

        

        _calView=nil;

    }];



奇怪的一点是,释放内存的代码是removeFromSuperview 而不是nil.


不对,还是nil释放内存,只是没有remove掉,表示还有对象在使用它,所以nil时不释放内存。


这里是没有remove掉,那么nil也不会成功。


subview设置为nil后,却没有removefromsuperview,那么占有的内存还在。这就导致来内存泄漏。

非常隐蔽的内存泄漏。


正确的方式是:


先remove后nil才是正确的是否内存的方式。如果还向对象继续留在内存里,下次调用不用定义,这在 主视图退出时nil。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手上皮肤干燥起皮怎么办 脸上起皮怎么办还痒痒 店铺4周被释放了怎么办 炫舞账号忘了怎么办 椎基底供血不足怎么办? 脑动脉供血不足怎么办 颈椎引起的脑供血不足怎么办 军人保障卡怎么办假的 正常形态精子率低怎么办 前向运动精子21怎么办 前向运动精子22%怎么办 前向运动精子19%怎么办 前向运动精子为0怎么办 被蝎子草扎了怎么办 二年级孩子成绩差怎么办 长治医保卡丢了怎么办 农商银行倒闭钱怎么办 2相电变3相电怎么办 电机六根线乱了怎么办 三相电零线带电怎么办 孕30周胎盘偏厚怎么办 偏侧咀嚼大小脸怎么办 咀嚼导致的脸歪怎么办 30岁了不想长大怎么办 4岁宝宝沉迷手机怎么办 我沉迷于了游戏怎么办 学生小红本丢了怎么办 小学玩6年初中怎么办 鼻炎喘不过来气怎么办 面对素质低的人怎么办 对没素质的人怎么办 爸妈吵架要离婚怎么办 爸妈为钱吵架怎么办 50岁父母闹离婚怎么办 父母吵架要离婚我该怎么办 爸妈40几了打架怎么办 爸妈打架我该怎么办 17岁心理有问题怎么办 孩子被同学打了怎么办 小孩被同学打了怎么办 有个强势的妈妈怎么办