您的位置:首页 > 移动开发 > IOS开发

IOS学习之block代码块

2017-02-09 23:55 267 查看

前言:

   block这个名词对于做一般开发者来说可能会觉得稀奇古怪而非常陌生,但是对于iOS工程师来说,在整个开发中到处都是它的影子,今天一大早觉得在假期学习一下它,对明年的iOS开发工作做个准备,突然有点找回当年即将毕业时的最后一个春节假期的感觉,今天基于最近使用的角度来学习总结一下block。

什么是Block?

   block
是对象,它封装了一段代码,这段代码可以在任何时候执行。block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:block是
inline
的,并且它对局部变量是只读的,^是block语法的标识。


声明block

 第一种方式:用typedef定义一个block类型

typedef void (^Sucess)(NSString*);//用typedef定义一个block类型

@property (nonatomic,copy) Sucess myBlock;


第二种方式:也可以通过标准的block函数体

@property (nonatomic,copy) void(^myBlock)(NSString*);


完整的block: NSString* (^callBack) (NSString *)

第一个参数:block返回值

第二个参数:block名字

第三个参数:block回调参数

NSString* (^callBack) (NSString *) =^(NSString *string){
NSMutableString *  tempString=[[NSMutableString alloc]initWithString:@"I wanna to know "];
return [tempString stringByAppendingString:string];
} ;
NSString *result=callBack(@"who is lcj ?");

NSLog(@"result ----> %@",result);


block访问变量

int num=0;

int (^plus) (int ,int )=^(int a,int b)
{
num=a+b;

return num;
};

int finalNum=plus(5,6);
NSLog(@"finalNum--->%d",finalNum);


比如上面这种方式是编译不通过的,block可以访问局部变量,但是不能修改。如果要修改就要加关键字:__block,修改后如下

__block int num=0;

int (^plus) (int ,int )=^(int a,int b)
{
num=a+b;

return num;
};

int finalNum=plus(5,6);
NSLog(@"finalNum--->%d",finalNum);


 block循环引用

   循环引用就是当self 拥有一个block的时候,在block 又调用self的方法。形成你中有我,我中有你,谁都无法将谁释放的困局。举例说明:

在block中处理viewController的全局变量str

void(^dealString)(void)=^{

self.str=@"who is lcj ?";
};

dealString();


如何解决?使用weakSelf,换言之类似Android中的弱引用

__weak typeof (self) weakSelf = self;


上面的修改成下面这种方式就可以解决循环引用问题

__weak typeof (self) weakSelf = self;
void(^dealString)(void)=^{

weakSelf.str=@"who is lcj ?";
};

dealString();


总结:

   今天大致总结了最近在开发中使用block的几个心得体会,后续更多block的高级使用再做总结。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: