一直对NSTimer有过使用,但是没有研究过.但是这次发现, 出现了循环引用的现象,NSTimer并没有被释放,NSTimer初始化时要指定self为target,NSTimer强引用了self,然后就并不会走到self的dealloc里面,所有如果把释放操作放在dealloc里是不会被调用的。。
释放NSTimer要做两个操作 [timer invalidate] 和 timer = nil;
一般会在dealloc做这个操作,但是代码走不到这个方法里去。但是我这里的target是视图控制器,所以我选择的是在viewwillDisappear里做这个操作,然后解决了我的问题.
然后在论坛上看了一篇帖子,非常详细讲了几个方法。
他的思路就是强引用有问题,那就使用弱引用来试试.这里就想到了block里避免循环引用的使用法。但是在block中,block是对变量进行捕获,意思是对使用到的变量进行拷贝操作,注意是拷贝的不是对象,而是变量自身,,block中只是对变量wself拷贝了一份,也就是说,block中也定义了一个weak对象,相当于,在block的内存区域中,定义了一个__weak blockWeak对象,然后执行了blockWeak = wself;注意到了没,这里并没有引起对象的持有量的变化,所以没有问题,再看timer的方式,虽然你是将wself传入了timer的构造方法中,我们可以查看NSTimer的定义,其target的说明The object to which to send the message specified by aSelector when the timer fires. The timer maintains a strong reference to this object until it (the timer) is invalidated,是要强应用这个变量的 也就是说,大概是这样的, __strong strongSelf = wself 强引用了一个弱应用的变量,结果还是强引用,也就是说strongSelf持有了wself所指向的对象(也即是self所只有的对象),这和你直接传self进来是一样的效果,并不能达到解除强引用的作用!
于是想到建立一个临时对象,也就是创造一个target,让他来接下NSTimer的强引用,让Timer强用用这个临时对象,在这个临时对象中弱引用self。
关于GCD的有些地方暂时不是很懂.
网友评论