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