6.地址,Block,SEL,多态
2015-08-01 14:56
281 查看
1.main.m文件
int maxValue(int a,int b){return a > b ? a : b;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
//---------------------------//五大内存地址--------------------------- int a = 10; NSLog(@"%p",&a);//栈--->0x7fff5fbff86c int *p = malloc(40); NSLog(@"%p",p);//堆--->0x100201ac0 static int b = 10; NSLog(@"%p",&b);//静态区--->0x1000023e0 char *string = "iPhone"; NSLog(@"%p",string);//常量区--->0x100001f75 NSLog(@"%p",maxValue);//代码区--->0x100001cd0 //---------------------------//block数据类型--------------------------- //block弥补了指向函数的指针不能够直接保存一个函数体(代码块),相当与一个匿名的函数,等号前面是代码块的定义,后面是实现内容,有四种形式 //1.无参数无返回值 void (^block)() = ^{ NSLog(@"暴风雨来了"); }; block();//--->暴风雨来了 //block自己不会执行,必须调用才会执行block大括号里面的代码段 //2.有参数无返回值 void (^maxBlock)(int,int) = ^(int a,int b){ int max = a > b ? a : b; NSLog(@"%d",max); }; maxBlock(6,9);//--->9 //void (^)(int,int)是block的类型,他的名字是block,我们也可以通过名进行调用 void (^arrBlock)(NSArray *) = ^(NSArray *arr){ for (NSString *str in arr) { NSLog(@"%@",str); } }; NSArray *arr = @[@"1",@"2",@"3"]; arrBlock(arr);//--->1,2,3 //3.无参数有返回值 int (^oneBlock)() = ^{ return 10; }; NSLog(@"%d",oneBlock());//block调用没有参数也得有()--->10 //4.有参数有返回值 int (^mBlock)(int,int) = ^(int a,int b){ return a > b ? a : b; }; NSLog(@"%d",mBlock(3,8));//--->8 NSString *(^ablcok)(NSArray *,NSInteger) = ^(NSArray *arr,NSInteger index){ return arr[index]; }; NSLog(@"%@",ablcok(@[@"1",@"2"],1));//--->2 //5.如果想改变block代码块之外的变量值,就必须在之前加入__block关键字 __block int x = 100; int (^sumBlock)(int a,int b) = ^int(int a,int b){ int result = a + b; x = result; return result; }; //block自己不会执行,必须调用才会执行block大括号里面的代码段 NSLog(@"x = %d",x);//100 NSLog(@"a+b=%d",sumBlock(11,14));//25 NSLog(@"x = %d",x);//25 //当在开发中一个方法有多种实现的时候,如果不确定用哪种方法更好,我们可以考虑把方法中的一个参数定义成block方式 Calculate *cal = [[Calculate alloc]init]; int sum = [cal calculateWithNumber1:10 andNumber2:20 andCalculate:sumBlock]; NSLog(@"a + b = %d",sum);//30 //通过用系统的block对数组进行遍历(用法用回车) NSArray *array = [NSArray arrayWithObjects:@"1",@"2",@"3",@"4", nil]; [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { NSLog(@"%@",obj);//--->1,2,3,4 }]; //数组排序数组对字符串的排序 //不可变数组 NSArray *arr1 = @[@"zhan",@"wuhe",@"liusansan",@"wangjumin",@"hehehd"]; //SEL叫方法选择器,他是方法选择器的类型 NSArray *arra = [arr1 sortedArrayUsingSelector:@selector(compare:)]; NSLog(@"%@",arra);//--->hehehd,liusansan,wangjumin,wuhe,zhan //可变数组排序 NSMutableArray *array1 = [NSMutableArray arrayWithObjects:@"zhan",@"wuhe",@"liusansan",@"wangjumin",@"hehehd",nil]; [array1 sortUsingSelector:@selector(compare:)]; NSLog(@"---%@",array1);//--->hehehd,liusansan,wangjumin,wuhe,zhan //对对象进行排序 //新建四个人的对象 Person *per1 = [Person baseWithName:@"zhangxiaoyun" sex:@"nv"]; Person *per2 = [Person baseWithName:@"wangya" sex:@"nv"]; Person *per3 = [Person baseWithName:@"liushuxi" sex:@"nan"]; Person *per4 = [Person baseWithName:@"shiyu" sex:@"nv"]; NSArray *arr2 = @[per1,per2,per3,per4]; NSArray *newArr = [arr2 sortedArrayUsingComparator:^NSComparisonResult(Person *obj1, Person *obj2) { return -[obj1.name compare:obj2.name];//加个-号变为降序排列 }]; for (Person *per in newArr) { NSLog(@"%@",per.name); } NSMutableArray *arr3 = [NSMutableArray arrayWithObjects:per1,per2,per3,per4,nil]; [arr3 sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { Person *per11 = (Person *)obj1; Person *per22 = (Person *)obj2; return [per11.name compare:per22.name]; }]; for (Person *per in arr3) { NSLog(@"%@",per.name); } //---------------------------//SEL数据类型------------------------------------ Calculate *person = [[Calculate alloc]init]; //[person eat];//消息机制 //使用@select就能够把一个方法包装成SEL数据类型 SEL s1 = @selector(eat); [person performSelector:s1]; //上面两句合并等价于下面一句 [person performSelector:@selector(eat)]; SEL s2 = @selector(call:); [person performSelector:@selector(call:) withObject:@"15382006306"]; SEL s3 = @selector(fingName); NSString *str = [person performSelector:s3]; NSLog(@"%@",str);
} return 0;
}
2.Calculate.h文件
#import <Foundation/Foundation.h> typedef int (^calculateBlock)(int a,int b); @interface Calculate : NSObject - (int)calculateWithNumber1:(int)number1 andNumber2:(int)number andCalculate:(calculateBlock)calculate; - (void)eat; - (void)call:(NSString *)number; -(NSString *)fingName; //简单的多态--------------------------------------------> @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
2.Calculate.m文件
#import "Calculate.h" @implementation Calculate - (int)calculateWithNumber1:(int)number1 andNumber2:(int)number2 andCalculate:(calculateBlock)calculate { //经常变化的功能,在设计当中叫做封装变化 return calculate(number1,number2); } - (void)eat { NSLog(@"吃东西"); } - (void)call:(NSString *)number { NSLog(@"打电话给:%@",number); } -(NSString *)fingName { return @"找到了曹颖"; } //简单的多态--------------------------------------------> - (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
相关文章推荐
- qt学习之键盘事件( keyPressEvent)
- android 数据存储
- 【Entity Framework 7】 完全不一样的玩法
- HTML构成及基本标签
- Lucene七(搜索)
- hdu5319 Painter
- UVA - 11354Bond最小生成树,LCA寻找最近公共祖先
- Matlab中varargin函数
- 机试算法讲解:第50题 动态规划之拦截导弹
- 回溯法解决N皇后问题
- 二叉树的前序遍历三种方法
- java.lang.ClassNotFoundException: Didn't find class "*****Activity" on path: /data/app/*******.apk
- malloc(0)
- DESTOON 新增模块的方法
- Java测试工具和框架
- KVC 与 KVO
- poj-3083 Children of the Candy Corn-DFS+BFS
- Servlet实现用户数的统计
- windows的socket_tcp客服端端与linux的socket_tc服务端简单通讯
- HDU 5224 Tom and paper(最小周长)