如何在ios中block传值使用Block

IOS基础_Block语法的简单使用
开始学的时候没怎么接触过block语句,在后来用到的越来越多,就不得不学了,刚开始理解比较困难的,然后自己做了一个例子就慢慢理解了,不说废话了,上代码:
正常的简单地申明调用一个block语句是这样的:
int (^yxpBlock)(int, int)
=^(int a ) {return a*};
说明:返回值(^语句块名称)(传人参数类型)=^(传人参数){主体};
int result = square(5);
我建了一个测试项目包含了(yxpAppDelegate和yxpViewController)两个类
在yxpViewController类里面
申明了一个block语句类型
@classyxpViewC
typedef void (^yxpBlock) (yxpViewController *);
在yxpViewController 申明了yxpBlock变量
@interface yxpViewController :UIViewController
@property (nonatomic,assign)yxpB
在touchesBegan: withEvent:调用block语句 (调用block语句要用一根下划线,@propert默认提供)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
_yxpblock(self);
//在yxpAppDelegate中使用了block语句
__blockNSString *str=@"触摸屏幕";
yxpViewController *viewContro=[[yxpViewControlleralloc]
viewContro.yxpblock=^(yxpViewController *viewController){
NSLog(@"---------%@",str);
self.window.rootViewController=viewC
注意:block语句可以读取外部变量,但是不能写入,如果需要在block语句里修改外部变量,外部变量要用__block (两根下划线)标识
将这个例子弄懂相信你就对block语句有一个初步的了解了
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。本文欢迎转载,转载请注明:转载自中国学网: []
用户还关注
可能有帮助1614人阅读
现在的无论是框架还是项目中,越来越多的使用block代码块。
个人觉得:第一可以使代码看起来更简单明了,第二可以取代以前的delegate使代码的逻辑看起来更清晰。
借一张图表达基本定义:
(1)最基础的用法案例,可以把block理解为一段类似变量一样的可执行函数代码片段:
void (^printBlock)(NSString *x);
printBlock = ^(NSString* str)
NSLog(@&print:%@&, str);
printBlock(@&hello world!&);
(2)由于是变量,所以比方法等可以更灵活的使用,因为可以把block当做一个变量传入到另一个方法。
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@&我在玩手机&);
NSLog(@&手机没电了&);
[self chargeMyIphone:^{
NSLog(@&去逛街&);
NSLog(@&我在看电视&);
-(void)chargeMyIphone:(void(^)(void))finishBlock {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@&电充好了&);
finishBlock();
(3)上述方法是在单个类中执行的,如果在两个类中使用就能更加显现出其功能。可以用来取代代理,可以是逻辑变得清晰。如此处模拟一个发送HTTP请求的类。
#import &Foundation/Foundation.h&
typedef void(^HttpSendBlock)(NSDictionary *dict);
@interface HttpReq : NSObject
-(void)sendHttpReqUseUrl:(NSString*)url withBlock:(HttpSendBlock)
@end#import &HttpReq.h&
@implementation HttpReq
-(void)sendHttpReqUseUrl:(NSString*)url withBlock:(HttpSendBlock) block{
//……………发送请求并获取返回结果……………
NSDictionary *dic = [[NSDictionary alloc]initWithObjects:[NSArray arrayWithObjects:@&name&,@&state&, nil] forKeys:[NSArray arrayWithObjects:@&wdl&,@&ok&, nil]];
//返回请求结果
block(dic);
@end在一个Controller调用发送HTTP请求。
- (void)viewDidLoad {
[super viewDidLoad];
HttpReq *req = [[HttpReq alloc]init];
[req sendHttpReqUseUrl:@&& withBlock:^(NSDictionary *dict) {
NSLog(@&dict : %@&,dict.description);
看起来比较清晰,如果使用delegate的形势就相对比较繁琐一些,需要定义@optional,需要引用代理,实现代理,通过代理将结果返回回来。
http://blog.csdn.net/totogo2010/article/details/7839061
http://blog.csdn.net/mobanchengshuang/article/details/
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:37461次
排名:千里之外
原创:35篇
转载:11篇
评论:18条
(1)(7)(2)(2)(9)(9)(1)(1)(3)(1)(2)(4)(4)IOS Block的使用 - 下载频道
- CSDN.NET
&&&&IOS Block的使用
IOS Block的使用
block的使用
1 block作为局部变量
2 block作为属性 全局
3 block作为函数的参数
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
移动开发下载排行欢迎大家访问游戏开发网,有您更美好!
请记住本站网址,一定要搜藏哦亲!
iOS Block在ARC/非ARC下的使用总结
iOS Block在ARC/非ARC下的使用总结
围观298次 评论关闭 编辑日期: 字体:
一,明确两点
1,Block可以访问Block函数以及语法作用域以内的外部变量。也就是说:一个函数里定义了个block,这个block可以访问该函数的内部变量(当然还包括静态,全局变量)-即block可以使用和本身定义范围相同的变量。
2,Block其实是特殊的Objective-C对象,可以使用copy,release等来管理内存,但和一般的NSObject的管理方式有些不同,稍后会说明。
二,Block语法
Block很像函数指针,这从Block的语法上就可以看出。Block的原型:
返回值 (^名称)(参数列表)
Block的定义
^ 返回值类型 (参数列表) { 表达式 }
其中返回值类型和参数列表都可以省略,最简单的Block就是:
一般的定义就是:
返回值 (^名称)(参数列表) = ^(参数列表){代码段};
为了方便通常使用typedef定义:
typedef void (^blk) (void);
三,Block存储域
Block能够截获自动变量,自动变量的当前值会被拷贝到栈上作为常量,此时不能在Block内对自动变量进行赋值操作,如果有这种需求,则需要该变量是:
1,静态变量
2,全局变量
3,或者使用__block修饰符
根据Block中是否引用了自动变量,可以将Block存储区域分类:
1,_NSConcreteStackBlock-存储在栈上
2,_NSConcreteGlobalBlock-存储在全局数据区域(和全局变量一样)
3,_NSConcreteMallocBlock-存储在堆上
没有引用自动变量或者在全局作用域的Block为_NSConcreteGlobalBlock,其他的基本上都是_NSConcreteStackBlock。对_NSConcreteStackBlock执行copy操作会生成_NSConcreteMallocBlock。
一般来说出问题的Block大部分都是_NSConcreteStackBlock,超过了_NSConcreteStackBlock的作用域_NSConcreteStackBlock就会销毁。
四,对Block执行retain,copy方法的效果
Block是C语言的扩展,C语法也可以使用Block的语法,对应的C语言使用Block_copy,Block_release.
无论是_NSConcreteStackBlock,还是_NSConcreteGlobalBlock,执行retain都不起作用。而_NSConcreteMallocBlock执行retain引用计数+1。
对于copy操作,_NSConcreteStackBlock会被复制到堆上得到新的_NSConcreteMallocBlock,而_NSConcreteGlobalBlock执行copy操作不起作用。而对_NSConcreteMallocBlock执行copy操作会引起引用计数加1。
那么就引出一个问题,对_NSConcreteMallocBlock多次copy会不会引起问题呢?参考Objective-C高级管理115页。
五,什么时候要对NSConcreteStackBlock执行copy操作?
配置在栈上的Block也就是NSConcreteStackBlock类型的Block,如果其所属的变量作用域结束该Block就会废弃。这个时候如果继续使用该Block,就应该使用copy方法,将NSConcreteStackBlock拷贝为_NSConcreteMallocBlock。当_NSConcreteMallocBlock的引用计数变为0,该_NSConcreteMallocBlock就会被释放。
如果是非ARC环境,需要显式的执行copy或者antorelease方法。
而当ARC有效的时候,实际上大部分情况下编译器已经为我们做好了,自动的将Block从栈上复制到堆上。包括以下几个情况:
1,Block作为返回值时
类似在非ARC的时候,对返回值Block执行[[returnedBlock copy] autorelease];
2,方法的参数中传递Block时
3,Cocoa框架中方法名中还有useringBlock等时
4,GCD相关的一系列API传递Block时。
比如:[mutableAarry addObject:stackBlock];这段代码在非ARC环境下肯定有问题,而在ARC环境下方法参数中传递NSConcreteStackBlock会自动执行copy。
六,Block的循环引用
对于非ARC下, 为了防止循环引用, 我们使用__block来修饰在Block中使用的对象:
对于ARC下, 为了防止循环引用, 我们使用__weak来修饰在Block中使用的对象。原理就是:ARC中,Block中如果引用了__strong修饰符的自动变量,则相当于Block对该变量的引用计数+1。
七,演示代码
主要为了说明在ARC和非ARC环境下使用Block的一些区别。
这里还是给出CococChina上的两个典型例子说明:
void exampleB_addBlockToArray(NSMutableArray *array) {
char b = 'B';
[array addObject:^{
printf("%c\n", b);
void exampleB() {
NSMutableArray *array = [NSMutableArray array];
exampleB_addBlockToArray(array);
void (^block)() = [array objectAtIndex:0];
void exampleC_addBlockToArray(NSMutableArray *array) {
[array addObject:^{
printf("C\n");
void exampleC() {
NSMutableArray *array = [NSMutableArray array];
exampleC_addBlockToArray(array);
void (^block)() = [array objectAtIndex:0];
typedef void (^dBlock)();
dBlock exampleD_getBlock() {
char d = 'D';
printf("%c\n", d);
void exampleD() {
exampleD_getBlock()();
exampleB_addBlockToArray添加的Block为NSConcreteStackBlock,在非ARC环境下,执行该Block时,栈上的数据已经被清除了,错误。而在ARC环境下,作为参数的Block会自动copy,不会出现问题;对应是五(2)情况。
exampleC_addBlockToArray添加的Block为_NSConcreteGlobalBlock,存储在程序的数据区,相当于一个不使用外部环境的函数,没有用到栈上的数据,所有无论是ARC还是非ARC都能正常执行。
ARC中作为返回值的NSConcreteStackBlock会被执行copy操作。所有ARC运行正常,非ARC错误。对应是五(1)情况。
本文固定链接:
转载请注明:
作者:游戏开发
欢迎大家访问游戏开发网!
如果您觉得这篇文章有用处,请支持作者!鼓励作者写出更好更多的文章!
您可能还会对这些文章感兴趣!}

我要回帖

更多关于 ios block 内存管理 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信