OC10-Block

栈区

int a = 10;
NSLog(@"%p",&a);

堆区

int *p=malloc(40);
NSLog(@"%p",p);

全局静态区

static int b = 10;
NSLog(@"%p", &b);

常量区

常量字符串

char *str="iPhone";
NSLog(@"%p",str);

代码区

xx.m
int addNum(int a,int b){
    return a+b;
}
main.m
NSLog(@"%p",maxValue);

函数指针的类型

NSInteger (*)(NSInteger ,NSInteger );
NSInteger ( *pointer)(NSInteger ,NSInteger)=maxValue;
NSLog(@"%p",pointer);

拿函数名进行调用

NSLog(@"%ld",maxValue(10, 5));

拿函数指针进行调用

NSLog(@"%ld",pointer(10,5));

四种形式的block

1.无参数,无返回值

void (^block)()= ^(){
NSLog(@"多云");
};
// 直接用block()调用
block();
// block自己不会执行,必须调用才会执行block大括号里的代码段

2.有参数,无返回值

函数指针
void (*p)(int,int)=nil;
// block
void (^block)(int,int)=^(int a,int b){
int max = a>b?a:b;
NSLog(@"%d",max);
 };
// 调用  先有block  才能对block进行调用
block(10,2);
// void(^)(int,int)是block的类型,它的名是block,我们也通过名进行各种调用
void (^block)(NSString *)=^(NSString *str){
NSLog(@"%@",str);   
 };
block(@"nihao");

参数是一个数组,对数组进行遍历

void(^block)(NSArray *)=^(NSArray *arr){
for (NSString *temp in arr) {
NSLog(@"%@",temp);
}
};
block(@[@"1",@"2"]);

3.有返回值,无参数

// 有返回值在函数段的最后要加上return
int (^block)()=^(){
// 这里默认100 是long型
return 100;
 };
// block调用时即使没有参数()也得加上
NSLog(@"%d",block());
// 类型不同的时候需要转换
NSInteger (^block)()=^(){
return (NSInteger)100;
};

4.有返回值,有参数

NSString *(^block)(NSArray *,NSInteger)=^(NSArray *arr,NSInteger index){ 
return arr[index];
};
NSLog(@"%@",block(@[@"1",@"2"],0));

练习

写一个返回值为整型,参数为NSString ,(仅一个参数)的block,实现将字符串转换为整型的功能
NSInteger (^block)(NSString *)=^(NSString * str)
{
// 返回整型,参数为字符串
return [str integerValue];// 属性,也可以用点语法
};
NSLog(@"%ld",block(@"1234567"));
// NSInteger 为返回值的类型,NSString 为参数的类型
参数日期的字符串,返回NSDate类型的日期对象
NSDate *(^block)(NSString *)=^(NSString *str)
{
NSDateFormatter *formatter=[[NSDateFormatter alloc]init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
return [formatter dateFromString:str];
};
NSString *str=@"2015-7-23 17:18:10";
NSLog(@"%@",block(str));

block函数段更多使用参数,而返回值更多的是调用一方使用

对函数指针进行typedef

xx.m
typedef int (*PFUN)(int ,int );
main.m
PFUN p=addNum;
NSLog(@"%d",p(10,20));

对block进行typedef

block所对应的类型
typedef NSString *(^Block) (NSArray *);
// 通过新的block写一个block
Block block =^(NSArray *arr){
return arr[0];
};
// 有返回值,无参数
typedef NSInteger (^Block1)();

block和局部变量

// 无返回值无参数
// __block相当于给a一个在block中修改的权限,否则它只能取值,不能赋值,但是全局变量可以
__block int a =10;
void(^block)()=^()// 没有参数的话不写括号也可以  括号中写void也可以
{
int b=10*a;
NSLog(@"%d",b);
};
block();

通过block对数组进行遍历

// 使用系统的方法
NSArray *arr=[NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5",@"6", nil];
// 用系统的block
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"%@",obj);
}];
// id obj:NSString *obj
// 系统的block的用法就是回车

数组排序

// 数组对字符串的排序
NSArray *arr=@[@"zhangyangyang",@"wuhe",@"liushanshan",@"yanglin",@"wangjunmin"];
//SEL是方法选择器,它是方法选择器的类型  
NSArray *newArr=[arr sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"%@",newArr);
NSLog(@"%@",arr);

可变数组

NSMutableArray *arr=[NSMutableArray arrayWithObjects:@"zhangyangyang",@"wuhe",@"liushanshan",@"yanglin",@"wangjunmin", nil];
[arr sortUsingSelector:@selector(compare:)];
NSLog(@"%@",arr);

对对象进行排序

Person *per1=[Person baseWithName:@"yanglin" sex:@"nan"];
Person *per2=[Person baseWithName:@"wuhe" sex:@"nan"];
Person *per3=[Person baseWithName:@"cuimou" sex:@"nv"];
Person *per4=[Person baseWithName:@"shangshuai" sex:@"nan"];
NSArray *arr=@[per1,per2,per3,per4];

// 以学生的姓名作为排序的依据
NSArray *newArr=[arr sortedArrayUsingComparator:^NSComparisonResult(Person * obj1, Person * obj2) {
return [obj1.name compare:obj2.name];
}];
for (Person *per in newArr) {
NSLog(@"%@",per.name);
}
NSMutableArray *mArr=[NSMutableArray arrayWithObjects:per1,per2,per3,per4, nil];
[mArr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
Person *per1=(Person *)obj1;
Person *per2=(Person *)obj2;
return [per1.name compare:per2.name];
}];
for (Person *per in mArr) {
NSLog(@"%@",per.name);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值