来源:
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];
}
分享到:
相关推荐
源码github.com/pro648/BasicDemos-iOS/tree/master/Block 块是一个独立的代码片段,始终存在于另一个编程结构的范围内,如在一个方法的主体。块可以捕获块外变量的值,但外部对于块内发生的事情一无所知。...
该文档简单的介绍了ios下block是的使用方法和一些小技巧
Block是iOS开发中的一种强大的编程概念,它是Objective-C和Swift中的闭包,允许你将代码块作为参数传递,也可以作为函数或方法的返回值。在iOS开发中,Block经常用于异步操作、事件处理和数据过滤等场景。下面将详细...
1. 数组排序:Swift中的`sort()`方法就使用了Block来定义排序规则: ```swift let numbers = [5, 2, 8, 1, 9] numbers.sort(by: { $0 $1 }) // 将数组按升序排列 ``` 2. 异步操作:在网络请求或其他异步操作中,...
在iOS开发中,Block是一种强大的编程工具,它允许我们在代码中定义匿名函数或者闭包,使得函数能够作为参数传递,也可以直接在其他函数内部定义和使用。熟练掌握Block的使用对于提升iOS应用的代码质量、可读性和效率...
本篇文章将深入探讨iOS Block的基本用法以及如何传递值。 ### 1. Block的基本结构 Block 是一个对象,它可以捕获并存储在其定义时所在上下文中的变量值。Block的语法如下: ```objc ^(参数列表)返回值类型 { // ...
**iOS Block基础使用** 在iOS开发中,Block是一种强大的编程工具,它允许我们在代码中定义局部函数,可以作为参数传递,也可以返回。Block是Apple在C、Objective-C和Swift中的闭包实现,对于处理异步操作、事件回调...
"ios-block 回调.zip"中的"CallbackDemo"很可能是展示了一个关于如何在iOS应用中使用Block进行回调的实例。 Block的基本结构由`^`符号开启,后面跟着返回类型(如果有的话),接着是参数列表,最后用`{}`包裹实现的...
总的来说,Block是iOS开发中的重要工具,熟练掌握其使用能够提升代码的可读性和可维护性。通过上述知识点,我们可以更深入地理解Block的工作原理,并有效地利用它来编写更加简洁高效的代码。在实际项目中,尤其是...
在Objective-C的方法中,Block可以作为一个参数,这样可以在方法内部使用这个Block。例如,GCD(Grand Central Dispatch)的`dispatch_async`函数就接受一个Block作为参数: ```objc dispatch_async(dispatch_get_...
在iOS应用开发中,Block的使用非常常见,特别是在处理异步操作、事件回调或者复杂逻辑控制时。 Block的基本语法结构如下: ```swift ^(参数列表) -> 返回类型 { // Block体,包含执行的代码 } ``` 例如,一个...
在iOS开发中,我们经常使用Block作为回调机制,特别是在处理网络请求、动画效果或异步任务时。比如,当我们使用`NSURLSession`进行网络请求时,可以设定一个completion handler(完成处理器),这是一个Block,当...
总的来说,这个示例提供了一种在iOS应用中方便地跨界面传递和执行Block的方法,减少了对代理模式的依赖,提高了代码的灵活性。然而,使用这种方式时也需要注意内存管理问题,避免不必要的内存泄漏。
在iOS开发中,Block是一种强大的编程工具,它允许我们在代码中定义可执行的代码块,类似于函数,但可以在运行时动态地使用。本教程将深入探讨如何将Block用作对象属性以及作为返回值来增强代码的灵活性和可读性。 ...
在这个名为"ios-block逆传值页面间的.zip"的资源中,我们主要关注的是如何使用Block来实现页面间的反向传值。Block是Objective-C和Swift中的一种强大的特性,它可以作为参数传递,也可以作为返回值。对于初学者来说...
在iOS开发中,Block是一种强大的特性,它允许我们在代码中定义匿名函数,即不关联任何特定方法或函数的代码块。Block不仅可以作为局部变量、函数参数,还可以用于回调,这正是"IOS block回调代码实例Demo"所展示的...
在iOS开发中,Block和代理是两种常用的回调机制,它们都可以用来实现对象间的通信,但具体用法和特性有所差异。下面将详细讲解Block和代理的对比,以及它们各自的应用场景。 首先,Block是一种内联函数,它可以捕获...
在iOS开发中,Block是一种强大的特性,用于定义代码块或者说是可重用的代码段,可以作为参数传递,也可以作为返回值。它在界面传值和处理事件响应方面发挥着重要作用。本文将深入探讨iOS Block的基本使用,以及如何...
总结起来,Block、局部变量、全局变量和静态变量都是iOS开发中的基础元素,理解它们各自的特性和相互关系对于编写高效、可靠的代码至关重要。在实际编程中,要根据需求灵活运用这些概念,确保程序的稳定性和性能。
2. **函数参数(Function Arguments)**:Block可以作为函数或方法的参数传递,这样可以在函数执行过程中使用Block定义的代码逻辑。 3. **静态变量(Static Variables)**:局部静态变量和全局静态变量在Block中...