`
siashuayongsheng
  • 浏览: 118013 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

IOS中Block的基础用法

    博客分类:
  • IOS
阅读更多

来源:http://www.jianshu.com/p/e03292674e60

Block简介
Block是一种比较特殊的数据类型。它可以保存一段代码,在合适的时候取出来调用。


ARC情况下
1.如果用copy修饰Block,该Block就会存储在堆空间。则会对Block的内部对象进行强引用,导致循环引用。内存无法释放。
解决方法:
新建一个指针(__weak typeof(Target) weakTarget = Target )指向Block代码块里的对象,然后用weakTarget进行操作。就可以解决循环引用问题。

2.如果用weak修饰Block,该Block就会存放在栈空间。不会出现循环引用问题。

MRC情况下
用copy修饰后,如果要在Block内部使用对象,则需要进行(__block typeof(Target) blockTarget = Target )处理。在Block里面用blockTarget进行操作。




Block的定义格式
返回值类型(^block变量名)(形参列表) = ^(形参列表) {
};
调用Block保存的代码
block变量名(实参);

默认情况下,Block内部不能修改外面的局部变量
Block内部可以修改使用__block修饰的局部变量

Block的模式
1.无参数无返回值的Block
2.有参数无返回值的Block
3.有参数有返回值的Block


block用法举例

无参数无返回值的Block

/**
 *  无参数无返回值的Block
 */
-(void)func1{
    /**
     *  void :就是无返回值
     *  emptyBlock:就是该block的名字
     *  ():这里相当于放参数。由于这里是无参数,所以就什么都不写
     */
    void (^emptyBlock)() = ^(){
        NSLog(@"无参数,无返回值的Block");
    };
    emptyBlock();
}
有参数无返回值的Block

/**
     *  调用这个block进行两个参数相加
     *
     *  @param int 参数A
     *  @param int 参数B
     *
     *  @return 无返回值
     */
    void (^sumBlock)(int ,int ) = ^(int a,int b){
        NSLog(@"%d + %d = %d",a,b,a+b);
    };
    /**
     *  调用这个sumBlock的Block,得到的结果是20
     */
    sumBlock(10,10);
有参数有返回值的Block

/**
     *  有参数有返回值
     *
     *  @param NSString 字符串1
     *  @param NSString 字符串2
     *
     *  @return 返回拼接好的字符串3
     */    
    NSString* (^logBlock)(NSString *,NSString *) = ^(NSString * str1,NSString *str2){
        return [NSString stringWithFormat:@"%@%@",str1,str2];
    };
    //调用logBlock,输出的是 我是Block
    NSLog(@"%@", logBlock(@"我是",@"Block"));


Block结合typedef使用
自己定义一个Block类型,用定义的类型去创建Block,更加简单便捷。
这里举例一个Block回调修改上一下界面的背景颜色。
ViewController1 控制器1,ViewController2 控制器2
控制器1跳转到控制器2,然后在控制器2触发事件回调修改控制器1的背景颜色为红色。

ViewController2的实现

#import <UIKit/UIKit.h>
@interface ViewController2 : UIViewController
/**
 *  定义了一个changeColor的Block。这个changeColor必须带一个参数,这个参数的类型必须为id类型的
 *  无返回值
 *  @param id
 */
typedef void(^changeColor)(id);
/**
 *  用上面定义的changeColor声明一个Block,声明的这个Block必须遵守声明的要求。
 */
@property (nonatomic, copy) changeColor backgroundColor;
@end
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //声明一个颜色
    UIColor *color = [UIColor redColor];
    //用刚刚声明的那个Block去回调修改上一界面的背景色
    self.backgroundColor(color);
}
ViewController1的实现

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    ViewController2 *vc =[[ViewController2 alloc]init];
    // 回调修改颜色
    vc.backgroundColor = ^(UIColor *color){
        self.view.backgroundColor = color;
    };
    [self.navigationController pushViewController:vc animated:YES];
}





分享到:
评论

相关推荐

    ios-Block的用法.zip

    源码github.com/pro648/BasicDemos-iOS/tree/master/Block 块是一个独立的代码片段,始终存在于另一个编程结构的范围内,如在一个方法的主体。块可以捕获块外变量的值,但外部对于块内发生的事情一无所知。...

    swift-iOS中Block的用法举例解析与底层原理

    iOS中Block的用法,举例,解析与底层原理(Block看我really足够了)

    ios中block的应用

    该文档简单的介绍了ios下block是的使用方法和一些小技巧

    ios-Block基础,block传值,及自定义block方法.zip

    block基础知识及block应用。 本例介绍了使用block实现界面传值,自定义带有block代码块的方法。

    iOS Block 的使用, 包括传值, 基本用法

    iOS Block 的使用, 包括传值, 基本用法

    block在ios中的具体用法与解析

    该文件描述了block的具体用法和调用,和c语言中的指针函数进行比较的详解。请下载参考

    ios Block和代理的对比

    已经拥有一年经验的你真的了解Block 代理方法吗?也许不!以前我以为自己都有上架项目,这都是太基础的东西,但今天我重新回头看了以前做的笔记,真的是书读百遍,其义自见。

    ios-UILabel类别Block扩展.zip

    1、block加号减号方法创建label对象 2、block加号减号方法创建自适应宽度和高度的label对象 3、block加号减号方法创建文字填充图片按图片颜色变化的label对象 4、block加号减号方法创建带有格式化字符串的label...

    iOS中block的定义与使用

    用来实现匿名函数的特性,block是一种特殊的数据类型,其可以正常定义变量、作为参数、作为返回值,特殊地,block还可以保存一段代码,在需要的时候调用,目前block已经广泛应用于iOS开发中,常用于GCD、动画、排序及各类回...

    ios-使用block和runtime对button的封装.zip

    UIButton类在使用时需要一行行的来设置属性,代码过于冗余。每个点击事件都要创建一个方法,不利于阅读。最新代码地址:https://github.com/Maricle1/ControlsPackage.git

    iOS中Block的回调使用和解析详解

    先跟着我实现最简单的 Block 回调传参的使用,如果你能举一反三,基本上可以满足了 OC 中的开发需求。已经实现的同学可以跳到下一节。 首先解释一下我们例子要实现什么功能(其实是烂大街又最形象的例子): 有两个...

    ios-Block方式使用蓝牙,打印POS小票.zip

    所以我用block方式重写了,蓝牙管理的所有代码在HLBluetooth目录中。 又因为项目中要用蓝牙控制打印机打印下票,我又把蓝牙打印机的操作封装了一下,所有代码在HLPrinter目录下。 完整的使用介绍:...

    ios-用Block形式返回按钮动作的按钮.zip

    方法来触发按钮的动作,而改成用一个block的方式来出发动作,这样处理后,一可以降低代码的分散度,二当我再次查看按钮的触发方法实现细节时就不用点command跳到方法里,而是在按钮的初始化位置就能看到按钮的点击...

    iOS通过block在两个页面间传值的方法

    不知道大家有没有发现,在实际开发中使用block的地方特别多,block比delegate和notification有着更简洁的优势,下面这篇文章我们来简单了解一下block在两个页面之间的传值。有需要的朋友们可以参考借鉴,下面来一起...

    浅谈iOS 对于block的一点理解

    block是对象,它封装了一段代码,这段代码可以在任何时候执行。block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:block是inline的,并且它对局部...

    iOS中详解Block作为property属性实现页面之间传值

    但是区别也很明显,因为函数肯定是在-viewDidLoad方法外面定义,而Block变量定义在了viewDidLoad方法内部。当然,我们也可以把Block定义在-viewDidLoad方法外部,例如上面的代码块printNumBlock的定义,就在-...

    ios-iOS中常见的6种传值方式.com

    通过属性传值、方法传值、代理传值、Block传值、单例传值、通知传值6种方式进行不同视图之间的传值。不同方式只需要在AppDelegate中更改下UINavigationController的根控制器即可。使用很简单的实例让你很快理解不同...

    iOS中使用JSPatch框架使Objective-C与JavaScript代码交互

    JSPatch是GitHub上一个开源的框架,其可以通过Objective-C的run-time机制动态的使用JavaScript调用与替换项目中的Objective-C属性与方法。其框架小巧,代码简洁,并且通过系统的JavaScriptCore框架与Objective-C进行...

Global site tag (gtag.js) - Google Analytics