美文网首页
当程序莫名其妙不出效果、不按正常逻辑运行时,检查各实例对象是否被

当程序莫名其妙不出效果、不按正常逻辑运行时,检查各实例对象是否被

作者: JerryLMJ | 来源:发表于2016-03-17 18:04 被阅读204次

    昨天在封装一个AlertView的时候脑子一热继承了NSObject,原本思路是封装的AlertView直接添加到AppDelegate的根视图上,因此就继承了NSObject

    LMJTitleContentAlertView * alertView = [[LMJTitleContentAlertView alloc] initWithTitles:@[@"关闭"]];
    alertView.title   = @"年化收益";
    [alertView setContent:@"~~~~~~~~~~~~~~~~"];
    [alertView show];
    

    结果在后续设置AlertView样式的时候各种无效,添加的手势和button都不响应。

    后来才发现由于封装的AlertView继承自NSObject,创建后没有任何对象对其进行持有。最后还是将继承于NSObject改为继承UIView,同时感觉封装的一个控件继承于NSObject还是很奇怪的,而且系统的UIAlertView也是继承于UIView

    由于平时使用控件的习惯,创建后调用addSubview:函数并没有过多的进行内存管理的操作,因为addSubview:也是对控件对象的持有。所以很多时候想当然的忽略了实例对象的持有问题。在ARC模式下不被持有的对象会被立即释放,这样就会导致我们实例的对象失效,而我们还沉浸在“我的代码没有任何问题啊”当中。

    {
        LMJTitleContentAlertView * _alertView;
    }
    

    或者

    @property (nonatomic,strong) LMJTitleContentAlertView * alertView;
    

    如果将alertView设置成一个成员变量,该对象将以属性的方式被持有了,就不会因为没被持有而自动释放了。

    提醒:写这篇博客的目的就是想提醒大家也包括我自己,在ARC模式下一定要对我们创建的实例对象的内存周期了然于心,不要被ARC的简便蒙蔽了双眼


    今天又被这个问题给捉弄了,在使用UIDynamicAnimator对象一直没有动画效果出现,后来发现UIDynamicAnimator对象没有被任何对象持有,结果就造成UIDynamicAnimator对象创建后即被释放,所以一直不出动画效果,所以说在内存管理方面还是需要更加细心。

    版权声明:出自MajorLMJ技术博客的原创作品 ,转载时必须注明出处及相应链接!

    相关文章

      网友评论

          本文标题:当程序莫名其妙不出效果、不按正常逻辑运行时,检查各实例对象是否被

          本文链接:https://www.haomeiwen.com/subject/lchclttx.html