OC中的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);

//代码区

NSLog(@"%p",maxValue);


一.block的四种形式

1.无参数,无返回值

void(^block)()=^(){

NSLog(@"今天有点多云");};

//Block的使用

block();

//block自己不会执行,必须调用才会执行block大括号里的代码段.

2.有参数,无返回值

void(^block1)(NSInteger,NSInteger)=^(NSInteger a,NSInteger b){

NSLog(@"%ld",a+b);

};

block1(10,5);

//void(^)(NSInteger,NSInteger)block的类型,它的名是block,我们也通过名进行调用

void(^block)(NSString *)=^(NSString *str){   

NSLog(@"%@",str);};

block(@"qqqqqqq");

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

void(^block)(NSArray *)=^(NSArray *arr){ 

for (int i=0; i<arr.count; i++) {

NSLog(@"%@",arr[i]);}};

NSArray *arr=@[@"2",@"3"];

block(arr);

3.无参数,有返回值

NSInteger是长整型

NSInteger(^block)()=^(){

return (NSInteger)10;};

//block调用没有参数也要加上括号

NSLog(@"%ld",block());

4.有参数,有返回值

NSString *(^block)(NSArray *,NSInteger)=^(NSArray *arr,NSInteger index){

return arr[index];};

NSLog(@"%@",block(@[@"1",@"2"],1));

二.用typedef来给block重新命名

typedef NSString *(^BLOCK)(NSArray *);

即 BLOCk就是block的新名字,在main.m中

BLOCK block=^(NSArray *arr){

return arr[0];}

来重新创建一个block

三,block和局部变量

__block相当于给a一个在block中修改的权限,否则它只是取值,不能赋值.

__block int a=10;

void (^block)()=^(){

a=10*a;

NSLog(@"%d",a);

};

block();

如果在外面不写上_block则里面会报错,因为a的值是不予许被改变的

四.通过block对数组进行遍历

NSArray *arr=[NSArray arrayWithObjects:@"2",@"1",@"3",@"4", nil];

//系统的block

[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

 NSLog(@"%@",obj);

}];

五.数组排序

//数组对字符串的排序

//不可变数组

NSArray *arr=@[@"asd",@"sda",@"wea",@"adv"];

//sel是方法选择器

NSArray *newArr=[arr sortedArrayUsingSelector:@selector(compare:)];

NSLog(@"%@",newArr);

NSLog(@"%@",arr);

//可变数组

//NSMutableArray *arr=[NSMutableArray arrayWithObjects:@"asd",@"sda",@"wea",@"adv", nil];

[arr sortUsingSelector:@selector(compare:)];

NSLog(@"%@",arr);

//对对象进行排序

//新建4个人的对象

Person *per1=[Person baseWithName:@"asd"sex:@"nan"];

Person *per2=[Person baseWithName:@"ashdja"sex:@"nan"];

Person *per3=[Person baseWithName:@"wqe"sex:@"nan"];

Person *per4=[Person baseWithName:@"adw"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 sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {

Person *per11=(Person *)obj1;

Person *per22=(Person *)obj2;

return [per11.name compare:per22.name];}];

for (Person *per in mArr) {

NSLog(@"%@",per.name);}



六.多态

所谓的多态性,就是以一个类作为根类,然后每个类都继承这个类,这样只要写一个根类的便利构造方法

就可以实现每个类都会调用这个方法,可以节省代码

+ (id)baseWithName:(NSString *)name

               sex:(NSString *)sex{

多态的方式完成对象的创建

//通过self class方法来找到当前的类名

id obj=[[[self class] alloc] initWithName:name Sex:sex];

return obj;}










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值