关于Block

2015-10-18  本文已影响199人  阳关三叠
  1. 一个由C/C++编译的程序占用的内存分为以下几个部分
  1. 例子程序
    int a = 0; // 全局初始化区
    char *p1; // 全局未初始化区
    main()
    {
    int b; // 栈
    char s[] = "abc"; // 栈
    char *p2; // 栈
    char *p3 = "123456"; // 123456\0在常量区,p3在栈上。
    static int c = 0; // 全局(静态)初始化区
    p1 = (char *)malloc(10);
    p2 = (char *)malloc(20);
    // 分配得来得10和20字节的区域就在堆区。
    strcpy(p1, "123456"); // 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
    }

  2. 修饰Block成员变量

  1. 循环引用(ARC)
    _weak __typeof(self) weakSelf = self; 解决循环引用self的问题。

使用关键字__block声明的局部变量,可以被block所改变,并且其在原函数中的值会被改变。
5.关于block使用的5点注意事项

1、在使用block前需要对block指针做判空处理。不判空直接使用,一旦指针为空直接产生崩溃
2、在MRC的编译环境下,block如果作为成员参数要copy一下将栈上的block拷贝到堆上
3、在block使用之后要对,block指针做赋空值处理,如果是MRC的编译环境下,要先release掉block对象。block作为类对象的成员变量,使用block的人有可能用类对象参与block中的运算而产生循环引用。将block赋值为空,是解掉循环引用的重要方法。(不能只在dealloc里面做赋空值操作,这样已经产生的循环引用不会被破坏掉)
4、使用方将self或成员变量加入block之前要先将self变为__weak
5、在多线程环境下(block中的weakSelf有可能被析构的情况下),需要先将self转为strong指针,避免在运行到某个关键步骤时self对象被析构。

上一篇 下一篇

猜你喜欢

热点阅读