当程序莫名其妙不出效果、不按正常逻辑运行时,检查各实例对象是否被有效持有,是否创建后即被自动释放?

昨天在封装一个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技术博客的原创作品 ,转载时必须注明出处及相应链接!

你可能感兴趣的:(当程序莫名其妙不出效果、不按正常逻辑运行时,检查各实例对象是否被有效持有,是否创建后即被自动释放?)