黑马程序员-----block
来源:互联网 发布:ios刷机会丢失数据吗 编辑:程序博客网 时间:2024/06/05 19:01
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
Block
代码块本质上是和其他变量类似。不同的是,代码块存储的数据是一个函数体。使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值。
脱字符(^)是块的语法标记。按照我们熟悉的参数语法规约所定义的返回值以及块的主体(也就是可以执行的代码)。下图是如何把块变量赋值给一个变量的语法讲解:
1、参数是NSString*的代码块
void (^printBlock)(NSString *x); printBlock = ^(NSString* str) { NSLog(@"print:%@", str); }; printBlock(@"hello world!");
运行结果是:print:hello world!
2、代码用在字符串数组排序
NSArray *stringArray = [NSArray arrayWithObjects:@"abc 1", @"abc 21", @"abc 12",@"abc 13",@"abc 05",nil]; NSComparator sortBlock = ^(id string1, id string2) { return [string1 compare:string2]; }; NSArray *sortArray = [stringArray sortedArrayUsingComparator:sortBlock]; NSLog(@"sortArray:%@", sortArray);
运行结果:sortArray:(
“abc 05”,
“abc 1”,
“abc 12”,
“abc 13”,
“abc 21”
)
3、代码块的递归调用
代码块想要递归调用,代码块变量必须是全局变量或者是静态变量,这样在程序启动的时候代码块变量就初始化了,可以递归调用
static void (^ const blocks)(int) = ^(int i) { if (i > 0) { NSLog(@"num:%d", i); blocks(i - 1); } }; blocks(3);
运行打印结果:
num:3
num:2
num:1
4、在代码块中使用局部变量和全局变量
在代码块中可以使用和改变全局变量
int global = 1000;int main(int argc, const char * argv[]){ @autoreleasepool { void(^block)(void) = ^(void) { global++; NSLog(@"global:%d", global); }; block(); NSLog(@"global:%d", global); } return 0;}
protocol
1.协议的定义
@protocol 协议名称
// 方法声明列表….
@end
2.如何遵守协议
1> 类遵守协议
@interface 类名 : 父类名 <协议名称1, 协议名称2>
@end
2> 协议遵守协议
@protocol 协议名称 <其他协议名称1, 其他协议名称2>
@end
3.协议中方法声明的关键字
1> @required (默认)
要求实现,如果没有实现,会发出警告
2> @optional
不要求实现,怎样不会有警告
4.定义一个变量的时候,限制这个变量保存的对象遵守某个协议
类名<协议名称> *变量名;
id<协议名称> 变量名;
NSObject *obj;
id obj2;
如果没有遵守对应的协议,编译器会警告
5.@property中声明的属性也可用做一个遵守协议的限制
@property (nonatomic, strong) 类名<协议名称> *属性名;
@property (nonatomic, strong) id<协议名称> 属性名;
@property (nonatomic, strong) Dog *dog;
@property (nonatomic, strong) id dog2;
6.协议可用定义在单独.h文件中,也可用定义在某个类中
1> 如果这个协议只用在某个类中,应该把协议定义在该类中
2> 如果这个协议用在很多类中,就应该定义在单独文件中
7.分类可用定义在单独.h和.m文件中,也可用定义在原来类中
1> 一般情况下,都是定义在单独文件
2> 定义在原来类中的分类,只要求能看懂语法
代理模式是在oc中经常遇到的一种设计模式,那什么叫做代理模式呢? 举个例子:有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情, 而保姆就是这个代理人, 即:婴儿和保姆之间有个协议,保姆继承该协议,于是保姆就需要实现该协议中的条款成为代理人。
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
- 黑马程序员---block
- 黑马程序员---Block
- 黑马程序员 block、protocol
- 黑马程序员---oc block
- 黑马程序员一block
- 黑马程序员-----block
- 黑马程序员-------Block
- 黑马程序员_OC_ARC,block,protocol
- 13.黑马程序员-block语法
- 黑马程序员---block的使用
- 黑马程序员——block
- 黑马程序员-block和protocol
- 黑马程序员--OC--block数据类型
- 黑马程序员 -- OC 语言 Block
- 黑马程序员---Objective-C Block
- 黑马程序员--autorelease和Block
- 黑马程序员 oc随机 block
- 黑马程序员-block使用细节
- Playmaker Input篇教程之引入的核心概念
- 2.1.2链栈的设计与实现(推荐)
- java读取.properties配置文件 (2
- 利用javaApI【eclipse】操作HBase时,出现异常的解决方案
- 你用过这种奇葩的C#注释吗?如何看待
- 黑马程序员-----block
- linux oracle CPU访问过高 问题
- EventBus 详细使用教程[在Activity、Service、Receiver中Post]
- IOS学习 模拟UIView的hitTest:方法和pointInside:方法的实现
- freopen - C/C++文件输入输出利器
- c语言设置qnx系统时间
- jquery ajax && php foreach array
- a标签传递当前对象
- ssh自动输入密码登录服务器/ssh免输入密码登录/非交互ssh 密码验证