iOS - ARC环境下dealloc/didReceiveMemoryWarning

block没那么难(三):block和对象的内存管理

一、iOS开发 ARC下dealloc的使用

ARC下,系统可以帮我们释放该对象,及其包含的对象;
但是却无法释放不属于该对象的一些东西,如:

  • 1.通知的观察者,或KVO的观察者

  • 2.对象强委托/引用的解除(例如XMPPMannerger的delegateQueue)
    对于其他的对象来把你当做委托 delegate时,并且是 强引用时,即时你自身被释放,但是引用你的对象依然还在,
    这时需要在引用你的对象移除该delegate

  • 3.做一些其他的注销之类的操作(关闭程序运行期间没有关闭的资源)
    一个对象,如一个ViewController在销毁之前有可能需要和server打交道;
    这时我们也可以在dealloc中写

关于dealloc的底层实现,可以参照objc运行时代码

- (void)dealloc  
{  
    [super dealloc];
    [[NSNotificationCenter defaultCenter] removeObserver:self];  //移除通知观察者  
    [[XMPPManager sharedManager] removeFromDelegateQueue:self];  //移除委托引用  
    [[MyClass shareInstance]  doSomething ];  //其他操作  
}  

二、viewController被POP后不调用dealloc的问题

  • viewController被POP后不调用dealloc的问题
  • controller 不能释放,不走dealloc方法的4种可能

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

你可能感兴趣的:(iOS - ARC环境下dealloc/didReceiveMemoryWarning)