zoukankan      html  css  js  c++  java
  • 深刻理解iosBlock

    深刻理解iosBlock


    ///一个控制器里的方法 
    - (void)setRefreshHeader {
    ACWeakSelf(self);
    self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
    if (weakSelf.dataSource.count) {
    _messageTime = [weakSelf.dataSource[0] date_created];
    // weakSelf.messageTime = [weakSelf.dataSource[0] date_created];修改之后的代码
    }
    [[ACChatManager sharedInstance]loadMessagesWithMessageTime:_messageTime /* weakSelf.messageTime修改之后的代码*/direction:ACLoadMessageDirectionUp completion:^(NSArray *messages, NSError *error) {
    [weakSelf.tableView.mj_header endRefreshing];
    if (!error) {
    if (messages.count) {
    NSInteger scrollIndex = weakSelf.dataSource.count;
    [weakSelf.dataSource insertObjects:messages atIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, messages.count)]];
    [weakSelf.tableView reloadData];
    [weakSelf.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:weakSelf.dataSource.count - scrollIndex inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:false];
    }else {
    weakSelf.tableView.mj_header.hidden = true;
    }
    }
    }];

    }];
    }

    先不需要看注释的部分,整体看一遍这个代码你有没有发现有什么问题这个代码? 
    这个修改一个同事的代码发现的问题,特此做一个笔记。注意到注释的两个地方,都是用的直接取属性而没有用到getter方法,也就是这里会引发一个巨大的问题,那就是内存泄漏,这个控制器不会释放,引起他的原因就是造成了block循环引用。那么挖掘根本是什么造成了循环引用,通过getter方法获取属性和setter方法去设置属性有什么区别? 
    区别就是通过”_”是直接访问属性(或者叫做直接访问成员变量)而通过”self.”是通过这个对象去查看属性。所以建议在block里尽量都是用self来访问。而且block里尽量不要套太多的block!

  • 相关阅读:
    ACM-ICPC 中可能会使用到的库
    ACM中java的使用
    Codeforces
    洛谷 P1879 玉米田(状压DP入门题)
    洛谷 P2622 关灯问题II(状压DP入门题)
    poj 2385 Apple Catching(记录结果再利用的动态规划)
    NOIP 提高组 2014 飞扬的小鸟(记录结果再利用的DP)
    2018.10.26 浪在ACM 集训队第四次测试赛
    NOIP 提高组 2014 联合权值(图论???)
    NOIP 普及组 2012 寻宝(思维???)
  • 原文地址:https://www.cnblogs.com/wannaGoBoy/p/6672640.html
Copyright © 2011-2022 走看看