zoukankan      html  css  js  c++  java
  • OC Block(代码块)

      1 #import "ViewController.h"
      2 
      3 @interface ViewController ()
      4 
      5 @end
      6 
      7 @implementation ViewController
      8 
      9 - (void)viewDidLoad {
     10     
     11     [super viewDidLoad];
     12     
     13     [self showResultByNumber1:10086
     14                    andNumber2:10000
     15                      andBlock:^(int num1,int num2){
     16         return num1 +num2;
     17     }];
     18     
     19     //    [self textBlockTeDian];
     20     //    [self textBlockTeDian1];
     21     //    [self textBlockTeDian2];
     22     [self textBlockTeDian3];
     23 }
     24 
     25 #pragma mark - block基本语法
     26 - (void)block1
     27 {
     28     /*
     29      block(闭合代码块)- (返回值类型)(^block名)(参数列表)
     30      
     31      block类型:(返回值类型)(^)(参数列表)
     32      block的名:block名
     33      
     34      block不遵守引用计数
     35      block的执行效率非常高
     36      block一般被用界面传值,或者当做方法参数实现方法回调
     37      */
     38 }
     39 
     40 #pragma mark - block基本用法
     41 - (void)block2
     42 {
     43     
     44     //赋值语句
     45     //block的实体在赋值的过程中不会被执行,
     46     //当且仅当block被调用的时候,block的实体才会被执行
     47     
     48     //block并不是方法,所以执行的时候并不需要self调用。直接执行即可
     49     
     50     void (^block)(void) = ^{
     51         
     52         NSLog(@"Hello Word");
     53     };
     54     block();
     55     
     56     //int (^blockSum)(int, int) 表示,
     57     //定义一个[有两个整形参数,返回值为整形]的blockSum的代码块
     58     int (^blockSum)(int, int) = ^(int num1,int num2){
     59         return num1 + num2;
     60         
     61     };
     62     NSLog(@"%d",blockSum(56,78));
     63 
     64 }
     65 
     66 #pragma mark - block用作方法参数
     67 - (void)showResultByNumber1:(int)number1
     68                  andNumber2:(int)number2
     69                    andBlock:(int(^)(int,int))block
     70 {
     71     NSLog(@"Result:%d",block(number1,number2));
     72 }
     73 
     74 #pragma mark - block特点
     75 //值锁定(值拷贝)是针对于存储在堆栈区的数据
     76 
     77 //值锁定-针对常变量
     78 - (void)textBlockTeDian
     79 {
     80     int number = 8;
     81     /*
     82      如果block内部引用了block外部的任意变量
     83      那么这个block在ARC环境下
     84      自动从static(栈)区copy到malloc(堆)区
     85      
     86      block实体存在代码区,实体在编译的过程中已经执行了,编译时已经值锁定
     87      */
     88     int (^block)(int) = ^(int num){
     89         return num +number;
     90     };
     91     
     92     number = 4;
     93     NSLog(@"number:%d",block(9));
     94 }
     95 //值锁定-指针类型
     96 - (void)textBlockTeDian1
     97 {
     98     NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:@"1",@"3", nil];
     99     NSMutableArray *(^block)(NSMutableArray *) = ^(NSMutableArray *tempArr)
    100     {
    101         //值锁定,锁定的是数组arr的首地址
    102         [arr addObject:tempArr];
    103         return arr;
    104     };
    105     
    106     [arr removeObject:@"1"];
    107     NSMutableArray *objArr = [[NSMutableArray alloc] initWithObjects:@"2", nil];
    108     NSLog(@"%@",block(objArr));
    109     
    110 }
    111 //静态变量
    112 - (void)textBlockTeDian2
    113 {
    114     // 静态修饰符,存在代码全局仅执行一次
    115     static int number = 8;
    116     
    117     int (^block)(int) = ^(int num){
    118         // 因为静态变量的存储位置并不在堆栈区,因此值锁定的时候不会对静态变量的值进行任何保存
    119         return num +number;
    120     };
    121     
    122     number = 4;
    123     NSLog(@"number:%d",block(9));
    124     
    125 }
    126 // __block
    127 - (void)textBlockTeDian3
    128 {
    129     //__block 修饰的变量,可以在多个block中共同使用
    130     //相当于在block内部声明的变量
    131     __block int i = 10;
    132     
    133     int (^block1)(int) = ^(int number){
    134         
    135         i = i +number;
    136         return i;
    137     };
    138     
    139     int (^block2)(int) = ^(int num){
    140         
    141         i = i + num;
    142         return i;
    143     };
    144     NSLog(@"block1--->i=%d",block1(4));
    145     NSLog(@"block2--->i=%d",block2(9));
    146     
    147 }
    148 
    149 @end
      1 /*
      2  11.block的三种分类
      3  (堆区block)、(栈区block)、(Globle区block)
      4  12.block的循环引用(以及如何避免)
      5  13.关于block的内存管理
      6 
      7  */
      8 #import "ViewController.h"
      9 typedef NSString* (^myBlock)(NSString*);
     10 
     11 @interface ViewController ()
     12 
     13 @property (copy, nonatomic) NSString *myStr;
     14 @property (copy, nonatomic) myBlock block;
     15 
     16 @end
     17 
     18 @implementation ViewController
     19 
     20 - (void)viewDidLoad {
     21     [super viewDidLoad];
     22 
     23     //循环引用导致的[block不释放,界面不释放]
     24 //    [self blockCircleUsed];
     25 //    [self showBlockType];
     26 //    [self showGlobleBlockRetainCount];
     27     [self showStackBlockRetainCount];
     28 //    [self showMallocBlockRetainCount];
     29 }
     30 #pragma mark - 循环引用
     31 - (void)blockCircleUsed
     32 {
     33     //在这里VC引用了block
     34     //VC->block
     35     
     36     __weak ViewController *vc = self;
     37     self.block = ^(NSString *str){
     38         
     39         //block内部引用了当前VC的属性
     40         //此时block->VC
     41         //如何解决:将block内部的VC变成一个指向VC的弱引用
     42         NSLog(@"%@",vc.myStr);
     43         return vc.myStr;
     44     };
     45     
     46 }
     47 
     48 
     49 #pragma mark - GlobleBlock 内存管理测试
     50 - (void)showGlobleBlockRetainCount
     51 {
     52     void (^globleBlock)(void) = ^{
     53         NSLog(@"here is globleBlock");
     54     };
     55     NSLog(@"1=====>%ld",[globleBlock retainCount]);
     56     [globleBlock retain];
     57     NSLog(@"2=====>%ld",[globleBlock retainCount]);
     58     [globleBlock release];
     59     NSLog(@"3=====>%ld",[globleBlock retainCount]);
     60     globleBlock();
     61 }
     62 #pragma mark - StackBlock内存管理测试
     63 - (void)showStackBlockRetainCount
     64 {
     65     NSArray *arr = @[@"1",@"2"];
     66     
     67     void (^stackBlock)(void) = ^{
     68         NSLog(@"%@",arr);
     69     };
     70     NSLog(@"1=====>%ld",[stackBlock retainCount]);
     71     [stackBlock retain];
     72     NSLog(@"2=====>%ld",[stackBlock retainCount]);
     73     [stackBlock release];
     74     NSLog(@"3=====>%ld",[stackBlock retainCount]);
     75     stackBlock();
     76 }
     77 
     78 #pragma mark - MallocBlock 内存管理测试
     79 - (void)showMallocBlockRetainCount
     80 {
     81     //block不遵循引用计数原则,所以不能使用ARC自动管理内存管理block
     82 //    NSArray *arr = @[@"1",@"2"];
     83 //    void (^block)(void) = ^{
     84 //        NSLog(@"%@",arr);
     85 //    };
     86     //既然通常情况下不需要我们手动管理block的内存,那就意味着一件事,我们的程序当中不能出现过多的block
     87     
     88     
     89 //    NSLog(@"------>%ld",[[block copy] retainCount]);
     90 //    [block retain];
     91 //    NSLog(@"======>%ld",[[block copy] retainCount]);
     92 //    [block release];
     93 //    NSLog(@"======>%ld",[[block copy] retainCount]);
     94 //    block();
     95 }
     96 
     97 #pragma mark - block三种类型
     98 - (void)showBlockType
     99 {
    100     //MRC环境下才能看到,ARC下看不到
    101     //--------------------------//
    102     NSArray *arr = @[@"1",@"2"];
    103     
    104 //    globle类型block
    105     NSLog(@"%@",^{
    106         NSLog(@"hello world");
    107     });
    108     
    109 //    NSStackBlock(栈区block)
    110     NSLog(@"%@",^{
    111         NSLog(@"%@",arr);
    112     });
    113     
    114 //    NSMallocBlock(堆区block)
    115     void(^block)(void) = ^{
    116         NSLog(@"%@",arr);
    117     };
    118     NSLog(@"%@",[block copy]);
    119 }
    120 
    121 @end
  • 相关阅读:
    ICONS-图标库
    图形资源
    vue项目中,如果修改了组件名称,vscode编辑器会在引入修改组件的名字处提示红色波浪线 The file is in the program because:Imported via xxx Root file specified for compilation .
    接口在dev环境报跨域问题(has been blocked by CORS policy:Response to preflight request doesn't pass access control check:No 'Access-Control-Allow-Origin' header ispresent on the requested resource.),qa环境正常
    阿里云occ的图片文件URL用浏览器直接打开无法访问,提示This XML file does noe appear to have any style information associated with it. The document tree is shown below.
    vue 项目使用element ui 中tree组件 check-strictly 用法(父子不互相关联的反显情况)
    高德地图进行线路规划绘制标记点操作(vue)
    vue中实现拖拽调整顺序功能
    2021-01-22 浏览器相关知识
    2021-01-22 js 相关知识点
  • 原文地址:https://www.cnblogs.com/oc-bowen/p/5113633.html
Copyright © 2011-2022 走看看