iOS基础之block

作者: 平安喜乐698 | 来源:发表于2017-09-04 14:04 被阅读11372次
    目录
    
    
    

    block(即闭包,基于函数指针) 用于反向传递数据、复用一段代码

        1、前一个页面创建block,后一个页面判断block非空后 调用block传入数据、block返回值接收数据。
        2、在block中不能直接修改局部变量,需要__block修饰外边的变量。
        3、默认存储在栈中,出了作用域则销毁。使用copy复制到堆中,需要手动释放。
        4、当block作为属性内部又引用到该对象,会造成循环引用。__weak typeof(self) weakSelf=self; block内部使用weakSelf来避免循环引用。
    
    
    动画、多线程GCD、回调、数组排序 都用到block:
        [UIView animateWithDuration:3 animations:^{     
        }];
        dispatch_async(dispatch_get_main_queue(),^{         
        });
    
    1. 声明(牢记)
    @property (nonatomic,copy) void (^myBlock)(NSString *name);
    
    .m使用
    if(self.myBlock){
        self.myBlock(@"");
    }
    简写
    !self.myBlock?:self.myBlock(@"");
    
    1. 方法
    // 把声明中的block名字放到外面  就是类型
    -(void)setMyBlock:(void (^)(NSString *))myBlock{  
    }
    -(void (^)(NSString *))getMyBlock{  
    }
    
    1. 调用方法
    // ^(参数类型 参名){}
    [self setMyBLock:^(NSString *name) {    
        // return 10; 又返回值时+
    }];
    myBlock(@"name");
    
    1. 局部变量
    // 局部变量
    void (^myBlock)(NSString *name)=^(NSString *name){
    };
    
    1. 重定义(起别名)
        typedef void (^MyBlock) (NSString *name);
        MyBlock myBlock=^(NSString *name){
        
        };
    
    1. block使用外部变量
    int x=100; 局部变量时(方法内部)
    
        int x=100;
        void (^myBlock)()=^(){
            NSLog(@"%d",x);
        };
        x=101;
        myBlock();  // 返回100,旧值
    
    
        __block int x=100;    // 需要设置__block才能在block内部修改。
        void (^myBlock)()=^(){
            NSLog(@"%d",x);
        };
        x = 101;
        myBlock();  // 返回101,最新值
    
    int x=100; 全局变量时(方法外部)
    
        int x=100;
        void (^myBlock)()=^(){
            NSLog(@"%d",x);
        };
        x=101;
        myBlock();  // 返回101,新值
    
    
        int x=100;    // 全局变量时不用+__block就可以在内部修改
        void (^myBlock)()=^(){
            NSLog(@"%d",x);
            x++;
        };
        myBlock();  // 返回101,最新值
    
    static int x=100; 静态变量时
    
    
        void (^myBlock)()=^(){
            NSLog(@"%d",x);
        };
        x=101;
        myBlock();  // 返回101,新值
    
    
        void (^myBlock)()=^(){
            NSLog(@"%d",x);
            x++;  // 静态变量时不用+__block就可以在内部修改
        };
        myBlock();  // 返回101,最新值
    
    1. 数组排序
        [[NSArray new]sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
            PersonM *personM=obj1;
            PersonM *personM2=obj2;
            if(personM.age>personM.age){
              return NSOrderedDescending; // 在这里返回降序,obj1排在obj2的后
            }
            // NSOrderedAscending = -1L,
            // NSOrderedSame,
            // NSOrderedDescending        
        }];
    

    相关文章

      网友评论

        本文标题:iOS基础之block

        本文链接:https://www.haomeiwen.com/subject/sokejxtx.html