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的话,会造成内存泄漏。

版权声明:欢迎转载! 举报

相关文章推荐

iOS--block底层代码探究

1.__block:2.__weak:1.首先创建个blockint main(int argc, char * argv[]) { @autoreleasepool { __...

探究PHP底层

探究PHP底层 1、PHP是什么? PHP 指的是我们从外面看到的一套完整的系统。这听起来有点糊涂,但其实并不复杂(PHP4 内部结构图)。从功能上来分:我们可以分为三...
  • hguisu
  • hguisu
  • 2012-03-26 17:38
  • 7565

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

iOS - Block底层解析

Block是iOS开发中一种比较特殊的数据结构,它可以保存一段代码,在合适的地方再调用,具有语法简介、回调方便、编程思路清晰、执行效率高等优点,受到众多猿猿的喜爱。但是Block在使用过程中,如果对B...

iOS中block的探究

[0. Brief introduction of block] Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C语言的扩展,用来实现匿名函数的特性。 用维基百科的话...

iOS中block的探究

iOS中block的探究

ios的Block机制探究

[0. Brief introduction of block] Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C语言的扩展,用来实现匿名函数的特性。 用维基百科的话...

iOS中block的探究

/* -------------------------------------------------------------------------------------------------...

【Java】关于泛型:泛型类、泛型接口和泛型方法

有许多原因促成了泛型的出现,而最引人注意的一个原因,就是为了创建容器类。 泛型类 容器类应该算得上最具重用性的类库之一。先来看一个没有泛型的情况下的容器类如何定义: public c...
  • hj7jay
  • hj7jay
  • 2016-11-16 10:36
  • 1002

别怕,手把手带你撕、拉、扯下SpringMVC的外衣

前言 提到框架,就不得不提一下看源码,我们平时总是想求大神带我们飞,然而看源码就是一个向大神学习的最直接的一种方式,然而我们每次鼓起勇气看源码前是这样的 但是一点开源码,顿时代码如...

OC开发底层原理

1. OC对象模型 1.1 什么是isa指针 每个对象都有一个isa指针,指向其对应的类。类的指针指向其元类(元类是因为在OOP思想中,类也是一个对象,也必须是另外一个类的实例,这个类就是元类),元类...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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