iOS知识梳理9:block块

(ps.本文提到有typedef和typeof)

block是带有自动变量的匿名函数.

  • 匿名函数
    匿名函数顾名思义就是不带名字的函数,在C语言中不允许这样的方法存在,而在OC中的Block则可以用指针来直接调用一个函数。
  • 自动变量
    block可以截获变量的瞬时值....截获的变量可以进行操作而不能进行赋值.
    block中不能再改变变量的值.....如果需要改变变量的值需要在变量声明时加上__Block修饰符.
    block不支持C语言数组.
block语法

一个完整的block

 ^ NSString *(NSString *a,NSString *b){
        return a;
    };

"^" block标识......."NSString *"返回值...."(NSString *a,NSString *b)"参数列表..
其实我们可以直接省略返回值....没有参数的时候也可以省略返回值.

^ {
        NSLog(@"hello world");
   };
block变量

其实就是一个指向block的指针.

int (^blockName)(int arg1,int arg2);

我们可以通过等号赋值直接给block变量赋值,

int (^blockName)(int arg1,int arg2) = ^(int arg1, int  arg2){
      return arg1 + arg2;
};
block当作函数参数

我们可以先声明一个block变量.并加上typedef标识符
(typedef表示为已知的类型起别名,在这里表示为block取一个叫MyBlock的别名,这样我们再定义这个block类型是就可以直接用Myblock,而不必加上其他额外的东西)

typedef void (^MyBlock)(NSString *s1,UIColor *c);

我们来声明一个函数:

-(void)func:(MyBlock)block{
           block(@"str",[UIColor redColor]);
}

我们可以使用这个函数:

[self func:^(NSString *s1, UIColor *c){
        NSLog(@"%@",s1);
        self.view.backgroundColor = c;
}];
循环引用问题

block在ios开发中被视为一个对象....由于block的捕获变量的机制...使得block的对象也有可能被block持有,从而形成循环应用,导致两者都不能被释放...
如下,

@implementation LXDObject
{
    void (^_cycleReferenceBlock)(void);
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    _cycleReferenceBlock = ^{
        NSLog(@"%@", self);   //引发循环引用
    };
}
@end

我们可以通过__weak关键字来修饰变量,解决循环引用问题

__weak typeof(*&self) weakSelf = self;
_cycleReferenceBlock = ^{
    NSLog(@"%@", weakSelf);   //弱指针引用,不会造成循环引用
};

(typeof可以根据括号内的变量,自动识别变量类型并返回该类型)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • iOS代码块Block 概述 代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,B...
    smile刺客阅读 6,957评论 2 26
  • Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等。用过GCD就知道Block的精妙之处。...
    Coder_JMicheal阅读 4,053评论 2 1
  • 前言 Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这...
    小人不才阅读 9,152评论 0 23
  • 《Objective-C高级编程》是一本有趣又难懂的书,全书就讲了引用计数、Block、GCD三个概念,有趣是因为...
    kamous阅读 55,468评论 22 206
  • 我从深埋中的青春中醒来 我越过疲惫的年岁 只为你沉静而炽热的脸 那月光蔓延着的梦醒的迷醉 你的辽阔 胜过繁茂的人间...
    摆渡人memory阅读 3,318评论 2 0

友情链接更多精彩内容