嘿,兄die!别让block影响你的开发

嘿,也许你看了题目会觉得我在贬低block? 那你就错了,大兄die!本人也是block的爱好者,能block的情况下绝对不用delegate!目前项目是多人合作开发的时候,对整体项目代码进行codereview以及测试的时候,总会因为一些不太合理的block用法,导致了一系列不可预估的情况发生。所以给大lao们一些介意,在我们iOS开发过程中,用到block回调的时候。一些细节可能需要注意!

记得加if判断

可能很多人会看到大部分的时候代码是这样的:

if (self.bolck)  {
    self.block(xxx)
}

其实很多人在想,为什么要写这层if判断呢?
有这么一个应用场景,当你发生block回调事件之后,但是你并没有去接收这个事件,然后你也没要加这层if判断,于是奔溃就出现了! 是的,奔溃了。所以为了开发的稳定性,加层if很重要!

在cell里记得用__weakself

其实好多人在用blcok的时候,都是默认使用__weakSelf。当然,也有人并不是这样的,因为现在的编译器非常强大,会提示你什么时候需要用__weakSelf。但是在tableViewCell里系统是并不会提示你的,所以这个时候呢,要是没有__weakSelf的情况下,就会发生循环引用,导致这块内存没办法释放。

如果block离有异步回调或者block,记得用__strongSelf

是的,有时候__strongself也是很重要的,因为如果是异步回调或者其他的时候,当前对象已经释放了,也就没办法发生回调事件了,总会有你意想不到的事情发生。

名侦探柯南环节

嗯,如果单纯的运用其实已经差不多了,不过身为一个程序员,总要有探索的精神。
blcok在iOS里可以理解为一个匿名函数,oc是一门运行时语言,当一个选择子SEL找不到调用者时,就会发生balabala一系列的事情之后,还是没有处理的话就会报错了。在iOS里如果block回调发生却没有响应者,那就会报EXC_BAD_ACCESS。如下图:

嘿,兄die!别让block影响你的开发_第1张图片
block_BAD_ACCESS.png

第二种情况呢,循环引用的原因就是因为强引用环造成的,关于此类介绍那就不介绍了,为什么会发生呢,因为我们的Vc对tableview强引用了,tableview对cell可能也进行了强引用?所以就造成了强引用环!

第三种情况呢,嗨呀,具体看下文吧!
http://blog.lessfun.com/blog/2014/11/22/when-should-use-weakself-and-strongself-in-objc-block/

其实看了很多东西,如果感兴趣可以看看block源码,了解它的本质,对使用block总有好处的!

tanks!

你可能感兴趣的:(嘿,兄die!别让block影响你的开发)