? ? ? 一直對(duì)NSTimer有過(guò)使用,但是沒有研究過(guò).但是這次發(fā)現(xiàn), 出現(xiàn)了循環(huán)引用的現(xiàn)象,NSTimer并沒有被釋放,NSTimer初始化時(shí)要指定self為target,NSTimer強(qiáng)引用了self,然后就并不會(huì)走到self的dealloc里面,所有如果把釋放操作放在dealloc里是不會(huì)被調(diào)用的。桅狠。
? ? 釋放NSTimer要做兩個(gè)操作 [timer invalidate]? ?和 ?timer = nil;
一般會(huì)在dealloc做這個(gè)操作,但是代碼走不到這個(gè)方法里去絮重。但是我這里的target是視圖控制器,所以我選擇的是在viewwillDisappear里做這個(gè)操作,然后解決了我的問(wèn)題.
然后在論壇上看了一篇帖子,非常詳細(xì)講了幾個(gè)方法。
他的思路就是強(qiáng)引用有問(wèn)題,那就使用弱引用來(lái)試試.這里就想到了block里避免循環(huán)引用的使用法哼鬓。但是在block中,block是對(duì)變量進(jìn)行捕獲,意思是對(duì)使用到的變量進(jìn)行拷貝操作,注意是拷貝的不是對(duì)象,而是變量自身,,block中只是對(duì)變量wself拷貝了一份,也就是說(shuō),block中也定義了一個(gè)weak對(duì)象,相當(dāng)于,在block的內(nèi)存區(qū)域中,定義了一個(gè)__weak blockWeak對(duì)象,然后執(zhí)行了blockWeak = wself;注意到了沒,這里并沒有引起對(duì)象的持有量的變化,所以沒有問(wèn)題,再看timer的方式,雖然你是將wself傳入了timer的構(gòu)造方法中,我們可以查看NSTimer的定義,其target的說(shuō)明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,是要強(qiáng)應(yīng)用這個(gè)變量的 也就是說(shuō),大概是這樣的, __strong strongSelf = wself 強(qiáng)引用了一個(gè)弱應(yīng)用的變量,結(jié)果還是強(qiáng)引用,也就是說(shuō)strongSelf持有了wself所指向的對(duì)象(也即是self所只有的對(duì)象),這和你直接傳self進(jìn)來(lái)是一樣的效果,并不能達(dá)到解除強(qiáng)引用的作用!
于是想到建立一個(gè)臨時(shí)對(duì)象,也就是創(chuàng)造一個(gè)target,讓他來(lái)接下NSTimer的強(qiáng)引用,讓Timer強(qiáng)用用這個(gè)臨時(shí)對(duì)象,在這個(gè)臨時(shí)對(duì)象中弱引用self。
?NSTimer和實(shí)現(xiàn)弱引用的timer的方式
關(guān)于GCD的有些地方暫時(shí)不是很懂.