OC学习--Block
来源:互联网 发布:mac电源适配器坏了 编辑:程序博客网 时间:2024/05/16 19:06
=====Block=========
block就是代码块,可以可以理解为没有名字的函数(匿名函数)。
定义:
(1)Block是OC中的一种数据类型,在iOS开发中被广泛使用
(2)^是Block特有的标记
(3)Block的实现代码是包含在{}中的
(4)使用形式类似于前面学习的函数指针,只需将“*”改为“^”。
(5)可以将Block当做比较特殊的对象
—————- ———— —— — — — - - — — -
什么是函数指针?
函数指针就是指向函数的指针!
如:实例代码
int add(int a,int b)
{
return a+b;
}
int (*p)(int,int)=add;//指针函数
Block函数例子
(1)无参无返回值block
//格式:^返回值类型(参数)
void (^block1)(void) = ^void(void) {
NSLog(@"我是无参无返回值的block");//代码实现
};
//调用block
block1();
(2)有参数有返回值(其中返回值的类型是可以省略的 )
//有参数有返回值
int (^block2)(int,int) = ^int(int a,int b) {
return a+b;
};
int (^block2)(int,int) = ^(int a, int b) {//省略返回值类型
return a+b;
};
(3) block函数做为参数传递
@interface JYDog : NSObject
-(void)testBlock:(void (^)(void))block;//定义一个具有block类型参数的函数
- (int)testBlock2:(int (^)(int,int,int))block;
@implementation JYDog
- (void)testBlock:(void (^)(void))block//实现
{
NSLog(@"执行 testblock");
block();
}
- (int)testBlock2:(int (^)(int,int, int))block//实现
{
return block(1,2,3);
}
@end
=====main=====
void (^block1)(void) = ^(void) {
NSLog(@"今天天气很凉爽");
};
JYDog *dog = [[JYDogalloc] init];
[dogtestBlock:block1];
//可以直接在调用时创建block
int avg = [dog testBlock2:^int(int a,int b, int c) {
return (a+b+c)/3;
}];
NSLog(@"1,2,3的平均值为:%d", avg);
(4 )使用typedef(参数过多的时候可以选择使用typedef)
#import <Foundation/Foundation.h>
typedef void (^BLOCK)(void);
typedef int (^BLOCK1)(int,int,int);
@interface JYDog : NSObject
- (void)testBlock:(BLOCK)block;
- (int)testBlock2:(BLOCK1)block;
@implementation JYDog
- (void)testBlock:(void (^)(void))block//实现
{
NSLog(@"执行 testblock");
block();
}
- (int)testBlock2:(int (^)(int,int, int))block//实现
{
return block(1,2,3);
}
@end
=====main=======
BLOCK block1 = ^(void) {
NSLog(@"今天天气很凉爽");
};
BLOCK1 block2 = ^int(int a,int b,int c) {
return (a+b+c)/3;
};
JYDog *dog = [[JYDogalloc] init];
[dogtestBlock:block1];
//可以直接在调用时创建block
int avg = [dog testBlock2:block2];
NSLog(@"1,2,3的平均值为:%d", avg);
(5) block的拷贝
//返回值可以省略
BLOCK block = ^(int a,int b){
return a+b;
};
NSLog(@"%p", block);
//block可以像对象一样
BLOCK newBlock = [block copy];
NSLog(@"%p", block);
NSLog(@“%”p, newBlock);//指向的地址是同一个地址
//拷贝出来的block需要释放
[newBlockrelease];
//C语言中的block拷贝与释放
BLOCK block2 = Block_copy(block);
Block_release(block2);
(6)Block的局部变量
|~ 可以使用局部变量。但是不能修改局部变量,若想修改局部变量需要添加__block修饰
|~ 可以使用全局变量
====Block在iOS中使用场景====
a.数组排序
NSMutableArray *mAry = [[NSMutableArrayalloc] initWithArray:@[@"abc",@"xiaoming",@"ios",@"swift",@"good"]];
NSComparator block = ^NSComparisonResult(id obj1,id obj2) {
return [obj1 compare:obj2]==NSOrderedDescending;
};
NSArray *newAry = [mAry sortedArrayUsingComparator:block];
b.遍历数组或者字典
c.通知
d.错误处理
e.多线程
- OC学习--Block
- OC学习-block
- OC学习-block处理
- OC学习那些事:Block
- OC学习笔记之block
- 黑马学习视频-OC-block
- OC学习:block类型数据
- OC学习笔记八 Block
- OC学习 第十三节 block
- (转)OC学习那些事:Block
- 黑马程序员:OC学习日记之block
- OC学习之 block与Protocol
- OC学习笔记十---Block与@protocol
- OC学习总结之block、category
- 学习笔记:OC的数据类型 block 使用
- IOS—OC学习六—block
- OC学习笔记(1) - block
- OC学习笔记之Block基础知识
- Maven eclipse 或者myeclipse 报错问题 Check $M2_HOME environment variable and mvn script match.
- WIN8.1下JAVA环境变量配置
- 6.16 数据持久化
- OC学习--JSON解析和XML解析
- 区分定理(Theorem)、引理(Lemma)、推论(Corollary)等概念
- OC学习--Block
- execute、executeQuery和executeUpdate之间的区别
- 第七章
- leetcode--FlattenBinaryTreetoLinkedList
- C++第六章习题第一题
- iOS --- Objective-C中的内存管理
- Cocos2d-x 3.0坐标系详解
- android ListView几种重要属性
- 为什么选择做硬件而不是吃香的软件?