黑马程序员-----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培训、期待与您交流! ——-

0 0
原创粉丝点击