`
siashuayongsheng
  • 浏览: 121150 次
  • 性别: 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 块是一个独立的代码片段,始终存在于另一个编程结构的范围内,如在一个方法的主体。块可以捕获块外变量的值,但外部对于块内发生的事情一无所知。...

    ios中block的应用

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

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

    Block是iOS开发中的一种强大的编程概念,它是Objective-C和Swift中的闭包,允许你将代码块作为参数传递,也可以作为函数或方法的返回值。在iOS开发中,Block经常用于异步操作、事件处理和数据过滤等场景。下面将详细...

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

    1. 数组排序:Swift中的`sort()`方法就使用了Block来定义排序规则: ```swift let numbers = [5, 2, 8, 1, 9] numbers.sort(by: { $0 $1 }) // 将数组按升序排列 ``` 2. 异步操作:在网络请求或其他异步操作中,...

    iOS Block使用教程

    在iOS开发中,Block是一种强大的编程工具,它允许我们在代码中定义匿名函数或者闭包,使得函数能够作为参数传递,也可以直接在其他函数内部定义和使用。熟练掌握Block的使用对于提升iOS应用的代码质量、可读性和效率...

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

    本篇文章将深入探讨iOS Block的基本用法以及如何传递值。 ### 1. Block的基本结构 Block 是一个对象,它可以捕获并存储在其定义时所在上下文中的变量值。Block的语法如下: ```objc ^(参数列表)返回值类型 { // ...

    iOS block基础使用

    **iOS Block基础使用** 在iOS开发中,Block是一种强大的编程工具,它允许我们在代码中定义局部函数,可以作为参数传递,也可以返回。Block是Apple在C、Objective-C和Swift中的闭包实现,对于处理异步操作、事件回调...

    ios-block 回调.zip

    "ios-block 回调.zip"中的"CallbackDemo"很可能是展示了一个关于如何在iOS应用中使用Block进行回调的实例。 Block的基本结构由`^`符号开启,后面跟着返回类型(如果有的话),接着是参数列表,最后用`{}`包裹实现的...

    iOS block使用总结

    总的来说,Block是iOS开发中的重要工具,熟练掌握其使用能够提升代码的可读性和可维护性。通过上述知识点,我们可以更深入地理解Block的工作原理,并有效地利用它来编写更加简洁高效的代码。在实际项目中,尤其是...

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

    在Objective-C的方法中,Block可以作为一个参数,这样可以在方法内部使用这个Block。例如,GCD(Grand Central Dispatch)的`dispatch_async`函数就接受一个Block作为参数: ```objc dispatch_async(dispatch_get_...

    ios-block 多参数传值.zip

    在iOS应用开发中,Block的使用非常常见,特别是在处理异步操作、事件回调或者复杂逻辑控制时。 Block的基本语法结构如下: ```swift ^(参数列表) -&gt; 返回类型 { // Block体,包含执行的代码 } ``` 例如,一个...

    iOS的block回调

    在iOS开发中,我们经常使用Block作为回调机制,特别是在处理网络请求、动画效果或异步任务时。比如,当我们使用`NSURLSession`进行网络请求时,可以设定一个completion handler(完成处理器),这是一个Block,当...

    ios-把block当成属性放在全局字典中的用例.zip

    总的来说,这个示例提供了一种在iOS应用中方便地跨界面传递和执行Block的方法,减少了对代理模式的依赖,提高了代码的灵活性。然而,使用这种方式时也需要注意内存管理问题,避免不必要的内存泄漏。

    ios-block作为对象属性和返回值的展示方式.zip

    在iOS开发中,Block是一种强大的编程工具,它允许我们在代码中定义可执行的代码块,类似于函数,但可以在运行时动态地使用。本教程将深入探讨如何将Block用作对象属性以及作为返回值来增强代码的灵活性和可读性。 ...

    ios-block逆传值页面间的.zip

    在这个名为"ios-block逆传值页面间的.zip"的资源中,我们主要关注的是如何使用Block来实现页面间的反向传值。Block是Objective-C和Swift中的一种强大的特性,它可以作为参数传递,也可以作为返回值。对于初学者来说...

    IOS block回调代码实例Demo

    在iOS开发中,Block是一种强大的特性,它允许我们在代码中定义匿名函数,即不关联任何特定方法或函数的代码块。Block不仅可以作为局部变量、函数参数,还可以用于回调,这正是"IOS block回调代码实例Demo"所展示的...

    ios Block和代理的对比

    在iOS开发中,Block和代理是两种常用的回调机制,它们都可以用来实现对象间的通信,但具体用法和特性有所差异。下面将详细讲解Block和代理的对比,以及它们各自的应用场景。 首先,Block是一种内联函数,它可以捕获...

    iOS Block 界面传值

    在iOS开发中,Block是一种强大的特性,用于定义代码块或者说是可重用的代码段,可以作为参数传递,也可以作为返回值。它在界面传值和处理事件响应方面发挥着重要作用。本文将深入探讨iOS Block的基本使用,以及如何...

    ios-block的局部变量和全局变量和static的静态变量联系.zip

    总结起来,Block、局部变量、全局变量和静态变量都是iOS开发中的基础元素,理解它们各自的特性和相互关系对于编写高效、可靠的代码至关重要。在实际编程中,要根据需求灵活运用这些概念,确保程序的稳定性和性能。

    iOS block实现,内存管理

    2. **函数参数(Function Arguments)**:Block可以作为函数或方法的参数传递,这样可以在函数执行过程中使用Block定义的代码逻辑。 3. **静态变量(Static Variables)**:局部静态变量和全局静态变量在Block中...

Global site tag (gtag.js) - Google Analytics