[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. 牛客网编程练习之PAT乙级(Basic Level):1034 写出这个数

    AC代码: import java.util.*; /** * @author CC11001100 */ public class Main { public static void main(St ...

  2. PHP 实例 AJAX RSS 阅读器

    RSS 是一种描述和同步网站内容的格式,是目前使用最广泛的XML应用. RSS 搭建了信息迅速传播的一个技术平台,使得每个人都成为潜在的信息提供者. RSS 阅读器用于阅读 RSS Feed. AJA ...

  3. python3.6 使用 pymysql 连接 Mysql 数据库及 简单的增删改查操作

    1.通过 pip 安装 pymysql 进入 cmd  输入  pip install pymysql   回车等待安装完成: 安装完成后出现如图相关信息,表示安装成功. 2.测试连接 import ...

  4. 安卓高级6 SnackBar

    引言 文/李牧羊(简书作者) 原文链接:http://www.jianshu.com/p/2654e6bda3b1 著作权归作者所有,转载请联系作者获得授权,并标注"简书作者". ...

  5. 28 自定义View流式布局

    流式布局每行的行高以本行中最高的元素作为高,如果一个元素放不下到一行时直接到第二行 FlowLayoutView package com.qf.sxy.customview05.widget; imp ...

  6. [ExtJS5学习笔记]第三十六节 报表组件mzPivotGrid

    mzPivotGrid 是一个报表组件,采用这个组件之后,可以令你的应用体现更多的价值. 什么是pivot grid 什么是mzPivotGrid 学习资源 与图表组件的融合 什么是pivot gri ...

  7. Android必知必会-发布开源 Android 项目注意事项

    如果移动端访问不佳,请使用 –> Github版 1. 合理配置 .gitignore 文件 配置 .gitignore 可以排除一些非必要文件和保护保密信息,下面是在项目根目录下 .gitig ...

  8. Google Dremel数据模型详解(上)

    首先简单介绍一下Dremel是什么,能解决什么问题.第二部分着重讲Dremel的数据模型,即数据结构.第三部分将谈一下在此数据结构上设计的算法. 1 起源 Dremel的数据模型起源于分布式系统的应用 ...

  9. ORACLE数据库学习之备份与恢复

     oracle数据库的备份与恢复 第一部分:数据库的备份 备份的必要性 因为各种人为或外界的因素可能会造成数据库中灾难性的数据丢失,为了保证数据库中数据的安全,必须采取备份措施保证RDBMS中包含 ...

  10. Android高级控件(六)——自定义ListView高仿一个QQ可拖拽列表的实现

    Android高级控件(六)--自定义ListView高仿一个QQ可拖拽列表的实现 我们做一些好友列表或者商品列表的时候,居多的需求可能就是需要列表拖拽了,而我们选择了ListView,也是因为使用L ...