iOS--block底层代码探究

原创 2016年08月29日 15:47:40

1.__block:

1.首先创建个block

int main(int argc, char * argv[]) {
    @autoreleasepool {


        __block int a = 10;

        void (^block)() = ^{
            a = 20;
        };

        NSLog(@"%d", a);

        block();

        NSLog(@"%d", a);

        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

2.通过clang -rewrite-objc来转换底层的c++代码

3.block的本质上是一个指向结构体的指针

4.默认情况下,任何block都在栈中,随时都可能会被回收。

     void (^myBlock)() = ^{

        };

对block做一次copy操作,block的内存就会放入堆中。

[myBlock copy]
Block_copy(myblock);(非ARC)
@property (nonatomic, copy) void (^block);

5.不用retain的原因是,retain只会使引用计数+1,但内存地址不会改变。

6.使用__weak和__unsafe_unretained的原因:

Objective-C的对象在内存中是以堆的方式分配空间的 ,而且block经过copy后的内存也是分配在堆中,所以程序结束后,变量不会被释放,会造成内存泄露。

Person *p = [[Person alloc] init];

__weak Person *p2 = p;
__unsafe_unretained Person *p2 = p;
p.block = ^{
        p2.age = 20;
};

7.__block:对象可以在block中被重新赋值,在Block中截获了变量的瞬间值以后就不能再改变变量的值,如果想要在Block中改变变量的值,那么我们只需要在变量声明的时候加上__Block修饰符.

然而这样的情况又是允许的:

NSMutableArray *array = [[NSMutableArray alloc]init];
    void (^blo)() = ^{
        [array addObject:@"Obj"];
    };

因为我们只是对截获的变量进行了操作,而没有进行赋值,所以对于截获变量,可以进行操作而不可以进行赋值

1.__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
2.__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
3.__block对象可以在block中被重新赋值,__weak不可以。
PS:__unsafe_unretained修饰符可以被视为iOS SDK 4.3以前版本的__weak的替代品,不过不会被自动置空为nil。所以尽可能不要使用这个修饰符。

8.代理为什么要用weak?因为controller强引用控件,如果控件的delegate又强引用controller的话,会造成内存泄漏。

版权声明:欢迎转载!

KVC/KVO底层实现原理

KVC: Key-value coding is a mechanism for indirectly accessing anobject’s attributes and relationship...
  • wzxq123
  • wzxq123
  • 2016年05月27日 17:15
  • 1833

C++ STL 的底层实现

C++ STL 的实现: 1.vector  底层数据结构为数组 ,支持快速随机访问 2.list    底层数据结构为双向链表,支持快速增删 3.deque   底层数据结构为一个...
  • xiaominkong123
  • xiaominkong123
  • 2016年08月18日 10:50
  • 487

Redis 探究底层存储结构

我们都知道Redis有五种数据类型,分别是字符串String,列表List,集合Sort,有序集合Sorted Set和散列表Hash,这些其实是Redis封装好的数据类型,Redis底层是用C语言编...
  • Thousa_Ho
  • Thousa_Ho
  • 2017年09月29日 17:37
  • 1773

探究PHP底层运行机制

本文详细讲解了PHP底层的运行机制,包括PHP内容的运作并结合实例讲解了PHP从启动到停止的整个生命周期。  简介我们从未手动开启过PHP的相关进程,它是随着Apache的启动而运行的;PHP通...
  • ryanho2008
  • ryanho2008
  • 2010年11月07日 11:30
  • 241

JDBC底层代码

jdbc底层代码
  • fpxty
  • fpxty
  • 2017年05月26日 18:29
  • 267

探究php底层运行机制

本文转载自:http://www.myext.cn/Article/921.html 概要 简介 先看看下面这个过程: 我们从未手动开启过PHP的相关进程,它是...
  • sole_cc
  • sole_cc
  • 2014年09月14日 21:52
  • 407

探究PHP底层

探究PHP底层 1、PHP是什么? PHP 指的是我们从外面看到的一套完整的系统。这听起来有点糊涂,但其实并不复杂(PHP4 内部结构图)。从功能上来分:我们可以分为三...
  • judyge
  • judyge
  • 2014年11月11日 21:09
  • 243

eclipse查看底层源码

不会看JDK源代码,相当于没学过Java。     从百度上找到一篇帮助我解决了如何在Eclipse下查看JDK源代码 的文章。      在Eclipse中查看JDK类库的源代码!!!...
  • sinat_38281141
  • sinat_38281141
  • 2017年07月25日 10:31
  • 702

《总线设备驱动模型》《深入探究Linux的设备树》讲座ppt分享和录播地址发布

本课程的录播视频已经放在了(已经报名直播的看录播无需重新报名): http://edu.csdn.net/course/detail/5627 《Linux总线、设备、驱动模型》的录播视频放在了(已经...
  • 21cnbao
  • 21cnbao
  • 2017年08月18日 17:03
  • 4584

写了几年代码了,苦苦追寻,应该沉淀下来了,好好研究。net底层框架,以及较好的分层框架

WPF/Siverlight/Net框架、平台交流QQ49743834 几年码农了,像沉淀下来,写一下自己的分层框架,尤其是逻辑层和orm层,数据访问层,一切靠自己,网上一大堆框架,但是感觉各有优缺...
  • david_xgl
  • david_xgl
  • 2015年03月17日 16:15
  • 809
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS--block底层代码探究
举报原因:
原因补充:

(最多只允许输入30个字)