首先我们来找一下每个区域内的内存地址
栈
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对数组进行遍历
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;}
六