您的位置:首页 > 其它

block块和Protocol(协议)

2016-07-25 15:14 183 查看
代码块本质上是和其他变量类似。不同的是,代码块存储的数据是一个函数体。使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值。

脱字符(^)是块的语法标记。按照我们熟悉的参数语法规约所定义的返回值以及块的主体(也就是可以执行的代码)。下图是如何把块变量赋值给一个变量的语法讲解:



按照调用函数的方式调用块对象变量就可以了:

int result = myBlock(4); // result是 28

1、参数是NSString*的代码块

[cpp] view
plain copy

void (^printBlock)(NSString *x);

printBlock = ^(NSString* str)

{

NSLog(@"print:%@", str);

};

printBlock(@"hello world!");

运行结果是:print:hello world!

2、代码用在字符串数组排序

[cpp] view
plain copy

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.最为关键是对象之间的传值操作

typedef void(^MyBlock)(NSString *str,int
num); /// 1. 声明

@property (nonatomic,strong)MyBlock
selectButtonAtIndex; //
定义变量

typeof(self)__weak weak =
self; //在需要的地方传值

weak.selectButtonAtIndex(sender.titleLabel.text,sender.tag
);

xiao.selectButtonAtIndex = ^(NSString * num,int count) {
/// 在接受值得地方 接受

NSLog(@"-----MMMMM----%@-----%d", num,count );

};

二、Protocol(协议)

(一)简介

5.OC不能继承多个类(单继承)但是能够遵守多个协议。继承(:),遵守协议(< >)

6.基协议:<NSObject>是基协议,是最根本最基本的协议,其中声明了很多最基本的方法。

7.协议可以遵守协议,一个协议遵守了另一个协议,就可以拥有另一份协议中的方法声明。
用法
(1)XX.h

#import <UIKit/UIKit.h>

/// 声明协议

@protocol MainViewControllerDelegate <NSObject>

-(void)dissMiss;

@end

@interface MainViewController :
UIViewController

/// 定义协议属性

@property (nonatomic,
assign)id <MainViewControllerDelegate>delegate;

@end

XX.m

-(void)buttonAction

{

/// 在想调用的地方调用

if ([_delegate
respondsToSelector:@selector(dissMiss)]) {

[_delegate
dissMiss];

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: