• 关于Block,博主不才,简单分为三来用: 像函数一样定义和使用,,不同于函数的是可以定义在方法内也可以定义在方法外 定义成property的属性来使用 用作修饰词 接下来一样样的来展示; 1.像函数一样定义和使用,...

    关于Block,博主不才,简单分为三种来用:

    • 像函数一样定义和使用,,不同于函数的是可以定义在方法内也可以定义在方法外
    • 定义成property的属性来使用
    • 用作修饰词

    接下来一样样的来展示;
    1.像函数一样定义和使用,,不同于函数的是可以定义在方法内也可以定义在方法外

    1)在方法中使用

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
          NSString *(^thisBlock) (NSString *thisName) = ^(NSString *name){
            return [NSString stringWithFormat:@"%@:%@",@"name",name];
        };
        NSLog(@"%@",thisBlock(@"xiaoming"));
    }

    2)在方法外使用,就像定义一个方法一样

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    
        BlockVoid(24);
    
    
    }
    void (^BlockVoid) (int age) = ^(int xiaomingAge){
        NSLog(@"xiaomingAge:%d",xiaomingAge);
    };

    总结: 上面俩block也是block的一种写法不过这么用的貌似不多见,大多时候这么写反而显得麻烦了(从这里可以看出,block可以定义在方法内部也可以定义在方法外部,在外部的时候看着是不是更像函数了)

    2.定义成property的属性来使用
    这是一种我们经常用的方法,举个例子

    /**
     常规无返回值有参数block,比较常用
     */
    @property(nonatomic,copy)void (^myBlock) (NSString *name,int age);
    
    /**
     常规有返回值有参数block,使用起来其实和上面那个差别不大
     */
    @property(nonatomic,copy)NSString *(^haveReturnBlock) (NSString *name);
    
    //用法
    - (void)test2
    {
        _myBlock(@"CodeLiu",24);
    }
    
    - (NSString *)test3
    {
        return _haveReturnBlock(@"小花");
    }

    除了这个用法,还有一种很好玩的用法,看着比较生动,其实是一样的:

    #import <Foundation/Foundation.h>
    
    /**
     定义一个block
    
     @param returnContent 返回值
     */
    typedef void(^RetureContentBlock)(id returnContent);
    
    @interface LHBlockForUse : NSObject
    
    /**
     用定义的block来声明一个变量
     */
    @property(nonatomic,copy)RetureContentBlock returnBlock;
    
    @end
    
    //用法
    - (void)test1
    {
        _returnBlock(@"You can put every type in here");
    }
    

    3.用作修饰词

    在Block内是不能修改Block外的变量的,如果要修改就需要用__block进行修饰

    __block int lastAge = 24;
        void (^lastAgeBlock) (int age) = ^(int addAge){
            lastAge = lastAge + addAge;
            NSLog(@"xiaomingLastAge:%d",lastAge);
        };
    lastAgeBlock(1);

    以上是Block的简单应用,如果哪里写的不好欢迎指正,下载地址:Block 的简单使用

    展开全文
  • iOS开发中传值是一个非常经典的方法,有六传值方式:属性传值、代理传值、Block传值、方法传值、单例传值、通知传值。本章就来分享一下通过Block完成两个不同界面间的传值操作。 首先再来了解一下Block,简单...

    在iOS开发中传值是一个非常经典的方法,有六种传值方式:属性传值、代理传值、Block传值、方法传值、单例传值、通知传值。本章就来分享一下通过Block完成两个不同界面间的传值操作。

    首先再来了解一下Block,简单一点说,Block就是一段匿名的代码块,是具有某种功能的代码块。那么接下来通过实际应用场景,来直观的演示一下用Block传值的操作,具体如下所示。

    实例场景是在控制器A里面点击按钮进入到控制器B中,控制器B里面是一个单元格界面,每一个列表对应的三个参数,需要选中其中想要的列表然后返回并传值到控制器A里面,这就是整个使用场景的描述,接下来是具体实现的代码步骤。

    1、控制器A.m文件

    控制器A里面按钮点击事件的写法如下:

    - (void)popoutBtnClick {

    //跳转到控制器B

    TeaMineBluetoothController *histoyVC = [TeaMineBluetoothController new];

                [self.navigationController pushViewController:histoyVC animated:YES];

                histoyVC.Complate = ^(NSString *temp, NSString *time, NSString *water) {

    //Block传的三个参数给控制器A赋值的地方

                    _centigradeDegree = [temp floatValue];

                    _timeDegree = [time floatValue];

                    _waterDegree = [water floatValue];

                };

    }

    2、控制器B.h文件

    控制器B.h文件里面,需要声明Block函数,需要传三个参数值,具体如下所示:

    #import "BaseViewController.h"

    @interface TeaMineBluetoothController : BaseViewController

    @property (nonatomic, copy) void(^Complate)(NSString *temp, NSString *time, NSString *water);

    @end

    3、控制器B.m文件

    控制器B.m文件里面,主要是在单元格的点击事件里面给Block里面的参数赋值,具体步骤如下所示:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

        [tableView deselectRowAtIndexPath:indexPath animated:YES];

        if (_selectedIndexPath && _selectedIndexPath.row == indexPath.row) {

            _selectedIndexPath = nil; //点击了已经选中的列表项,取消选中

        }else {

            _selectedIndexPath = indexPath;

            NSDictionary *dic = _dateSource[indexPath.row];

            NSString *tempValue = dic[@"Temp"];

            NSString *timeValue = dic[@"Time"];

            NSString *waterValue = dic[@"Water"];

            NSString *title = NSLocalizedString(@"Title", nil);

            NSString *bluetooth = NSLocalizedString(@"Choose Success!", nil);

            NSString *confirm = NSLocalizedString(@"Confirm", nil);

            UIAlertController *alert = [UIAlertController alertControllerWithTitle:title                                                                     message:bluetooth preferredStyle:UIAlertControllerStyleAlert];

            UIAlertAction* cancelAction = [UIAlertAction actionWithTitle:confirm style:UIAlertActionStyleDefault

                                                                 handler:^(UIAlertAction * action) {

                                                                    //Block的赋值地方

                                                                     if (_Complate) {

                                                                         _Complate(tempValue, timeValue, waterValue); //直接给Block里面的三个参数赋值

                                                                     }

                                                                     [self.navigationController popViewControllerAnimated:YES];

                                                                 }];

            [alert addAction:cancelAction];

            [self presentViewController:alert animated:YES completion:nil];

            [self.tableView reloadData];//数据加载完成之后刷新tableview

        }

    }

    这就是通过Block进行的一个简单传值操作,记录一下方便以后使用,不喜勿喷,大牛请绕行。

     

    以上就是本章全部内容,欢迎关注三掌柜的微信公众号、微博,欢迎关注!

    三掌柜的微信公众号:

    三掌柜的新浪微博:

     

    展开全文
  • 不会使用blockiOS程序员,不是一个合格的程序员 学会了block,你再也不想用繁琐的代理 block没有你想象中的那么难,不要害怕,不要畏惧,勇敢尝试 什么是block block其实就是一个代码块,把你想要执行的...

    导语

    不会使用block的iOS程序员,不是一个合格的程序员
    学会了block,你再也不想用繁琐的代理
    block没有你想象中的那么难,不要害怕,不要畏惧,勇敢尝试

    什么是block

    block其实就是一个代码块,把你想要执行的代码封装在这个代码块里,等到需要的时候再去调用。那block是OC对象吗?答案是肯定的

    来自官方文档
    笔者以英语3.9级的水平给大家翻译下,“block是一个OC对象,这意味着它能被添加到集合,比如NSArray、NSDictionary”

    block的定义

    1. block属性或变量
      格式:返回值类型(^block名称)(参数列表)
     /*定义属性,block属性可以用strong修饰,也可以用copy修饰
      有小伙伴留言说苹果官方建议用copy,笔者查了下文档,
      确实是这样的,不过笔者未测试出copy与strong的区别,大家喜欢啥就用啥吧*/
     @property (nonatomic, strong) void(^myBlock)();//无参无返回值
     @property (nonatomic, strong) void(^myBlock1)(NSString *);//带参数
     @property (nonatomic, strong) NSString *(^myBlock2)(NSString *);//带参数与返回值
     //定义变量
     void(^myBlock)() = nil;//无参无返回值
     void(^myBlock1)(NSString *) = nil;//带参数
     NSString *(^myBlock2)(NSString *) = nil;//带参数与返回值

    2.block被当做方法的参数
    格式:(block类型)参数名称

     - (void)test:(void(^)())testBlock//无惨无返回值
     - (void)test1:(void(^)(NSString *))testBlock//带参数
     - (void)test2:(NSString *(^)(NSString *))testBlock//带参数与返回值

    3.使用typedef定义block

     typedef void(^myBlock)(); //以后就可以使用myBlock定义无参无返回值的block
     typedef void(^myBlock1)(NSString *); //使用myBlock1定义参数类型为NSString的block
     typedef NSString *(^myBlock2)(NSString *); //使用myBlock2定义参数类型为NSString,返回值也为NSString的block
     //定义属性
     @property (nonatomic, strong) myBlock testBlock;
     //定义变量
     myBlock testBlock = nil;
     //当做参数
     - (void)test:(myBlock)testBlock;

    block的赋值

    格式:block = ^返回值类型(参数列表){}
    1. 没有参数没有返回值

    myBlock testBlock = ^void(){
         NSLog(@"test");
     };
     //没有返回值,void可以省略
    myBlock testBlock1 = ^(){
         NSLog(@"test1");
     };
     //没有参数,小括号也可以省略
     myBlock testBlock2 = ^{
         NSLog(@"test2");
     };

    2.有参数没有返回值

    myBlock1 testBlock = ^void(NSString *str) {
          NSLog(str);
    }
    //省略void
    myBlock1 testBlock = ^(NSString *str) {
          NSLog(str);
    }

    3.有参数有返回值

    myBlock2 testBlock = ^NSString *(NSString *str) {
         NSLog(str)
         return @"hi";
    }
    //有返回值时也可以省略返回值类型
     myBlock2 testBlock2 = ^(NSString *str) {
         NSLog(str)
         return @"hi";
    }

    实战

    接下来,我们就结合一个实例程序,来看看block在实际开发中的简单使用
    这里写图片描述

    本案例涉及到两个控制器与一个Person类

    1. 联系人列表控制器:使用tableView展示联系人列表,称为A控制器
    2. 新建联系人控制器:创建新的联系人对象,称为B控制器
    3. Person:联系人,有两个属性,name与phoneNumber

    任务需求:点击A控制器右上角“新建”按钮跳到B控制器,B控制器添加联系人后,点击“保存”按钮返回A控制器,并将新添加的联系人展示到列表中

    问题来了,如何将B控制器中的数据传递给A控制器呢?

    那还不简单,A控制器直接把联系人数组传递给B控制器,B控制器新建联系人后添加到数组中,然后返回A控制器,在A控制器的viewWillAppear方法中刷新表格就OK了。

    方法可行,但是不得不说,相当low,B控制器是用来添加联系人的,至于联系人数组什么情况,无需关心,所以,不要把数组传递给B控制器

    B控制器要做的仅仅只是,新建联系人,然后把联系人对象传递给A控制器,至于A控制器拿到联系人后会做什么,那是A的事情,与B无关

    看到这里,很多人可能已经想到了代理,没错,代理也可以实现,但…是…,B控制器定义协议,声明代理方法,A控制器设置代理,遵守协议,然后实现代理方法,B控制器在合适的地方调用代理方法,卧槽,好麻烦有木有,笔者都不想写代码了,还是回家种田去吧

    好了不废话了,进入正题

    使用block传递数据

    1. 在B控制器的.h文件中定义一个没有返回值,参数类型为Person的block属性
    @property (nonatomic, strong) void(^saveBlock)(Person *);

    2.在B控制器“保存”按钮的点击方法中调用block

     - (IBAction)save:(id)sender {
         //使用事先定义好的类方法创建Person对象
      Person *person = [Person personWithName:_nameText.text phoneNumber:_phoneNumberText.text];
       /**调用block之前最好先判断block是否为空,不为空才调用,否则程序崩溃*/
       //装逼写法
     //!self.saveBlock? : self.saveBlock(person);
       //一般写法
       if (self.saveBlock) {
           self.seveBlock(person);
       }
      [self.navigationController popViewControllerAnimated:YES];
     }

    3.在A控制器中,给B控制器的block属性进行赋值

       //“新建”按钮点击执行的方法
       - (void)newContact {
         AddContactViewController *addVC = [[AddContactViewController alloc] init];
         addVC.saveBlock = ^(Person *person){
              //这里就可以拿到B控制器传递过来的person对象,添加到数组然后刷新表格
          [self.contactList addObject:person];
          [self.tableView reloadData];
         };
         [self.navigationController pushViewController:addVC animated:YES];
        }

    三步就搞定,很简单是不是,所以说,block并没有你们想想的那么复杂,自从笔者学会了block,就再也没用过代理,除了系统的。

    block常见雷区—循环引用

    使用block有一个特别要注意的地方,循环引用,何为循环引用?你引用我,我引用你,谁也不释放谁,对象无法销毁,占用内存

    我们来看一个循环引用的一个例子
    这里写图片描述
    注意看控制台输出,当点击“取消”时,B控制器被销毁,dealloc方法被调用

    把注释掉的代码打开,再运行
    这里写图片描述
    点击“取消”按钮,B被移除,但是dealloc方法没有调用,所以说,B控制器并没有销毁,why?

    block对象赋值给了B控制器的属性,因此B会对block有一个强引用,而block中又用到了self(B控制器对象),block会对使用到的外部变量进行捕获,所以,block对B控制器也有一个强引用,最终造成循环引用,谁也无法释放

    循环引用解决方法

    循环引用如何解决?很简单,一行代码搞定

    这里写图片描述
    使用weakSelf(名称随便取的)替代self,block将不再对self进行强引用
    图中__weak也可使用__unsafe_unretained,区别就是__weak修饰的指针,当对象销毁后,指针会被自动置为nil,而__unsafe_unretained修饰的指针,当对象销毁后会变成野指针,为了安全,推荐使用__weak

    block的分类

    block可分为三种

    • NSStackBlock:栈block
    • NSMallocBlock:堆block
    • NSGlobalBlock:全局block
    1. 栈block
      特点:生命周期由系统控制,函数返回即销毁
      用到局部变量、成员属性变量,且没有强指针引用的block都是栈block

    a.用到局部变量(图1),i为局部变量,block直接在NSLog中打印,没有被指针引用
    这里写图片描述

    b.用到成员属性变量(图2),name为成员属性
    这里写图片描述

    2.堆block
    特点:没有强指针引用即销毁,生命周期由程序员手动管理
    栈block如果有强指针引用或copy修饰的成员属性引用就会被拷贝到堆中,变成堆block

    a.强指针引用(图3),block被testBlock引用,testBlock就是一个block类型的强指针(ARC环境下默认就是强指针)
    这里写图片描述

    b.copy修饰的成员属性引用(图4)
    这里写图片描述

    3.全局block
    特点:命长,有多长?很长很长,人在塔在(应用程序在它就在)
    没有用到外界变量,或者只用到全局变量、静态(static)变量的block就是全局block

    对于全局block,有没有指针引用都不影响,block类型的成员属性无论是用assign、weak、strong还是copy修饰都无所谓,不过开发中很少用到全局block,所以不要用weak或assign

    a.没有用到外界变量(图5),下图中block没有用到外界变量,所以就算用weak修饰也是全局block(举个例子而已,开发中不要用weak,用了也别说是笔者教的)
    这里写图片描述

    b.只用到全局变量、静态(static)变量(图6),str为全局变量,str1为静态变量,只用到其中一个也是全局block
    这里写图片描述

    分类总结
    1.没有用到外界变量或只用到全局变量、静态变量的block为全局block,生命周期从创建到应用程序结束
    2.用到局部变量、成员属性变量的block为栈block,生命周期系统控制,函数返回即销毁
    3.有强指针引用或copy修饰的成员属性引用的block会被复制一份到堆中成为堆block,没有强指针引用即销毁,生命周期由程序员控制

    block对外界变量的捕获

    a.基本数据类型—局部变量
    block会拷贝该变量的值当做常量使用,外界修改变量的值不会影响block内部,且block内部不能对其修改

    block内部修改外界变量i的值直接报错,如果想要修改,可以在int i = 0前面加上关键字__block,此时i等效于全局变量或静态变量
    这里写图片描述

    外界变量i从0变成了1,block内部打印依然是0
    这里写图片描述

    b.基本数据类型—静态变量、全局变量、成员属性变量
    block直接访问变量地址,在block内部可以修改变量的值,并且外部变量被修改后,block内部也会跟着变

    图中_k为成员属性变量,初始值i = 10,j = 20,k = 0,block内部只对i、j、k进行一次自增操作,打印结果却是i = 12,j = 22,k = 2,所以外部的自增操作也影响了内部,即访问的是同一个内存地址
    这里写图片描述

    c.指针类型—局部变量
    block会复制一份指针并强引用指针所指对象,且内部不能修改指针的指向

    图中被注释掉的代码试图修改指针指向,所以会报错(如果想要修改,在前面加上__block),但是可以修改所指对象的值,如str从“abc”变成了“abcdef”
    这里写图片描述

    d.指针类型—全局变量、静态变量、成员变量属性
    block不会复制指针,但是会强引用该对象,内部可修改指针指向,block会强引用成员属性变量所属的对象,这也是为什么block属性内部用到self.xxx会引起循环引用的原因

    图中str2为成员属性,由于NSString是不可变的,所以从打印结果可以看出,在block内部修改了外界指针变量的引用,指向了新的字符串
    这里写图片描述

    转自:http://ios.jobbole.com/84127/

    展开全文
  • blockName表示block的名称 var_type表示参数的类型(可以是void,并省略) varName表示参数名称 1.1 Block声明及定义语法,及其变形 (1) 标准声明与定义 return_type (^blockName)(v...

    约定:用法中的符号含义列举如下:

    • return_type表示返回的对象/关键字等(可以是void,并省略)

    • blockName表示block的名称

    • var_type表示参数的类型(可以是void,并省略)

    • varName表示参数名称

    1.1 Block声明及定义语法,及其变形

    (1) 标准声明与定义

    return_type (^blockName)(var_type) = ^return_type (var_type varName) { // ... };
    blockName(var);

    (2) 当返回类型为void

    void (^blockName)(var_type) = ^void (var_type varName) { // ... };
    blockName(var);

    可省略写成

    void (^blockName)(var_type) = ^(var_type varName) { // ... };
    blockName(var);

    (3) 当参数类型为void

    return_type (^blockName)(void) = ^return_type (void) { // ... };
    blockName();

    可省略写成

    return_type (^blockName)(void) = ^return_type { // ... };
    blockName();

    (4) 当返回类型和参数类型都为void

    void (^blockName)(void) = ^void (void) { // ... };
    blockName();
    

    可省略写成

    void (^blockName)(void) = ^{ // ... };
    blockName();

    (5) 匿名Block

    Block实现时,等号右边就是一个匿名Block,它没有blockName,称之为匿名Block:

    ^return_type (var_type varName)
    { //... };

    1.2 typedef简化Block的声明

    利用typedef简化Block的声明:

    • 声明

    typedef return_type (^BlockTypeName)(var_type);

    • 例子1:作属性

    //声明 typedef void(^ClickBlock)(NSInteger index); //block属性 @property (nonatomic, copy) ClickBlock imageClickBlock;

    • 例子2:作方法参数

    //声明 typedef void (^handleBlock)(); //block作参数 - (void)requestForRefuseOrAccept:(MessageBtnType)msgBtnType messageModel:(MessageModel *)msgModel handle:(handleBlock)handle{
      ...

    1.3 Block的常见用法

    1.3.1 局部位置声明一个Block型的变量

    • 位置

    return_type (^blockName)(var_type) = ^return_type (var_type varName) { // ... };
    blockName(var);

    • 例子

    void (^globalBlockInMemory)(int number) = ^(int number){ printf("%d \n",number);
    };
    globalBlockInMemory(90);

    1.3.2 @interface位置声明一个Block型的属性

    • 位置

    @property(nonatomic, copy)return_type (^blockName) (var_type);

    • 例子

    //按钮点击Block @property (nonatomic, copy) void (^btnClickedBlock)(UIButton *sender);

    1.3.3 在定义方法时,声明Block型的形参

    • 用法

    - (void)yourMethod:(return_type (^)(var_type))blockName;

    • 例子

    UIView+AddClickedEvent.h

    - (void)addClickedBlock:(void(^)(id obj))clickedAction;

    1.3.4 在调用如上方法时,Block作实参

    • 例子

    UIView+AddClickedEvent.m

    - (void)addClickedBlock:(void(^)(id obj))clickedAction{ self.clickedAction = clickedAction; // :先判断当前是否有交互事件,如果没有的话。。。所有gesture的交互事件都会被添加进gestureRecognizers中 if (![self gestureRecognizers]) { self.userInteractionEnabled = YES; // :添加单击事件 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap)];
            [self addGestureRecognizer:tap];
        }
    }

    - (void)tap{ if (self.clickedAction) { self.clickedAction(self);
        }
    }

    展开全文
  • Block具有快速传值,简化代码的作用,但是在实际使用中如何写出漂亮的block却不是那么简单的事,就拿博主来说,虽然block经常用,但是奉行者拿来主义却总是不用心记忆写法,对于一个专业的开发者来说,这就落了下乘...

    Block具有快速传值,简化代码的作用,但是在实际使用中如何写出漂亮的block却不是那么简单的事,就拿博主来说,虽然block经常用,但是奉行者拿来主义却总是不用心记忆写法,对于一个专业的开发者来说,这就落了下乘,索性回头看了下block,对于block又有了新的认识,下面博主通过代码来介绍下如何写出漂亮的block:

        //有返回值的block
        int (^sumBlock)(int b,int c);
        sumBlock = ^(int a,int b){
            return b + a;
        };
        //无返回值的block
        void (^sumBlock2)();
        sumBlock2 = ^(){
            NSLog(@"Hello");
        };
    /*以上两种block看起来像那么回事,但是在实际运用中很少这么单独用,block多出现于传值方法,属性中。*/
    @property(nonatomic,copy)void (^myBlock)();
    @property(nonatomic,assign)int (^numBlock)(int a);
    
        //无返回值的属性block
        self.myBlock = ^(){
            NSLog(@"To use myBlock");
        };
        //有返回值的属性block
        int num = 10;
        self.numBlock = ^(int a){
            return num;
        };
    /*使用的话可以当作一个方法在本类中调用,也可在其他类中调用本类中的操作,获取本类中的参数值。*/
    block格式,在定义完类型后:(返回值类型 (^) (返回参数))block名
    //这是一个无返回值的方法block
    - (void)goToWorkOnRoad:(NSString *)onRoad duChe:(void(^)(NSString *moreCar))late noDu:(void(^)(NSString *goodRoad, NSString *goodLuck))inTime;
    
    //实现这个方法
    - (void)goToWorkOnRoad:(NSString *)onRoad duChe:(void (^)(NSString *))late noDu:(void (^)(NSString *, NSString *))inTime
    {
    //根据需要给出自己的判断依据,博主这里两个if都执行了,实际中有且只能有一个执行。
        if (late != nil)
        {
            late(@"late");
        }
        if (inTime != nil)
        {
            inTime(@"intime1",@"intime2");
        }
    
    }
      [self goToWorkOnRoad:@"this road" duChe:^(NSString *moreCar) {
            //堵车了
        } noDu:^(NSString *goodRoad, NSString *goodLuck) {
            //没堵车
        }];
    /*看起来是不是有点眼熟?有点AFNetworking的味道?这里你可以根据自己的需要往里面传值,下个界面block中执行回调或者在自己的界面中玩也是可以的*/
    
    
    /*如果要变成一个有返回值的方法,很简单,把void变成对应的类名即可,同时把需要的参数放入返回类型中(return和调用block方法传值其实是一样的)不懂的看看AF的请求方法里面怎么写的。*/
    展开全文
  • iOS开发Block语法妙用
  • 1,Block的定义格式  返回值类型 (^block变量名)(形参列表) = ^(形参列表) {}; 2,使用typedef定义Block类型 typedef 返回值类型 (^block类型名称)(形参列表); 定义好的Block变量可以像其它数据类型那样方便的...
  • iOS开发 Block声明方式

    2017-05-17 17:18:11
    1.写在方法里作为局部变量 returnType (^blockName)(parameterTypes) = ^...returnType是返回值blockName是block名称parameterTypes是参数 2.作为类的属性 @property (nonatomic, copy) returnType (^blockNam
  • 最近工作较忙,比较少写博客了,最近研究block的时候遇到一些小坑,就写出来避免大家走我的旧路,做一个帮大家填坑的填坑人,进入主题相信大家对使用block是又爱又恨,爱它给开发带来了多大的便利,但是又恨它是否...
  • iOS类型的Block

    2019-06-27 09:59:09
    Block 其实来讲有三类型 全局块 NSConcreteGlobalBlock 栈块 NSConcreteStackBlock 堆块 NSConcreteMallocBlock 全局块存储在全局内存中,相当于单例 栈块存于栈内存中,超出其作用域则马上进行销毁 ...
  • 开发中会常用到传值,正向传值很简单不必多说,那么反向传值就需要一提了,有block传值,代理传值等等。。今天咱们就来说说非常简单实用的block传值。。话不多说上代码。- (IBAction)Positioning:(id)sender { ...
  • iOS Block的使用

    2016-12-23 14:54:16
    block定义iOS4.0系统已经开始支持Block,在编程过程中,block被OC看成是对象,它封装了一段代码,这段代码可以在任何时候执行。Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或者返回值。Blcok...
  • iOS开发Block的使用随处可见,使用场景也非常多,例如在网络中进行网络请求的回调,通过Block实现逆传,封装复杂业务逻辑等等,总之Block是带有自动变量的匿名函数,在iOS开发中,能灵活掌握好Block能达到...
  • block面试题 1 什么是blockblock是对象,它封装了一段代码,这段代码可以在任何时候执行。block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。与代理协议的功能一样,也可以用于事件...
  • 一、什么是Blocks  ...二、在ios开发中,什么情况下使用Block   Block除了能够定义参数列表、返回类型外,还能够获取被定义时的词法范围内的状态(比如局部变量),并且在一定条件下(比如使用__bl
  • iOS开发关于block和局部变量和全局变量block内部引用全局变量和局部变量一直都是一个坑 block与局部变量- (void)aboutBlock1{ __block int index = 100; int (^myBlock)(int addNum) = ^(int addNum){ index += ...
  • 刚刚进入ios开发行业,发现开发中要用到大量的block回调,由此可见它的重要性。学习它之前我也是网上找的资料,推荐这篇文章http://blog.csdn.net/mobanchengshuang/article/details/11751671,我也是从这里得到一点...
  • 看了一篇文章,发现遍历数组、字典中的数据时,除了使用for循环外,还可以使用block块进行操作,瞬间感觉iOS的语言代码确实有点高大上的感觉,下面就简单的介绍一下这个方法。首先是最基本的运用形式,//基于 块...
  • 刚学iOS开发,开此贴记录学习中的一些问题,以便日后参考
  • iOS细节篇-block循环引用问题,和block安全使用方法什么时候block循环引用循环引用是什么这里就不解释了 在我平时开发中遇到block循环引用问题要满足一下两个条件 1.定义一个block作为属性定义的类 2.在实现block...
1 2 3 4 5 ... 20
收藏数 37,462
精华内容 14,984
关键字:

3种block ios开发