ObjectC----Block用法以及用Block实现数组排序

// Created By 郭仔  2015年04月02日17:45:01

函数体外部分:

typedef int (^Block)(int ,int );//重命名

typedef void (^Block1)(int );

int n = 0;

=================================================================================================================

// 定义函数指针

int (*p)(int ,int) = sum;

//通过函数指针调用函数

int re = p(10,3);

printf("%d\n",re);

//    int n = 4;

Block block = ^(int x,int y){

//        NSLog(@"%d",n);

return x+y;

};

NSLog(@"%d",block(1,1));

//定义block

int (^block1)(int,int) = ^(int x,int y){

return x+y;

}; //最后分号别忘了

//调用block

int result = block1(10,34);

printf("%d\n",result);

//两个练手例子

void (^block2)(int) = ^(int num){

printf("%d\n",num);

};

int (^block3)(int) = ^(int year){

return year;

};

block2(4);

printf("%d\n",block3(5));

int (^block4)(NSString *) = ^(NSString * str){

return [str intValue]; //对象方法intValue实现字符串转化为数值

};

NSLog(@"%d",block4(@"333"));

//printf("%d\n",block4(@"333"));

/*

block是匿名函数:因为调用函数有两种方式,一种是通过函数名调用,另一种是通过函数指针调用;

通过函数指针调用函数之前,需要给函数指针赋值,也需要用到函数名,所以对于匿名函数来说,这两种方式都不能实现函数的调用,因此使用block;

block和函数指针非常相似,但是有本质上的区别,但在使用方面,区别不大,我们可以将block当成函数指针,这样简化blcok的使用;

*/

__block int x = 10;

// int y;

Block1 block5 = ^(int num){

x++;

// y++;//局部变量

n ++; //全局变量

NSLog(@"%d",x);

NSLog(@"%d",num);

};

block5(5);

/*

1.在block里面能访问block之外的局部变量,不能修改block之外的局部变量,如果需要修改,该局部变量前面加__block;

2.在block中可以修改全局变量的值;

3.__block声明的变量会存储在内存的全局区(静态区)

*/

// =================================================================

Car * car1 = [Car carWithType:@"aa" andColor:@"bb" andPrice:134 andMaxSpeed:133 andCostOil:17];

Car * car2 = [Car carWithType:@"cc" andColor:@"dd" andPrice:234 andMaxSpeed:233 andCostOil:27];

Car * car3 = [Car carWithType:@"ee" andColor:@"ff" andPrice:334 andMaxSpeed:333 andCostOil:37];

Car * car4 = [Car carWithType:@"gg" andColor:@"hh" andPrice:434 andMaxSpeed:433 andCostOil:47];

NSMutableArray * cars = [NSMutableArray arrayWithObjects:car1,car2,car3,car4, nil];

//价格从高到低排序  block排序

//若用sortedArrayUsingComparator则需要重新定义一个数组保存(因为有返回值)

[cars sortUsingComparator:^NSComparisonResult(Car *obj1, Car *obj2) {

if ([obj1 price]<[obj2 price]) {

return NSOrderedDescending;

}

else if ([obj1 price] == [obj2 price])

return NSOrderedSame;

else

return NSOrderedAscending;

}];

for (Car *car in cars) {

NSLog(@"%@",car);

}

// maxSpeed从大到小排序,使用sortedUsingComparator

NSArray * arr = [cars sortedArrayUsingComparator:^NSComparisonResult(Car *obj1, Car *obj2) {

if ([obj1 maxSpeed]<[obj2 maxSpeed]) {

return NSOrderedDescending;

}

else if ([obj1 maxSpeed]==[obj2 maxSpeed])

return NSOrderedSame;

else

return NSOrderedAscending;

}];

for (Car * car in arr) {

NSLog(@"%@",car);

}

//自己定义block

NSComparisonResult (^block6)(Car *,Car*) = ^(Car *obj1,Car *obj2){

if ([obj1 maxSpeed]<[obj2 maxSpeed]) {

return NSOrderedDescending;

}

else if ([obj1 maxSpeed]==[obj2 maxSpeed])

return NSOrderedSame;

else

return NSOrderedAscending;

};

//然后调用sort方法,block6传参过去

[cars sortUsingComparator:block6];

for (Car * car in cars) {

NSLog(@"%@",car);

}

// ==============================================================

//字面量

//数组字面量

NSString * str = @"Literals";

//数组字面量

NSArray * arr1 = @[@"1",@"2",@"3"];

for (NSString * s in arr1) {

NSLog(@"%@",s);

}

//字典字面量

NSDictionary * dic = @{@"name":@"zhangsan",@"age":@"6"};

NSLog(@"%@,%@",dic[@"name"],dic[@"age"]);

NSNumber * num = @123;//把数字123转化成NSNumber对象

NSLog(@"%@",num);

// ===============================================================

时间: 2024-10-18 01:48:02

ObjectC----Block用法以及用Block实现数组排序的相关文章

display:Block 用法分析

根据CSS规范的规定,每一个网页元素都有一个display属性,用于确定该元素的类型,每一个元素都有默认的display属性值,比如div元素,它的默认display属性值为"block",成为"块级"元素(block-level):而span元素的默认display属性值为"inline",称为"行内"元素. 块级元素: 动占据一定矩形空间,可以通过设置高度.宽度.内外边距等属性,来调整的这个矩形的样子: 行内元素: 自己的

Block学习一:基本用法,用block封装NSURLRequest异步请求

首先看下面这段代码: void (^myFirstBlock)(int theOne,int theTwo) = ^(int theOne,int theTwo){ NSLog(@"====%d",theOne+theTwo); }; myFirstBlock(100,300); void:指的时返回数据类型,myFirstBlock:指的是block的名称,后面两个是参数.等号右边的block的实现. 个人理解:block本身就是一个类,他的实例化就是一个对象,下面看看这个数据请求的

iOS中block用法之两个界面传值问题

Block的使用有很多方面,其中传值只是它的一小部分,但是很常用更实用,下面介绍Block在两个界面之间的传值用法: 先说一下思想: 首先,创建两个视图控制器,在第一个视图控制器中创建一个Label和一个Button,其中Label是为了显示第二个视图控制器传过来的字符串, Button是为了push到第二个界面. 第二个界面的只创建一个TextField,是为了输入文字,当输入文字并且返回第一个界面的时候(第二个视图将要消失的时候),就将这个 TextFiled中的文字传给第一个界面并且显示在

iOS block 用法

1.定义Block /* 回传void ,参数也是void 的block*/ void (^blockReturningVoidWithVoidArgument)( void ); /* 回传整数,两个参数分别是整数和字元型态的block*/ int   (^blockReturningIntWithIntAndCharArguments)( int , char ); /* 回传void ,含有10 个block 的阵列,每个block 都有一个型态为整数的参数*/ void (^arrayO

OC中Block语法、Block使用以及通过Block实现数组排序

Block:语法块,本质上是匿名函数(没有名称的函数) 标准C里面没有Block,C语言的后期扩展版本,加入了匿名函数 在C++.JS.Swift等语言有类似语法,叫做闭包 Block语法和C语言里的函数指针很相似,下面我们先来回顾下C语言中的函数和函数指针 C语言中函数是指:实现某一功能的代码段 完整的函数包括两部分:函数声明.函数定义 函数声明,即函数原型.例如:int sum (int x,int y);具有两个整形参数,一个整形返回值的函数 函数定义,即函数实现.例如:int sum(i

block传值以及利用block封装一个网络请求类

1.block在俩个UIViewController间传值 最近刚学了几招block 的高级用法,其实就是利用block语法在俩个UIViewController之间传值,在这里分享给初学者,同时也方便我自己理解.我们知道UINavigationController类管理UIViewController的时候,利用的是"栈"的思想,在这里不做过多解释,切入正题,假设我们现在有俩个UIViewController,viewC1和viewC2,viewC1比viewC2先进入到UINavi

Block系列2:Block内存管理

ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController { UIImage *_image; NSInteger _index; } @end ViewController.m #import "ViewController.h" #import "Person.h" @interface ViewController () @end @i

iOS开发Block的介绍以及Block的循环引用问题

1:block的循环引用问题最主要记住两点: 如果[block内部]使用[外部声明的强引用]访问[对象A], 那么[block内部]会自动产生一个[强引用]指向[对象A] 如果[block内部]使用[外部声明的弱引用]访问[对象A], 那么[block内部]会自动产生一个[弱引用]指向[对象A] 2: #import "ViewController.h" #import "XMGPerson.h" @interface ViewController () @prop

block的学习(block和timer的循环引用问题)

一.什么是回调函数? 回调函数,本质上也是个函数(搁置函数和方法的争议,就当这二者是一回事).由"声明"."实现"."调用"三部分组成. 在上面的例子中,我可以看出,函数amount(其实是Block),的声明和调用在A类中,而实现部分在B类中.也就是说,B类实现了amount函数,但并没有权限调用,最终还是 由A类触发调用.我们称这样的机制为"回调".意思是"虽然函数的实现写在B类中,但是真正的调用还是得由A类来完