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)(int x, int
y)

(int x, int y)还是表示参数,返回值还是int型。

1.2block定义与语法

  定义:有名称的函数可以直接通过函数名来调用,或者通过函数指针来调用,那没有名称的函数只能通过block来调用,block是匿名函数(没有名称的函数),block变量存放着函数的实现,通过block变量能直接调用函数。

语法:声明并实现一个block

int (^myBlock)(int,
int) = ^ (int a, int b){

return a + b;

};

上面这个block的功能是返回两个整数的和,需要注意的是,具体实现用"{}"括起来,并且外面有‘;‘。等号右边的参数列表不能省略参数名,左边的可以省略。

1.3block的使用

1.3.1 重定义

我们知道,函数指针可以重定义,同样的,我们也可以对block进行重定义

对int (int, int)进行重定义typedef int (^BlockType) (int,
int),那么现在BlockType类型就等同于int(int, int)

上面的block就可以简化为:

BlockType myBlock = ^
(int a, int b){

return a + b;

};

1.3.2block与局部变量

在block内部,全局变量可以访问与修改;

但是局部变量只能访问,不能修改,如果非要修改,可以在定义局部变量的时候在数据类型前加__block

__block
int count = 5;

int (^block4)(int) =
^ (int x){

count ++;

return
x * count;

};

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

Block 与 数组排序

2.1字符串排序

NSArray *array =
[NSArray arrayWithObjects:@"abc1", @"abc5", @"abc2", @"abc9", nil];

NSComparator sortBlock =
^(id obj1, id obj2){

return [obj1 compare:obj2];

};

array =
[array sortedArrayUsingComparator:sortBlock];

NSLog(@"排序后:%@", array);

2.2数值排序

因为普通的数据类型不能存在数组中,数组中只能存放对象,所以要对数组中的字符串进行数值排序,就必须先把字符串转成数值类型

NSArray *array2 = [NSArray
arrayWithObjects:@"12", @"23",
@"1", nil];

array2 = [array2
sortedArrayUsingComparator:^NSComparisonResult(id
obj1, id obj2) {

NSInteger obj1Int = [obj1 integerValue];  
    //  把字符串转成数值

NSInteger obj2Int = [obj2 integerValue];

if (obj1Int > obj2Int) {

return NSOrderedDescending;      //
 NSOrderedDescending,NSOrderedAscending,NSOrderedSame是

} else if (obj1Int
< obj2Int){          //  NSComparisonResult的三个枚举值(1,-1, 0)

return NSOrderedAscending;

} else {

return NSOrderedSame;

}

}];

NSLog(@"%@", array2);

字面量(简化代码)

以下分别是不使用字面量和使用字面量的对比

字符串的初始化

//NSString *str = [NSString
stringWithFormat:@"4545"];

NSString *str =
@"12332";

NSLog(@"%@",
str);

数组的初始化

//NSArray *arr = [NSArray
arrayWithObjects : @"12", @"123", @"1234", nil];

NSArray *arr =
@[@"12", @"123",
@"1234"];

字典的初始化

//NSDictionary *dictionary2 = [NSDictionary
dictionaryWithObjectsAndKeys:@"v1", @"k1", @"v2", @"k2", nil];

NSDictionary
*dic = @{@"key1": @"value1",
@"key2": @"value2", @"key3":
@"value3"};

访问数组中相应下标的值

//NSString *string1 = [arr
objectAtIndex:1];

NSString *string1 =
arr[1];

NSLog(@"%@",
string1);

访问字典中相应key对应的value

//NSString *string2 = [dic
valueForKey:@"key1"];

NSString *string2 =
dic[@"key1"];

NSLog(@"%@",
string2);

OC基础第五讲--Block、数组高级、字面量,布布扣,bubuko.com

时间: 2024-08-06 07:57:56

OC基础第五讲--Block、数组高级、字面量的相关文章

block 数值排序 字面量的使用

//  创建一个block //  1.返回值 //  2.使用'^'标记一个Block,并写出Block变量 //  3.确定Block参数列表,参数名可以省略 //  4.'^' //  5.参数列表 //  6.主题部分,'{}:' //  7.在'{}'内部写具体实现 int (^myBlock)(int, int) = ^(int a, int b){ return a + b; }; int (^myBlock1)(int, int) = ^(int c, int d){ retur

数组的字面量

㈠字面量创建数组 ⑴创建一个数组     var arr = new Array(); ⑵使用字面量创建的数组     语法:[ ]     var arr = [ ]; ⑶使用字面量创建数组时,可以在创建时就指定数组中的元素 ㈡构造函数创建数组 ⑴使用构造函数创建数组时,也可以同时添加元素,将要添加的元素作为构造函数的参数传递 ⑵元素之间使用 ,隔开 ㈢区别 ⑴创建一个数组,数组中只有一个元素10 arr = [10]; ⑵创建一个长度为10的数组 arr2 = new Array[10];

04_Swift2基础之类型安全和类型推测+字面量+类型别名

1. 类型安全和类型推测 1> 类型安全 Swift 是一个 _类型安全(type safe)_ 的语言.类型安全的语言可以让你清楚地知道代码要处理的值的类型.如果你的代码需要一个`String`,你绝对不可能不小心传进去一个`Int`. 由于 Swift 是类型安全的,所以它会在编译你的代码时进行 _类型检查(type checks)_ ,并把不匹配的类型标记为错误.这可以让你在开发的时候尽早发现并修复错误. 当你要处理不同类型的值时,类型检查可以帮你避免错误.然而,这并不是说你每次声明常量和

OC基础--ARC Category Block

autorelease 什么是自动释放池? autorelease是一种支持引用计数的内存管理方式,只要给对象发送一条autorelease消息,会将对象放到一个自动释放池中,当自动释放池被销毁时,会对池子里面的所有对象做一次release操作 自动释放池的优点是什么? 1.不用再担心对象释放的时间 2.不用再关心什么时候添加release 自动释放池的原理? autorelease实际上只是把对release的调用延迟了,对于每一个autorelease,系统只是把该对象放入了当前的autor

IOS开发——OC基础-ARC、BLOCK、协议

一.ARC ARC 是一种编译器特性!而不是IOS运行时特性,和JAVA中得垃圾回收机制完全不一样ARC是自iOS 5之后增加的新特性,完全消除了手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain.release.autorelease语句.你不再需要担心内存管理,因为编译器为你处理了一切ARC规则:只要还有一个强指针变量指向对象,对象就会保持在内存中弱指针指向的对象被回收后,弱指针会自动变为nil指针,不会引发野指针错误使用注意:1.不允许调用release.retain.re

黑马程序员---OC基础8【block类型】【Protocol】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [block类型] 1.block概念 block对象是一个C级别的语法和运行机制,不同之处,它除了有可执行代码以外,它还包含了与堆栈内存绑定的变量 方法的回调 block是一个类型,定义变量,用来存储代码块 2.block基本用法 block与函数很相似,有返回值类型,参数类型,主体: 返回值类型 (^block变量名)(形参列表) = ^(形参列表) { }; 没有参数可以写void,比如:i

C语言复合字面量的使用

C99添加的特性,复合字面量(composite literal).一旦熟悉并使用,便会体会到简洁强大的表达. 所谓字面量就是固定数值的表示.数值和字符串类型都有字面量的表达.如: // 100, 1.23f, "literral" 都是字面量 int x = 100; float y = 1.23f; char* s = "literral"; 可看到字面构建的同一时候就能够复制给变量使用.既然是固定数值,那么在初始化的时候就能够构建. 那么复合字面量是几个意思的

对象字面量表示法

今天看书看到了一个没见过的词儿:对象字面量表示法,看过内容之后,发现这货就是Json,但又不仅仅是Json,于是好好的问了一番度娘,原来Json只是一个数组和对象字面量表示法的组合. 先说下数组的字面量表示法 数组其实也是对象,构造函数的方式创建数组方式如下: var myArr = new Array("妹妹","表妹","萝莉"); 字面量表示法(不知道这词儿之前,我一直这样写,推荐此写法): var myArr = ["妹妹&qu

Objective-C 之 Literals(字面量)

今天整理一下关于Objective-C Literals的内容,Literals翻译成字面量或者字面值,就是直接被写到源代码中的值.这不是一个陌生的概念,我们在写程序的时候能频繁的见到.我们很早就见过NSString 字面量了: NSString *greeting = @"Hello World"; 它的语法很简单,上面的代码就是通过在C字符串的前面加上@符号创建了一个NSString对象greeting,整段代码看起来简洁易懂,如果没有直接量语法,那么创建这个greeting可能就