[objc] view
plain
copy

  1. "code" class="OC">
  2. //
  3. //  main.m
  4. //  Copyright (c) 2015年 tongxing. All rights reserved.
  5. //
  6. #import
  7. #import "Student.h"
  8. typedef int(^BlockType)(int,int);
  9. int globalVariable = 200;
  10. int main(int argc, const charchar * argv[])
  11. {
  12. @autoreleasepool {
  13. //int (int a,int b)表示匿名函数的类型
  14. //int (^ )(int a,int b)表示Block的类型
  15. //myBlock实现的是匿名函数的实现体部分
  16. int (^ myBlock)(int a ,int b) =^int(int a ,int b){
  17. return a+b;
  18. };//这里需要加分号,因为这整个部分相当于一个赋值语句,大括号内容赋值给块变量myBlock
  19. //按照调用函数的方式调用块对象
  20. int value =   myBlock(3,5);//通过myBlock实现两个整型数的求和,返回值为int
  21. NSLog(@"%d",value);
  22. //写⼀个 返回值为整型 参数为NSString(仅⼀一个参数)的block,实现将字符串转换为整型的功能.
  23. int (^strBlock)(NSString *str)=^int(NSString *str){
  24. int value =[str intValue];
  25. return value;
  26. };
  27. NSString *str = @"123";
  28. //使用block
  29. NSLog(@"%d",strBlock(str));
  30. //练习,定义三个block求商/差/积
  31. int (^cutBlock)(int ,int )=^int(int a,int b){
  32. return a-b;
  33. };
  34. int (^dealerBlock)(int ,int)= ^(int a,int b){
  35. return  a%b;
  36. };
  37. int (^rideBlock)(int,int ) = ^(int a,int b){
  38. return a*b;
  39. };
  40. NSLog(@"%d",cutBlock(3,5));
  41. NSLog(@"%d", dealerBlock(3,5));
  42. NSLog(@"%d",rideBlock(3,5));
  43. //对于上面三个函数的类型都一样,所以可以引入typedef来在#import下面进行重定义
  44. #pragma mark----给相同block类型进行重命名
  45. BlockType myBlock1 = ^int(int a,int b){//对于^后面的int可以省略,但是系统默认的是int型,所以如果是其他类型一定要写上
  46. return a-b;
  47. };
  48. NSLog(@"%d",myBlock1(4,5));
  49. //.....
  50. #pragma mark----block与全局变量
  51. //定义一个全局变量globalVariable
  52. void (^block)(void) = ^(){//^(void)(),前面的返回值类型void可以省略,但是后面的括号语法上定义是不可以省略(),但是经过测试没有参数也可以省略
  53. globalVariable++;//如果是全局变量可以直接被访问和修改
  54. NSLog(@"%d",globalVariable);
  55. };
  56. block();
  57. #pragma mark----block与局部变量
  58. // int number =1;//局部变量需要加__block,否则会提示出错
  59. __block  int  number = 1;
  60. void (^block1)(void) = ^(){
  61. number++;//如果是局部变量不可以直接被访问和修改,必须在number前面加一个__block,这里需要打两个小_
  62. NSLog(@"%d",number);
  63. };
  64. block1();
  65. #pragma mark----block自动截取变量
  66. int val = 10;
  67. void (^blk)(void) = ^(){
  68. // printf("val=%d\n",val);
  69. NSLog(@"%d",val);
  70. };
  71. val = 2;
  72. blk();
  73. //上面这段代码,输出值是:val = 10.而不是2.block截获自动变量的瞬时值。因为block保存了自动变量的值,所以在执行block语法后,即使改写block中使用的自动变量的值也不会影响block执行时自动变量的值。
  74. #pragma mark----block与数组排序
  75. //关于数组的排序已经总结过,这里做一个比较
  76. //使用系统自带compare比较系统自带对象
  77. NSArray *strsArray =[NSArray arrayWithObjects:@"abc",@"cdf",@"ade",@"feg", nil nil];
  78. NSArray *newArray = [strsArray sortedArrayUsingSelector:@selector(compare:)];
  79. NSLog(@"%@",newArray);
  80. //使用block方式比较系统自带对象
  81. //该种方式是按block的语法按步骤来进行比较的,下面背注掉的是使用简便的方式,两者原理一样
  82. NSComparisonResult(^strBlock1)(id obj1,id obj2)=^NSComparisonResult(id obj1,id obj2){
  83. NSString *result1 = (NSString *)obj1;
  84. NSString *result2 = (NSString *)obj2;
  85. return [result1 compare:result2];
  86. };
  87. NSArray *resut3 = [strsArray sortedArrayUsingComparator:strBlock1];//strBlock1
  88. NSLog(@"%@--",resut3);
  89. //       NSArray *sortArray = [strsArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {^NSComparisonResult(id obj1, id obj2)相当于上面的strBlock1
  90. //           NSString *result1 = (NSString *)obj1;
  91. //           NSString *result2 = (NSString *)obj2;
  92. //           return [result1 compare:result2];
  93. //        }];
  94. //        NSLog(@"%@",sortArray);
  95. //对于系统自带的对象和类都可以用compare方法,但是自定义的类需要自己重写compare方法
  96. //使用自定义compare方法对数组中得对象按照年龄进行排序,(数组中的对象为自定义类型的对象)
  97. Student *stu1 = [Student studentWithName:@"刘亦菲" Age:26 Score:89.0];
  98. Student *stu2 = [Student studentWithName:@"张飞" Age:34 Score:78.0];
  99. Student *stu3 = [Student studentWithName:@"周冬雨" Age:22 Score:85.0];
  100. NSMutableArray *stusarray = [NSMutableArray arrayWithObjects:stu1,stu2,stu3 , nil nil];
  101. [stusarray sortUsingSelector:@selector(studentCompare:)];
  102. for (NSString * str in stusarray) {
  103. NSLog(@"%@",str );
  104. }
  105. //使用block方式对数组中得对象按照年龄进行排序,(数组中的对象为自定义类型的对象)
  106. [stusarray sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
  107. Student *stu1 = (Student *)obj1;//强制转换成自定义类型
  108. Student *stu2 = (Student *)obj2;
  109. return  [stu1 studentCompare:stu2];
  110. }];
  111. for (NSString *stri in stusarray) {
  112. NSLog(@"%@",stri);
  113. }
  114. //使用自定义的block实现对数组中的对象进行排序,基本处理方式与上述的处理系统对象相似,只是如果不知道参数类型必须进行强制转换
  115. NSComparisonResult(^stuBlock)(id ob1,id ob2) =^ NSComparisonResult(id ob1,id ob2){
  116. Student *stud1 = (Student *)ob1;//强制转换
  117. Student *stud2 = (Student *)ob2;
  118. return [stud1 studentCompare:stud2];
  119. };
  120. [stusarray sortUsingComparator:stuBlock];//调用自定义块
  121. for (NSString *stri in stusarray) {
  122. NSLog(@"%@",stri);
  123. }
  124. }
  125. return 0;
  126. }

自定义的Student类的.h文件和.m文件如下:


.h文件
//
//  Student.h

//  Copyright (c) 2015年 tongxing. All rights reserved.
//

#import 

@interface Student : NSObject
@property NSString *name;
@property int age;
@property float score;
//这里提前使用了OC中得属性
//关于属性的知识,后面将会给出相关学习,有兴趣的同学可以去博客园了解:http://www.cnblogs.com/wendingding/p/3706430.html

//{
//    NSString *_name;
//    int _age;
//    float _score;
//}
//-(void)setName:(NSString *)name;
//-(void)setAge:(int)age;
//-(void)setScore:(float)score;
//-(float)score;
//-(NSString *)name;
//-(int)age;
-(id)initWithName:(NSString *)name Age:(int)age Score:(float)score;
+(id)studentWithName:(NSString *)name Age:(int)age Score:(float)score;
//自定义比较方法
-(NSComparisonResult)studentCompare:(Student *)student;

@end
[objc] view
plain
copy

  1. .m文件
  2. //
  3. //  Student.m
  4. //  lesson6
  5. //
  6. //  Created by lanou3g on 15-4-7.
  7. //  Copyright (c) 2015年 tongxing. All rights reserved.
  8. //
  9. #import "Student.h"
  10. @implementation Student
  11. //@synthesize _name ;
  12. //@synthesize _age;
  13. //@synthesize _score ;
  14. //自从xcode 4.4后,@property就独揽了@property和@synthesize的功能。
  15. //-(void)setName:(NSString *)name{
  16. //    _name = name;
  17. //}
  18. //-(void)setAge:(int)age{
  19. //    _age = age;
  20. //}
  21. //-(NSString *)name{
  22. //    return _name;
  23. //}
  24. //-(int)age{
  25. //   return  _age;
  26. //}
  27. //-(void)setScore:(float)score{
  28. //    _score = score;
  29. //}
  30. //-(float)score{
  31. //    return _score;
  32. //}
  33. -(id)initWithName:(NSString *)name Age:(int)age Score:(float)score{
  34. if (self = [super init]) {
  35. _name = name;
  36. _age = age;
  37. _score = score;
  38. }
  39. return self;
  40. }
  41. +(id)studentWithName:(NSString *)name Age:(int)age Score:(float)score{
  42. Student *student = [[Student alloc]initWithName:name Age:age Score:score];
  43. return student;
  44. }
  45. -(NSComparisonResult)studentCompare:(Student *)student{
  46. NSComparisonResult result1 = [[NSNumber numberWithInt:self.age] compare:[NSNumber numberWithInt:student.age]];
  47. return result1;
  48. }
  49. -(NSString *)description{
  50. return [NSString stringWithFormat:@"%@,%d",_name,_age];
  51. }
  52. @end
  53. 欢迎分享本文,转载请注明出处!

OC学习之道:关于Block的初级学习的更多相关文章

  1. Linux快速入门打开你的学习之道

    Linux快速入门打开你的学习之道 相信看到这篇文章的你一定是想要学习Linux,或者已经在学习Linux的人了,那我们就可以一起探讨一下,学习Linux如何快速入门呢? 首先,希望大家弄清楚自己为什 ...

  2. webpack 4.x 初级学习记录

    首先声明下,本人不擅长文字表达,文采不行,所以文章中文字较少,请看代码,初级学习,不足之处请多多指教 GitHub链接 看云kancloud [TOC] webpack 4.x 安装 首先需要在全局中 ...

  3. linux初级学习笔记十:linux grep及正则表达式!(视频序号:04_4)

    本节学习的命令:grep 本节学习的技能: grep对文本的匹配 正则表达式的使用 知识点十:grep及正则表达式(4_4) grep,egrep,fgrep: grep: 根据模式搜索文本,并将符合 ...

  4. 强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning)

    强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning) 学习笔记: Reinforcement Learning: An Introductio ...

  5. Linux学习路线全解,Linux操作系统学习路线

    大家都知道,在现在这个信息化飞速发展的时代,IT技术火速发展,信息的重要性,可想而知.现在,在北京当一个高级运维工程师,年薪百万已经不是梦想.当然我也想,谁不想挣大钱,开好车,住好房.下面说说自己的一 ...

  6. 【转载】 “强化学习之父”萨顿:预测学习马上要火,AI将帮我们理解人类意识

    原文地址: https://yq.aliyun.com/articles/400366 本文来自AI新媒体量子位(QbitAI)     ------------------------------- ...

  7. Hadoop源码学习笔记(3) ——初览DataNode及学习线程

    Hadoop源码学习笔记(3) ——初览DataNode及学习线程 进入了main函数,我们走出了第一步,接下来看看再怎么走: public class DataNode extends Config ...

  8. Python深度学习读书笔记-1.什么是深度学习

    人工智能 什么是人工智能.机器学习与深度学习(见图1-1)?这三者之间有什么关系?

  9. Elasticsearch7.X 入门学习第三课笔记----search api学习(URI Search)

    原文:Elasticsearch7.X 入门学习第三课笔记----search api学习(URI Search) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出 ...

随机推荐

  1. admin的配置

    当我们访问http://127.0.0.1:8080/admin/时,会出现: 执行命令: 生成同步数据库的脚本:python manage.py makemigrations             ...

  2. Android 学习笔记二 自定义按钮形状 颜色 点击渐变

    问题:自定义按钮的颜色 形状弧度  渐变效果 1.新建自定义属性button_login.xml (借鉴某大神) <?xml version="1.0" encoding=& ...

  3. sublime 安装package control

    import urllib.request,os,hashlib; h = '2915d1851351e5ee549c20394736b442' + '8bc59f460fa1548d15146761 ...

  4. 拾遗与填坑《深度探索C++对象模型》3.3节

    <深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...

  5. PHP学习(4)——数据类型

    PHP 支持 8 种原始数据类型. 四种标量类型:(标量类型即为基本类型) boolean(布尔型) integer(整型) float(浮点型,也称作 double) (由于历史原因,float也叫 ...

  6. Android重绘ListView高度

    Android重绘ListView高度 经常会有这样需求,需要ListView默认将所有的条目显示出来,这就需要外层使用ScrollView,ScrollView里面放置一个重绘高度的ListView ...

  7. RxJava(十)switchIfEmpty操作符实现Android检查本地缓存逻辑判断

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52585912 本文出自:[余志强的博客] switchIfEmpty ...

  8. 【mybatis深度历险系列】深入浅出mybatis中原始dao的开发和mapper代理开发

    使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法.mybatis在进行dao开发的时候,涉及到三姐妹,分别是SqlSessionFactoryBuilder ...

  9. 【SSH系列】-- hibernate基本原理&&入门demo

        什么是hibernate?      hibernate在英文中是冬眠的意思,当冬季来临,世界万物开始准备冬眠,但是程序猿这种动物好像不冬眠,因为需求变了,要改bug,冬眠,对于对象来说就是持 ...

  10. 协议系列之TCP协议

    3.TCP协议 从上一节我们了解了什么是IP协议,以及IP协议的一些特性,利用IP协议传输都是单向的,不可靠的,无连接状态的.正是这些特性,于是便产生了TCP协议.TCP协议属于传输层,在IP协议网络 ...