Block:语法块,本质上是匿名函数(没有名称的函数)
标准C里面没有Block,C语言的后期扩展版本,加入了匿名函数
在C++、JS、Swift等语言有类似语法,叫做闭包
Block语法和C语言里的函数指针很相似,下面我们先来回顾下C语言中的函数和函数指针
C语言中函数是指:实现某一功能的代码段
完整的函数包括两部分:函数声明、函数定义
函数声明,即函数原型。例如: int sum (int x,int y) ;具有两个整形参数,一个整形返回值的函数
函数定义,即函数实现。例如: int sum(int x,int y){
return x + y;
}
函数指针(变量):存放函数地址(函数名)的指针变量
int(*p)(int x,int )= sum;
函数指针类型: int(*)(int x,int y) 即:指向两个整形参数,一个整形返回值函数的指针
函数指针变量: p
函数指针的值: sum
Block 匿名函数:没有名称的函数
例如: int (int x,int y)
因为Block是匿名函数,block变量存放的函数的实现,通过block变量能直接调用函数
Block类型: int (^)(int)
Block变量: myBlock
Block值: ^int (int num) {return 7*num;}
即:^返回值类型(参数列表){函数体}其中返回值类型可以省略
例如:写一个 返回值为整形 参数为OC字符串(仅一个参数)的block,实现将字符串转换为整形的功能
int (^myBlock)(NSString *) = ^(NSString *string) {
return [string intValue];
};
NSLog(@"%d",myBlock(@"123"));
block的数据类型代表了匿名函数的格式(返回值类型,形参的类型)
block变量的定义与函数指针变量的定义类似,唯一区别于函数指针变量的是变量名前通过脱字符(^)修饰
首先应该用^修饰,剩余的部分与C语言函数定义一致,最大的不同就是没有函数名(同时返回值类型也可以省略)
block变量在定义时具有变量定义的基本特征,赋值号右侧的匿名函数可以当做一个整体被赋值,类似于 int a = 5;
block变量所赋的值是匿名函数。又兼具函数的特征,并且是唯一可以定义在某个函数实现内部(C语言中认为函数是不能嵌套定义的,block是个特例)
Block进行typedef
typedef int (^BlockType)(int x,int y)
原类型: int(^)(int x,int y)
新类型: BlockType
类比函数指针的类型定义,格式与函数指针一致,类型定义一定程度上简化了block的使用。
typedef int (^SumType)(int,int);
SumType sumBlock = ^(int x,int y) {
return x + y;
};
int result = sumBlock(5,4);
NSLog(@"%d",result);
__block类型标识可以运行局部变量在其后续定义的block内部正常访问,
__block int num = 0;
void (^testBlock)() = ^() {
for (int i = 0; i < 10; i++) {
count++;
num++;
NSLog(@"%d",count);
}
};
block调用
testBlock();
数组使用Block排序
数组使用Block对两个字符串进行比较
NSComparisonResult (^compareBlock)(NSString *,NSString *) = ^(NSString *str1,NSString *str2) {
return [str2 compare:str1];
//如果是升序返回-1,如果是降序返回1,如果相等返回0
};
NSLog(@"%ld",compareBlock(@"11",@"12"));
NSArray *array = @[@1,@2,@13,@12,@23];
NSArray *resultArray1 = [array sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"%@",resultArray1);
数组使用Block排序 降序排列
NSComparator sortBlock = ^(id obj1,id obj2) {
return [obj2 compare:obj1];
};
NSArray *resultArray2 = [array sortedArrayUsingComparator:sortBlock];
NSLog(@"%@",resultArray2);
升序序排列
NSArray *resultArray3 = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2];
}];
NSLog(@"%@",resultArray3);
温馨提示:内容为网友见解,仅供参考
OC数组中的汉字怎么输出?
遍历数组输出。for(nstring *str in array ){然后输出字符串}
一个数组里有各种中文人名,怎样按拼音首字母把里面的元素分别存到另外的...
那得先知道所有姓的拼音第一个字母啊。我是很想帮你,我也会写。就是不知道这个每个字所对应的拼音啊。如果有了就好做了。用搜狗拼音的码表也可以。就是分数太少了。这里面用到的了比较多的技术,有排序,二分查找,有HASH,等等。
OC中有没有什么方法可以改变对象指针的名字?
既然已经放到数组里就不用再起名字了吧,用的时候直接取就好了,比如views[0],views[1]。名字跟对象本身没关系,如果是为了区分它们,应该是设置它们的tag
oc 和c的数组有什么区别
OC中的数组算是一个封装好的对象,你一般的操作基本就能满足了,但是C里面的就仅仅是个连续的内存空间而已~一个是对象一个空间,另外一个我记得C里面的数组是要在定义的时候就要初始化个数的吧,但是OC里面的个数比较动态
oc 类只能处理他本身是什么意思
这时你懒加载也就是重写get方法,在里面初始化数组就可以了。set方法主要是你从一个页面往另一个页面给他赋值的时候一般会重写set方法,这样可以拦截赋值操作,在里面做一些你想做的事。重要的是你用set和get方法不可以用点语法,因为点语法的实质就是set和get,这样会死循环或者崩溃。希望能帮到你。
oc中数组里前4个图片怎么放在同一个cell里
自定义cell,给cell.contentview上加4个imageview..给数组的个数取余n%4.分别放在imageview1,imageview2,imageview3,imageview4上,用n\/4来记录放在第几行的cell.,,,我好像也不太确定。。。
oc数组怎么放float 类型
bool等包装成NSNumber类型在放入数组。举例:CGFloat f = 9.99;NSNumber *num = [NSNumber numberWithFloat:f];NSArray *array = @[num];或者 直接用@(),@()就是把基本数据类型包装成NSNumber NSArray *array = @[@(9.99)];最后再取出:CGFloat f2 = [array[0] floatValue];
oc 中label为元素的数组怎么创建
UILabel 用text 属性,通过给text赋值来让它显示, 要把数据显示到label上面只要转化为NSString类型就好了, 如果是单个显示的话,先取出数据,加入是int类型可以这样:int num =[ array[i] intvalue]; NSString *str = [NSString stringWithFor...
OC中removeObject什么功能
可变大小数组: NSMutableArray类 NSMutableArray* array = [NSMutableArray arrayWithObjects:@"aaa",@"bbb",nil];给这个array初始化 [array removeObject:@"aaa"]; 用来移除array中的@"aaa"对象。就是这个功能。。。
C++中的函数调用在OC是另外一种称谓,是什么
在oc中只能用第二种方法初始化,第一种方法是没有的。只有当类中有指针的时候,才能延迟初始化,char *pBuffer; \/\/类的对象中包含指针,指向动态分配的内存资源 int nSize;};只有这种情况下,pBuffer会在需要的时候去动态的申请内存。再来谈谈c++的拷贝构造函数:在C++中,下面三种对象需要调用拷贝构造...