iOS开发--Block使用有坑

首先来了解下什么是Block

  • (1)Block是OC中的一种数据类型,在iOS开发中被广泛使用

    (2)^是Block的特有标记

    (3)Block的实现代码包含在{}之间

    (4)大多情况下,以内联inline函数的方式被定义和使用

    (5)Block与C语言的函数指针有些相似,但使用起来更加灵活

  • 示例:

  void(^demoBlock)() =^ {
   NSLog(@"Block");
// 无参数,无返回值
};
int(^sumBlock)(int, int) =^(int x, int y) {
   return x +y;
// 有参数有返回值
};
  • 格式说明:(返回类型)(^块名称)(参数类型) = ^(参数列表) {代码实现};

    如果没有参数,等号后面参数列表的()可以省略

  • 注意事项:
    1、Block可以使用在定义之前声明的变量

int i = 10;
void (^myBlock) () = ^{
NSLog(@"%d",i);
} 
i = 100;
myBlock();
  • 注意:
    1、在定义Block时,会在Block中建立当前局部变量内容的副本【也就是拷贝】。
    2、后续再对该变量的数值修改,不会影响Block中的值,所以上述代码执行结果是10.
    3、如果想要在Block中保持局部数值的变化,需要用到__block关键字
__block int i = 10;
void (^myBlock) () = ^{
NSLog(@"%d",i);
} 
i = 100;
myBlock();

Block的使用要点

1、Block可以被当做参数直接传递​,在被当做参数传递时,Block同样可以使用在定义之前声明的局部变量

  • ​注意:默认情况下,Block外部的变量,在Block中是只读的!
    2、​如果要修改Block之外的局部变量,需要使用__block关键字,一般用不到__block关键字,在块代码中可以修改成员变量的数值(比较少用)
    3、当把一个对象传递进Block的时Block会自动对对象的指针做强引用
    4、用typedef定义一个Block的类型,便于在后续直接使用
typedef double(^MyBlock)(double, double);
// 下边直接用定义的名字写起来简短许多
MyBlock area = ^(double x, double y) {
    return x * y;
};
MyBlock sum = ^(double a, double b) {
    return a + b;
};​

(1)typedef是关键字用于定义类型,MyBlock是定义的Block类型
(2)area、sum分别是MyBlock类型的两个Block变量尽管,typedef可以简化Block的定义,但在实际开发中并不会频繁使用typedef关键字
这是因为Block具有非常强的灵活性,尤其在以参数传递时,使用Block的目的就是为了立即使用

  • 关于Block的循环引用问题
@property (nonatomic,strong)NSMutableArray * myBlocks;
#pragma mark 
int (^sum)(int ,int) = ^(int x,int y){
return [self sum:x y:y];
};
[self.myBlocks addObject:sum];
代码导图.jpg
  • 解决循环引用的办法


    代码导图.jpg
  • 下一篇文章将介绍如何把按钮的点击事件用Block传递出去
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,423评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,339评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,241评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,503评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,824评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,262评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,615评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,337评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,989评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,300评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,829评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,193评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,753评论 3 230
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,970评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,708评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,295评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,207评论 2 258

推荐阅读更多精彩内容

  • iOS代码块Block 概述 代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,B...
    smile刺客阅读 2,244评论 2 26
  • Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等。用过GCD就知道Block的精妙之处。...
    Coder_JMicheal阅读 696评论 2 1
  • 前言 Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这...
    小人不才阅读 3,727评论 0 23
  • 转自李峰峰博客 一、概述 闭包 = 一个函数「或指向函数的指针」+ 该函数执行的外部的上下文变量「也就是自由变量」...
    Joshua520阅读 912评论 0 0
  • 应用正常运行的过程中,切后台进入设置页关闭应用部分权限(注:关闭包含先打开再关闭,也就是说有关闭操作),再从多窗口...
    秒速V厘米阅读 1,114评论 0 1