• iOS中Block介绍 基础


    ios开发block的使用指南,以及深入理解block的内存管理,也适用于osx开发。讨论范围:block的使用,内存管理,内部实现。不包含的内容:gc arc下的block内存,block在c++中的使用。

    AD:【活动】Web和APP兼容性实战 Win10训练营免费报名

    一、概述

    Block是C级别的语法和运行时特性。Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存、堆内存的引用,我们甚至可以将一个Block作为参数传给其他的函数或者Block。

    二、热身

    先看一个比较简单的Block例子:

    1. int multiplier = 7; 
    2. int (^myBlock)(int) = ^(int num) { 
    3.     return num * multiplier; 
    4. }; 

    在这个例子中,myBlock是一个Block变量,它接受一个int类型的参数,返回一个int类型的值。是不是很像C函数?

    来,让我们typedef一下

    1. typedef void (^BoolBlock)(BOOL);//一个只接受一个BOOL参数,没有返回值的block 
    2. typedef int (^IntBlock)(void);//一个没有参数,返回int的block 
    3. typedef BoolBlock (^HugeBlock)(IntBlock);//看看,这个HugeBlock的参数和返回值都是block 

    三、更详细的例子

    注意:上面的typedef都还有效~

    主动调用一下:

    1. - (void)someMethod 
    2.     BoolBlock ablock = ^(BOOL bValue) { 
    3.         NSLog(@"Bool block!"); 
    4.     }; 
    5.     ablock(); 

    作为参数返回:

    1. typedef void (^BoolBlock)(BOOL); 
    2. - (BoolBlock)foo() 
    3.     BoolBlock ablock = ^(BOOL bValue) { 
    4.         NSLog(@"Bool block!"); 
    5.     }; 
    6.     return [[ablock copy] autorelease];//一定要copy,将其复制到堆上,更详细的原理,将在后续章节讲解 

    类的一个成员:

    1. @interface OBJ1 : NSObject 
    2. @property (nonatomic, copy)BoolBlock block;//理由同上啊,同学们 
    3. @end 
    4.  
    5. OBJ1 *obj1 = ... 
    6. obj1.block = ^(BOOL bValue) { 
    7.         NSLog(@"Bool block!"); 
    8.     }; 

    其他函数的参数:

    1. - (void)foo(BoolBlock block) 
    2.     if (block) { 
    3.         block(); 
    4.     } 

    甚至其他block的参数:

    1. BoolBlock bBlock = ^(BOOL bV){if(Bv){/*do some thing*/}}; 
    2. HugeBlock hBlock = ^(BoolBlock bB) {bB();}; 
    3.  
    4. hBolck(bBlock); 

    啊,全局变量!:

    1. static int(^maxIntBlock)(int, int) = ^(int a, int b){return a>b?a:b;}; 
    2. int main() 
    3.     printf("%d ", maxIntBlock(2,10));   
    4.     return 0; 

    好了,你知道block大概能怎么用了。

    四,特殊的标记,__block

    如果要在block内修改block外声明的栈变量,那么一定要对该变量加__block标记:

    1. int main() 
    2.     __block int i = 1024; 
    3.     BoolBlock bBlock = ^(BOOL bV) { 
    4.         if (bV) { 
    5.             i++;//如果没有__block标记,是无法通过编译的。 
    6.         } 
    7.     }; 
    8. }
  • 相关阅读:
    快速排序最新理解
    八大排序算法
    图的创建
    ARM入门实践(一)----Mini6410上最简单的LED点灯裸机程序
    驱动编程思想之初体验 --------------- 嵌入式linux驱动开发之点亮LED
    嵌入式Linux LED小灯点亮实验
    手算KMP匹配的Next值和Nextval值
    及格率 不谢 cast(cast (sum(case when res>=60 then 1 else 0 end)*100/(count(1)*1.0) as float) as nvarchar)+'%' '及格率'
    Hibernate反向工程生成DAO
    struts2&&Hibernate Demo1
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4991626.html
Copyright © 2020-2023  润新知