摘要:在苹果开发中广泛应用,如请求回调,并发执行等。定义类型定义一个属性设置触发设置事件引用了引用了内存泄露了调用参考
block在苹果app开发中广泛应用,如http请求回调,GCD并发执行等。
基本用法 定义//定义一个本地变量的 block returnType (^blockName)(parameterTypes) = ^returnType(parameters) {...}; //简化定义 typedef returnType (^TypeName)(parameterTypes); TypeName blockName = ^returnType(parameters) {...}; //例子 //定义 void (^MyBlock)(id,NSUInteger ,BOOL*)=^(id obj,NSUInteger idx ,BOOL *stop){ NSLog(@" %@ ",obj); }; //使用 BOOL stop; MyBlock(@"ttt",1,&stop); //作为方法参数 NSArray *citys=@[@"suzhou",@"hangzhou"]; [citys enumerateObjectsUsingBlock:MyBlock]; //内联用法 [citys enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { NSLog(@" %@ ",obj); }];访问上下文的能力
可以自由访问定义块方法栈内变量和堆变量,还有全局变量
__block 可直接引用变量可以修改
// 本地变量 NSString *lived=@"suzhou" __block int count=0; void (^MyBlock)(id,NSUInteger ,BOOL*)=^(id obj,NSUInteger idx ,BOOL *stop){ NSString *city=(NSString *)obj; if([city isEqualsToString:lived){ NSLog(@" i live in %@ ",obj); }else{ NSLog(@" %@ ",obj); } count++; }; //此时count=2 NSArray *citys=@[@"suzhou",@"hangzhou"]; [citys enumerateObjectsUsingBlock:MyBlock];高级用法
block本质上是一个oc对象,所以可以存放在对象属性里面,在对象其他方法中来访问。
// 定义block类型 typedef int (^MathBlock)(int, int); // 定义一个 mathblock 属性 @property (strong) MathBlock mathBlock; // 设置block - (void)doMathWithBlock:(MathBlock) mathBlock { self.mathBlock = mathBlock; } // 触发 设置block 事件 - (IBAction)buttonTapped:(id)sender { [self doMathWithBlock:^(int a, int b) { return a + b; //block 引用了 self self引用了block 内存泄露了 //__weak typeof(self) weakSelf = self; //self.done(); weakSelf.done(); }]; } -(void) done{ NSLog(@"do math done"); } // 调用block - (IBAction)button2Tapped:(id)sender { self.label.text = [NSString stringWithFormat:@"%d", self.mathBlock(3, 5)]; }参考:
http://www.raywenderlich.com/9438/how-to-use-blocks-in-ios-5-tutorial-...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/15709.html
摘要:函数有一个缺点,代码是死的,编译之前写好的代码块利用代码块事先将代码存起来和函数一样,有返回值有参数函数只能在方法外定义,而则可以在外边和里边都可以定义。行为主体可以用回传值,类型会被自动辨别。 Block 一般是用来表示、简化一小段的程式码,它特别适合用来建立一些同步执行的程式片段、封装一些小型的工作或是用来做为某一个工作完成时的回传呼叫(callback) 。 在新的iOS API...
摘要:从上面的这个分析,也不难理解为什么下,对块元素设置属性无法实现的效果。这时块元素仅仅是被触发了,而它本就是行布局,所以触发后,块元素依然还是行布局,而不会如中块元素呈递为内联对象。display:block就是将元素显示为块级元素 block元素的特点是: 总是在新行上开始; 高度,行高以及顶和底边距都可控制; 宽度缺省是它的容器的100%,除非设定一个宽度 , , , , 和...
摘要:可以看到内部捕获到的是,所以不会产生强引用,自然也就不会出现循环引用问题。我们通过置为解决它循环引用的方式,就是打断一条强引用。 循环引用是一个比较常见的问题,之前面试的时候也会被问到,如何解决循环引用问题,其实大家都知道使用__block,__weak这些修饰符可以解决循环引用问题,那今天我们要讨论的就是他们是怎么样解决了循环引用问题的。 __weak 其实__weak是比较好理解的...
摘要:它提供了一个简单现代的,同时也是线程安全的。它有如下优点使用自定义或者回调进行通知观测者移除时无异常控制器时隐式的观测者移除提升使用的性能线程安全并提供在观测者恢复时额外的保护更多关于的信息,可浏览的文档用法项目中有把用于和的示例程序。 KVOController 是一个简单安全的 KVO(Key-value Observing,键-值 观察)工具,用于 iOS 和 OS X 应用开发...
阅读 790·2021-11-24 10:27
阅读 3146·2021-11-18 10:02
阅读 2247·2021-11-16 11:45
阅读 2961·2021-11-15 18:10
阅读 602·2021-09-22 15:23
阅读 1376·2019-08-30 15:53
阅读 2846·2019-08-30 13:20
阅读 1528·2019-08-30 12:53