block 的四种形式
//1. 无参数无返回值
void (^block1)() = ^(){
NSLog(@"好烦哦");
};
//block 的使用:
block1();
//block自己不会执行,必须调用才会执行block大括号中的代码段.
// 2. 有参数无返回值.
// void (*p)(int , int) = NULL; (函数指针写法)
void (^block2)(int, int) = ^(int a , int b){
int max = a > b ? a : b;
NSLog(@"%d",max);
};
// 使用
block2(20,10);
// void (^)(int, int)是block的类型,它的名字是block,我们也通过名进行调用.
// 参数是字符串:
void (^block2)(NSString *) = ^(NSString *str){
NSLog(@"%@",str);
};
block2(@"哈哈");
// 参数是一个数组,对数组进行遍历
void (^block2)(NSArray *) = ^(NSArray *arr){
for (NSArray *a in arr) {
NSLog(@"%@",a);
}
};
NSArray *arr = @[@"1",@"2"];
block2(arr);
block2(@[@"3",@"6"]);
// 3. 有返回值,无参数
int (^block3)() = ^(){
return 100;
};
// block调用时没有参数也要加上括号.
NSLog(@"%d",block3());
//4. 有参数,有返回值
NSString * (^block4)(NSArray *, NSInteger) = ^(NSArray *arr , NSInteger index){
return [arr objectAtIndex:index];
};
// 给入字符串,返回整型:
NSInteger (^block4)(NSString *) = ^(NSString *str){
return str.integerValue;
};
NSLog(@"%ld",block4(@"222"));
// 参数日期字符串,返回NSdate:
NSDate *(^block4)(NSString *) = ^(NSString *str){
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH-mm-ss"];
return [formatter dateFromString:str];
};
NSLog(@"%@",block4(@"2015-08-12 19:00:00"));
//block的函数段中更多使用参数,而返回值是谁调用谁使用.
typedef
#import <Foundation/Foundation.h>
//函数指针的typedef:
//新的类型名写在*之后
typedef int(*PFUN)(int, int);
// block的typedef:
typedef NSString *(^Block)(NSArray *) ;
//练习.有返回值,无参数
typedef NSInteger(^BB)() ;
int main(int argc, const char * argv[]) {
//通过新的block写一个block
Block block = ^(NSArray *arr){
return arr[0];
};
return 0;
}
block和局部变量
// __block相当于a一个在block中修改的权限,否则他只能取值,不能赋值.
__block int a = 10;
void (^block)() = ^{
a = 10 * a; // 若不写__block就不能用a承接结果.
NSLog(@"%d",a);
};
block();
系统的block
//通过block对数组进行遍历
NSArray *arr= [NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5", nil];
// 系统block,用法就是回车.
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"%@",obj);
}];
数组排序
数组对字符串的排序
//不可变数组
NSArray *arr = @[@"zhangjian",@"yanglin",@"liujian"];
//SEL -- 方法选择器,他是方法选择器的类型.
NSArray *arrnew = [arr sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"%@",arrnew);
NSLog(@"%@",arr);
//可变数组
NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"zhangjian",@"yanglin",@"liujian", nil];
[arr sortUsingSelector:@selector(compare:)];
NSLog(@"%@",arr);
数组对对象进行排序
// 新建四个人的对象
Person *per1 = [Person baseWithName:@"liujia" sex:@"nan"];
Person *per2 = [Person baseWithName:@"wangjian" sex:@"nan"];
Person *per3 = [Person baseWithName:@"heshuang" sex:@"nv"];
//不可变数组
// 用字面量创建对象和便利构造器创建是一样的
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);
};
多态
创建一个BaseModel的类.
BaseModel.h 文件
#import <Foundation/Foundation.h>
@interface BaseModel : NSObject
@property(nonatomic, copy)NSString*name;
@property(nonatomic, copy)NSString *sex;
- (id)initWithName:(NSString *)name sex:(NSString *)sex;
+ (id)baseWithName:(NSString *)name sex:(NSString *)sex;
@end
BaseModel.m 文件
#import "BaseModel.h"
@implementation BaseModel
- (id)initWithName:(NSString *)name sex:(NSString *)sex{
self = [super init];
if (self) {
self.name = name;
self.sex = sex;
}
return self;
}
+ (id)baseWithName:(NSString *)name sex:(NSString *)sex{
//用多态的方式完成对这个对象的创建.
id obj = [[[self class] alloc] initWithName:name sex:sex];
return obj;
}
@end
在创建一个Student 类, 继承于BaseModel
main.m 文件
Person *per = [Person baseWithName:@"张贱" sex:@"男"];
NSLog(@"%@",per.name);
直接可以调用baseWithName方法创建对象.