美文网首页Code ReviewiOS专题
[iOS]想了解block的时候,回头看看这里

[iOS]想了解block的时候,回头看看这里

作者: pingpong_龘 | 来源:发表于2016-04-15 00:47 被阅读435次

之前有人问到野指针的问题,所以最近在查block的相关文章
但查了半天,没几个靠谱的文章
于是准备,整理下block相关的,也方便是以后查找起来方便

1.先测试一下

这里有5道测试题(http://blog.parse.com/learn/engineering/objective-c-blocks-quiz/),

屏幕快照 2016-04-15 上午12.41.52.png
如果你都能回答正确,那么,ok,请回吧.
哥们,你真的很棒了!

2.简单介绍一下block

int main(int argc, const char * argv[]) { 
    @autoreleasepool { 
      ^{ }; 
    } 
    return 0;
}

一句话:block 实际上就是 Objective-C 语言对于闭包的实现

3. 业内好文章整理

3.1

谈Objective-C block的实现 -- 唐巧
(http://blog.devtang.com/2013/07/28/a-look-inside-blocks/)

对Objective-C中Block的追探
(http://www.cnblogs.com/biosli/archive/2013/05/29/iOS_Objective-C_Block.html)

3.2

Block编程值得注意的那些事儿 (使用相关)
(http://www.cocoachina.com/macdev/cocoa/2013/0527/6285.html)

iOS中block实现的探究(内部结构分析)
(http://blog.csdn.net/jasonblog/article/details/7756763?reload)

还有绪斌同学共享的(内部结构分析)
(https://www.evernote.com/shard/s269/sh/23b61393-c6dd-4fa2-b7ae-306e9e7c9639/131de66a3257122ba903b0799d36c04c?noteKey=131de66a3257122ba903b0799d36c04c&noteGuid=23b61393-c6dd-4fa2-b7ae-306e9e7c9639)

又看了一本关于这方面的书:
Pro Multithreading and Memory Management for iOS and OS X
(http://vdisk.weibo.com/s/9hjAV)

4 补充

4.1 循环引用与野指针

  1. block避免循环引用的方法是使用 __weak, 当然,这个是针对这个block本身就是self的成员
  2. 使用__weak之后,会引发新的问题,就是可能会带来野指针,因为weak是在arc里面引用后直接置为nil的,所以为了避免野指针的问题,还需要一个__strong

"野指针"不是NULL指针,是指向"垃圾"内存(不可用内存)的指针。野指针是非常危险的。

  1. 综上,以上的代码应该是:
__weak __typeof__(self) weakSelf = self;
dispatch_group_async(_operationsGroup, _operationsQueue, ^{
        __typeof__(self) strongSelf = weakSelf;
        [strongSelf doSomething];
        [strongSelf doSomethingElse];
} );
  1. 代码里如果使用->调用成员变量,会出现问题:
    Dereferencing a __weak pointer is not allowed due to possible null value caused by race condition, assign it to a strong variable first.
    __weak pointer

解决方案:
a. 换成block

__block typeof(self) weakSelf = self;
[popView setOnButtonTouchUpInside:^(CustomIOS7AlertView *alertView, int buttonIndex){
      [weakSelf->popView close]; 
}];

b. 使用strongSelf

__weak typeof(self) weakSelf = self;
[popView setOnButtonTouchUpInside:^(CustomIOS7AlertView* alertView, int buttonIndex) {
        __typeof__(self) strongSelf = weakSelf;
        [strongSelf->popView close];
}];

相关文章

  • [iOS]想了解block的时候,回头看看这里

    之前有人问到野指针的问题,所以最近在查block的相关文章但查了半天,没几个靠谱的文章于是准备,整理下block相...

  • iOS的objection模块化编程

    objection实现的一个block 刚学iOS想搞封装的的可以看看 链接

  • 关于Block的一些日常用法

    对于iOS开发者来说,相信block大家应该都耳熟能详。网上关于block的介绍和深入了解也有很多文章,这里就不对...

  • 关于block(4)

    关于block(4) 标签: iOS 技术 接上篇,我们继续探究block。 block的copy属性 研究到这里...

  • [iOS]Block技术中的weak-strong

    本篇文章的主要内容 了解何谓block。 了解block的使用方法。Block 是iOS在4.0版本之后新增的程序...

  • iOS-2 Block

    block块 系列文章: iOS Block浅浅析 - 简书 iOS Block实现原理 iOS Block __...

  • iOS Block存储域及循环引用

    系列文章:iOS Block概念、语法及基本使用iOS Block实现原理iOS Block __block说明符...

  • block循环引用问题

    在讲block的循环引用问题之前,我们需要先了解一下iOS的内存管理机制和block的基本知识。 iOS的内存管理...

  • iOS Block实现原理

    系列文章:iOS Block概念、语法及基本使用iOS Block __block说明符iOS Block存储域及...

  • Block中的循环引用

    在讲block的循环引用问题之前,我们需要先了解一下iOS的内存管理机制和block的基本知识 iOS的内存管理机...

网友评论

    本文标题:[iOS]想了解block的时候,回头看看这里

    本文链接:https://www.haomeiwen.com/subject/vxfnlttx.html