OC 06 Block、数组高级

主要内容:

?、Block语法

?、Block使?

三、Block实现数组排序

Block简介

Block:块语法,本质上是匿名函数(没有名称的函数)

标准C?面没有Block,C语?言的后期扩展版本,加?了匿名函数。

C++、JS、Swift等语?,有类似语法,叫做闭包。 Block语法和函数指针很相似。

回顾函数指针

函数指针(变量):存放函数地址(函数名)的指针变量。

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

函数指针类型:int (*)(int x,int y) 即:指向 两个整型参数,一个整型返回值函数的指针。

函数指针变量:p

函数指针的值:sum

Block

匿名函数:没有名称的函数。

例如 int (int x, int y)

因为Block是匿名函数,block变量存放的函数的实现,通过block变量能直接调?用函数

没有名称的函数应该如何调?用?(有名称的话,可以直接调?,也可以通过函数指针来调?用)

//1. ^ :脱字符
    //在OC 语言中, ‘^‘表示Block块

    //声明一个block 变量
    int (^sumBlock) (int, int) = ^(int a, int b){
        return a+b;
    };
    NSLog(@"%d",sumBlock(10,30));
1 int (^maxBlock)(int , int ) = ^(int a, int b){
3         return a > b ? a:b;
4     };
5     int a = maxBlock(10,20);
6     NSLog(@"%d",a);

Block返回值类型:int (^maxBlock)(int a, int b)  a,b可以不写

Block变量:a, b

Block变量存储的值:是实现部分

即: ^返回值类型 (参数列表)    函数体

Block 进行typedef

typedef in (^BlockType)(int x, int y)

原类型: int (^)(int x, int y)

新类型: BlockType

//给Block类型起一个别名
    typedef int (^MaxBlock) (int, int);
    MaxBlock sumBlock1 =^(int a, int b){
        return a + b;
    };
    NSLog(@"%d",sumBlock1(10,39));

Block与局布变量的关系

//Block 与局部变量的关系

   // int abc = 897;  //局部变量

   //__block修饰后 可以修改局部变量
   __block int count = 55;
    void (^sayHi) (int) = ^(int c){
        for (int i = 0; i < count; i++) {
            NSLog(@"嗨");
        }
//        abc = 90;  //可以使用局部变量,不可修改局部变量

    };
    sayHi(55);

Block与局布变量的关系

//全局变量
int count = 200;
int main(int argc, const char * argv[])
{
    //Block 与全局变量
    void (^addNum)(void) = ^(void){
        count++;
        NSLog(@"count = %d",count);
    };
    //调用
    addNum();
    //显示结果
    NSLog(@"count = %d",count);
//练习1 用Block实现将字符串转为整形的功能
    int (^strint) (NSString *) = ^(NSString *string){
        return [string intValue];
    };
    int num = strint(@"890");
    NSLog(@"%d",num);

Block数组排序

 //block数组排序
    NSArray *stringArray = [ NSArray arrayWithObjects:@"a18",@"19",@"90",@"88", nil];

    NSComparator sortBlock = ^(id string1, id string2){
        return [string1 compare:string2];
    };

//将Block作为参数传递给方法

    NSArray *sortArray = [stringArray sortedArrayUsingComparator:sortBlock];
    NSLog(@"sortArray:%@",sortArray);
  //使用Block给动态数组进行排序 //不可变数组用法二需要在前面接收一下
 2     NSMutableArray *ageArray = [ NSMutableArray arrayWithObjects:@"113", @"89", @"99", nil];
 3     //法一
 4     NSComparisonResult (^sortBlock) (id, id) = ^(id obj1, id obj2){
 5         if ([obj1 intValue] > [obj2 intValue]) {
 6            return  NSOrderedDescending ;
 7         }else if([obj1 intValue] < [obj2 intValue]){
 8            return  NSOrderedAscending;
 9         }else{
10             return NSOrderedSame;
11         }
12     };
13     //将Block作为参数传递给方法
14     [ageArray sortUsingComparator:sortBlock];
15     NSLog(@"%@", ageArray);
16     //法二 (使用这种方法)
17    [ageArray sortUsingComparator:^NSComparisonResult(id obj3, id obj4) {
18        if ([obj3 intValue] > [obj4 intValue]) {
19            return NSOrderedAscending;
20        }else{
21            return NSOrderedSame;
22        }
23    }];

1. 创建Person类

    实例变量: _name    _age


    方法:初始化方法


               便利构造器


               实例变量的赋值、取值方法


2. 创建3个Person对象,放入数组中


3. 在Person中添加compareByName:方法,使用此方法对数组进行排序,并输出


4. 使用Block根据Person的age进行排序,并输出

//根据age排序
    Person *person1 = [ Person personWith:@"da" age:19];
    Person *person2 = [Person personWith:@"ji" age:90];
    Person *person3 = [Person personWith:@"ko" age:2];
    NSMutableArray *array = [NSMutableArray arrayWithObjects:person1,person2,person3, nil];
    [array sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        if ([obj1 getAge] > [obj2 getAge]) {
            return NSOrderedDescending;
        }else {
            return NSOrderedSame;
        }
    }];
    NSLog(@"%@",array);

字面量

时间: 11-20

OC 06 Block、数组高级的相关文章

OC基础第五讲--Block、数组高级、字面量

Block 1.1block与函数指针 函数: int sum(int x, int y) { retrun x + y; } 函数指针: 把上面函数原型int sum(int x, int y)中的函数名替换成(*p),即可得到一个函数指针int (*p)(int x, int y). 这个函数表示指针p指向一个函数,这个函数有两个int型参数,返回值是int类型. Block:把函数指针int (*p)(int x, int y)中的'*'换成'^'就是我们block的声明,即int (^p

李洪强iOS开发之OC语言BLOCK和协议

OC语言BLOCK和协议 一.BOLCK (一)简介 BLOCK是什么? 苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. BOLCK和函数的相似性: (1)可以保存代码(2)有返回值(3)有形参(4)调用方式一样. 标识符 ^ (二)基本使用 (1)定义BLOCK变量 Int (^SumBlock)(int,int);//有参数,返回值类型为int Void (^MyBlock)()://无参数,返回值类型为空 (2)利用block封装代

(Object-C)学习笔记(五) --OC的Block

OC的Block 文大大的Block见解 http://www.cnblogs.com/wendingding/p/3709604.html Block跟方法差不多,随写随用,而且做完运算后能即时返回一个返回值,非常方便,大大提高了编程效率.但是不建议多用,因为Block会导致代码的易读性大大降低.

OC语言Block

OC语言Block 一.Block (一)简介  Block是什么?苹果推荐的比较特殊的数据类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. Block和函数的相似性:(1)可以保存代码(2)有返回值(3)有形参(4)调用方式一样. Block的应用:(1)动画(2)多线程(3)集合遍历(4)网络请求回调 标识符 ^ (二)基本使用 (1)定义Block变量 Int (^SumBlock)(int,int);//有参数,返回值类型为int Void 

iOS开发——语法OC篇&amp;Block回顾

Block回顾 这里知识简单介绍一下关于Block的语法,如果你觉得这里很简单或者想学习更深入的的使用清查看记者之前写的使用block传值和高级Block使用: http://www.cnblogs.com/iCocos/p/4534281.html http://www.cnblogs.com/iCocos/p/4550169.html http://www.cnblogs.com/iCocos/p/4659878.html http://www.cnblogs.com/iCocos/p/46

OC之Block的使用

一.Block定义 1.1定义 (1)Block是OC中的一种数据类型,在iOS开发中被广泛使用 (2)^是Block的特有标记 (3)Block的实现代码包含在{}之间 (4)大多情况下,以内联inline函数的方式被定义和使用 (5)Block与C语言的函数指针有些相似,但使用起来更加灵活 1.2示例代码 void(^demoBlock)() =^ { NSLog(@"demo"); }; int(^addBlock)(int, int) =^(int x, int y) { re

OC语言BLOCK和协议

一.BOLCK (一)简介 BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. BOLCK和函数的相似性:(1)可以保存代码(2)有返回值(3)有形参(4)调用方式一样. 标识符 ^ (二)基本使用 (1)定义BLOCK变量 int (^SumBlock)(int, int); // 有参数,返回值类型为int void (^MyBlock)():// 无参数,返回值类型为空 (2)利用block封装代码 (3)Block访

swift中闭包 OC中Block 解决循环引用

OC 中 全局宏定义 #define WS(weakSelf)  __weak __typeof(&*self)weakSelf = self; 用法如下: WS(weakself) [self.tableView addHeaderWithCallback:^{ [weakself requestMemberList]; }]; swift 在比闭包 中使用 weakSelf weak var weakSelf = self demo4 {     // 使用?的好处 就是一旦 self 被释

oc中的数组 NSArray

1 //oc允许使用c语言的数组,但是很多时候会用NSArray这个数组的类创建对象 2 //NSArray是不可变数组,它有个子类NSMutableArray可变数组 3 4 //1.创建数组 5 //这是一个数组的对象,数组的元素是“one two three” 6 NSArray *array=[[NSArray alloc] initWithObjects:@"one",@"two",@"three",nil]; 7 //数组的元素可以是