深刻理解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!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 禅与 Objective-C 编程艺术 (Zen and the Art of the Objective-C C...
    GrayLand阅读 1,683评论 1 10
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,288评论 19 139
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 4,014评论 1 10
  • 今天带三个娃去外面逛。 中午吃完牛排后打算坐公交去苏州博物馆。还没到站台车已经到了,四个人边跑边喊着呼啸地坐上车。...
    JC贾阅读 413评论 0 0
  • 草尖的露珠一夜无眠 守护滋润草身的绿 蝴蝶关爱地抖动翅膀劝说 我捎你到湖里 太阳就要出来 露珠抓草的手攥得更紧 有...
    凉爽清风阅读 306评论 4 6