一、iOS开发 ARC下dealloc的使用
ARC下,系统可以帮我们释放该对象,及其包含的对象;
但是却无法释放不属于该对象的一些东西,如:
1.通知的观察者,或KVO的观察者
2.对象强委托/引用的解除(例如XMPPMannerger的delegateQueue)
对于其他的对象来把你当做委托 delegate时,并且是 强引用时,即时你自身被释放,但是引用你的对象依然还在,
这时需要在引用你的对象移除该delegate3.做一些其他的注销之类的操作(关闭程序运行期间没有关闭的资源)
一个对象,如一个ViewController在销毁之前有可能需要和server打交道;
这时我们也可以在dealloc中写
关于dealloc的底层实现,可以参照objc运行时代码
- (void)dealloc
{
[super dealloc];
[[NSNotificationCenter defaultCenter] removeObserver:self]; //移除通知观察者
[[XMPPManager sharedManager] removeFromDelegateQueue:self]; //移除委托引用
[[MyClass shareInstance] doSomething ]; //其他操作
}
二、viewController被POP后不调用dealloc的问题
1.1、控制器中NSTimer
没有被销毁
当viewController中存在NSTimer时,需要特别注意,当调用
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES]
时,因为target:self
,也就是引用了当前viewController
,导致viewController控制器
的引用计数加1,如果没有将这个NSTimer
销毁,它将一直保留该viewController
,无法释放,也就不会调用dealloc
方法。所以,需要在viewWillDisappear
之前需要把控制器用到的NSTimer
销毁。
[timer invalidate]; // 销毁timer
timer = nil; // 置nil
1.2、viewController中的delegate不是weak属性
例如@property (nonatomic, weak) id delegate;
代理要使用弱引用,因为自定义控件是加载在视图控制器中的,视图控制器view对自定义控件是强引用
,如果代理属性设置为strong
,则意味着delegate
对视图控制器也进行了强引用
,会造成循环引用。导致控制器无法被释放,最终导致内存泄漏。
1.3、viewController中block的循环引用
在ARC下,block会把它里面的所有对象强引用,包括当前控制器self,因此有可能会出现循环引用的问题。比如viewController
中有个block
属性,在block
中又强引用了self或者其他成员变量,那么这个viewController
与自己的block
属性就形成循环引用,导致viewController
无法释放。
三、didReceiveMemoryWarning
http://blog.csdn.net/wangyanchang21/article/details/50730902