一些MJRefresh的坑

1.MJRefresh(主要封裝了六種刷新控件)

MJ 框架圖
作用
MJRefreshComponent 繼承自UIView朦乏,最基本的刷新類
MJRefreshHeader 最基本的下拉刷新類
MJRefreshStateHeader 可以下拉刷新黔夭,但是只有文字
MJRefreshNormalHeader 默認(rèn)的刷新樣式氧卧,有文字,有上下箭頭初橘,有菊花

主要使用以下幾個(gè)

  • MJRefreshNormalHeader
  • MJRefreshGifHeader
  • MJRefreshBackNormalFooter
  • MJRefreshBackGifFooter
  • MJRefreshAutoNormalFooter
  • MJRefreshAutoGIfFooter

2.MJ 刷新block造成veiwcontroller內(nèi)存不釋放問(wèn)題

? self的成員變量Tableview.mj_header 引用了刷新方法的block,block引用了self的函數(shù)轧坎,同時(shí)還引用了成員變量Tableview.mj_header 股耽,造成了兩個(gè)循環(huán)引用,導(dǎo)致了viewcontroller不釋放褐健。

  • 以下是引起循環(huán)引用的代碼:
_tableV1.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
    [_tableV1.mj_header beginRefreshing];
    //request
    [self removeAllTableAry];
    [self refreshRequest];
    [_tableV1.mj_header endRefreshing];
}];
  • 而當(dāng)使用target方法時(shí)并不會(huì)產(chǎn)生循環(huán)引用這個(gè)問(wèn)題付鹿。
_tableV1.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(refreshRequest)];

_tableV1.mj_footer = [MJRefreshBackNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadTableV1MoreData)];   
  • 打破MJ方法中的block循環(huán)引用如下:
__weak typeof(self) weakSelf = self;
__weak typeof(_tableV1.mj_header) weakHeader = _tableV1.mj_header;
_tableV1.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
    typeof (weakSelf)strongSelf = weakSelf;
    typeof (weakHeader)strongHeader = weakHeader;
    [strongHeader beginRefreshing];
    //request
    [strongSelf refreshRequest];
    [strongHeader endRefreshing];
}];

3.討論下關(guān)于block循環(huán)引用的問(wèn)題

//情況一:

- (void)case1 {

? NSLog(@"case 1 Click");

? dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

? self.name = @"case 1";

? });

? }

//情況二

- (void)case2 {

? NSLog(@"case 2 Click");

? __weak typeof(self) weakSelf = self;

? [self.teacher requestData:^(NSData *data) {

? typeof(weakSelf) strongSelf = weakSelf;

? strongSelf.name = @"case 2";

? }];

? }

//情況三

? - (void)case3 {

? NSLog(@"case 3 Click");

? [self.teacher requestData:^(NSData *data) {

? self.name = @"case 3";

? }];

? }

//情況四

? - (void)case4 {

? NSLog(@"case 4 Click");

? [self.teacher requestData:^(NSData *data) {

? self.name = @"case 4";

? self.teacher = nil;

? }];

? }

//情況五

? - (void)case5 {

? NSLog(@"case 5 Click");

? Teacher *t = [[Teacher alloc] init];

? [t requestData:^(NSData *data) {

? self.name = @"case 5";

? }];

? }

//情況六

? - (void)case6 {

? NSLog(@"case 6 Click");

? [self.teacher callCase6BlackEvent];

? self.teacher.case6Block = ^(NSData *data) {

? self.name = @"case 6";

? //下面兩句代碼任選其一

? self.teacher = nil;

? // self.teacher.case6Block = nil;

? };

? }

分析

  • 情況一:執(zhí)行了dealloc,不泄露蚜迅,此情況雖然是block舵匾,但未形成保留環(huán)block -> self
  • 情況二:執(zhí)行了dealloc,不泄露谁不,此情況就是內(nèi)存泄漏后的一般處理了 self ->teacher ->block ->strongSelf坐梯,后面那個(gè)strongSelf和原來(lái)的self并沒(méi)有直接關(guān)系,因?yàn)閟trongSelf是通過(guò)weakSelf得來(lái)的刹帕,而weakSelf又沒(méi)有強(qiáng)引用原來(lái)的self
  • 情況三:未執(zhí)行dealloc吵血,內(nèi)存泄漏,此情況就是最典型的循環(huán)引用了偷溺,形成保留環(huán)無(wú)法釋放蹋辅,self ->teacher ->block ->self
  • 情況四:執(zhí)行了dealloc,不泄露亡蓉,雖然也是保留環(huán)晕翠,但通過(guò)最后一句,使self不再?gòu)?qiáng)引用teacher,打破了保留環(huán)
  • 情況五:執(zhí)行了dealloc淋肾,不泄露硫麻,未形成保留環(huán) t ->block ->self
  • 情況六:執(zhí)行了dealloc,不泄露樊卓,最后兩句代碼任選其一即可防止內(nèi)存泄漏拿愧,self.teacher 或者 case6Block 置為空都可以打破 retain cycle

PS: 雖然情況四、情況六的寫(xiě)法都可以防止內(nèi)存泄漏碌尔,不過(guò)為了統(tǒng)一浇辜,個(gè)人建議最好還是按照普通寫(xiě)法即情況二的寫(xiě)法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末唾戚,一起剝皮案震驚了整個(gè)濱河市柳洋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌叹坦,老刑警劉巖熊镣,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異募书,居然都是意外死亡绪囱,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)莹捡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鬼吵,“玉大人,你說(shuō)我怎么就攤上這事篮赢〕菀危” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵荷逞,是天一觀的道長(zhǎng)媒咳。 經(jīng)常有香客問(wèn)我粹排,道長(zhǎng)种远,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任顽耳,我火速辦了婚禮坠敷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘射富。我一直安慰自己膝迎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布胰耗。 她就那樣靜靜地躺著限次,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上卖漫,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天费尽,我揣著相機(jī)與錄音,去河邊找鬼羊始。 笑死旱幼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的突委。 我是一名探鬼主播柏卤,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼匀油!你這毒婦竟也來(lái)了缘缚?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤敌蚜,失蹤者是張志新(化名)和其女友劉穎忙灼,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體钝侠,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡该园,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帅韧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片里初。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖忽舟,靈堂內(nèi)的尸體忽然破棺而出双妨,到底是詐尸還是另有隱情,我是刑警寧澤叮阅,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布刁品,位于F島的核電站,受9級(jí)特大地震影響浩姥,放射性物質(zhì)發(fā)生泄漏挑随。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一勒叠、第九天 我趴在偏房一處隱蔽的房頂上張望兜挨。 院中可真熱鬧,春花似錦眯分、人聲如沸拌汇。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)噪舀。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間与倡,已是汗流浹背先改。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蒸走,地道東北人仇奶。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像比驻,于是被迫代替她去往敵國(guó)和親该溯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容