如何在iOS中使用ios block详解

如何在block里面正确的调用变量以及方法!!!!!
[问题点数:200分,结帖人rollrock1987]
如何在block里面正确的调用变量以及方法!!!!!
[问题点数:200分,结帖人rollrock1987]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2012年10月 其他开发语言大版内专家分月排行榜第二2011年7月 其他开发语言大版内专家分月排行榜第二2010年3月 其他开发语言大版内专家分月排行榜第二2007年10月 其他开发语言大版内专家分月排行榜第二2007年9月 其他开发语言大版内专家分月排行榜第二2005年3月 Windows专区大版内专家分月排行榜第二2005年2月 Windows专区大版内专家分月排行榜第二2005年6月 扩充话题大版内专家分月排行榜第二2006年9月 其他开发语言大版内专家分月排行榜第二2006年5月 其他开发语言大版内专家分月排行榜第二2006年3月 其他开发语言大版内专家分月排行榜第二2006年2月 其他开发语言大版内专家分月排行榜第二2005年12月 其他开发语言大版内专家分月排行榜第二2005年4月 其他开发语言大版内专家分月排行榜第二2004年11月 其他开发语言大版内专家分月排行榜第二2005年3月 硬件使用大版内专家分月排行榜第二
2011年11月 其他开发语言大版内专家分月排行榜第三2011年8月 其他开发语言大版内专家分月排行榜第三2008年10月 其他开发语言大版内专家分月排行榜第三2004年9月 硬件/嵌入开发大版内专家分月排行榜第三
匿名用户不能发表回复!|Posts - 30,
Articles - 0,
Comments - 0
17:48 by button~touch, ... 阅读,
  __block int a= 10;
中使用局部变量的时候 不能修改它的值(readonly) 如果需要修改 在局部变量申明的时候用 __block 来修饰
//定义一个block
和 实现部分
int (^TTblocke)(int) = ^(int num){
return num *
NSLog(@"%d",TTblocke(3));
block 做反向传值 ----- A界面 & 跳转 & B界面----------由B界面向A界面传递数据
1.在B界面声明一个block的属性
#import &UIKit/UIKit.h&
@interface NextViewController : UIViewController
@property(nonatomic,strong)void(^callback)(NSString *,int);
2. 在A界面跳转下一个页面的位置 实现block
NextViewController *next = [[NextViewController alloc]init];
next.callback =
^(NSString *reslt,int t)
NSLog(@"%@+++%d",reslt,t);
[self presentViewController:next animated:YES completion:nil];
3. 在B界面需要传递数据的位置 写入需要传递的数据
-(void)buttonClick:(UIButton *)sender
[self dismissViewControllerAnimated:YES completion:^{
self.callback(@"dcsdf",90);
使用block时不能造成循环引用。
循环引用指两个对象相互强引用了对方,即retain了对方,从而导致谁也释放不了谁的内存泄露问题。(如声明一个delegate时一般用assign而不能用retain或strong)
  局部自动变量,在Block中只读。Block定义时copy变量的值,在Block中作为常量使用,所以即使变量的值在Block外改变,也不影响他在Block中的值
  STATIC修饰符的全局变量,因为全局变量或静态变量在内存中的地址是固定的,Block在读取该变量值的时候是直接从其所在内存读出,获取到的是最新值,而不是在定义时copy的常量.
@interface ViewController ()
@property(nonatomic,strong)void (^myBlock)();
self.myBlock = ^(){
[self doingSomeThing];
-(void)doingSomeThing
NSLog(@"doingSomeThing");
这样写就造成了 return cycle(循环引用)
&经过测试 &吧代码修改成下面的
__block ViewController *weakSelf =
self.myBlock = ^(){
[weakSelf doingSomeThing];
还是存在循环引用问题 &所以 __block 不能很好的解决问题
把代码在修改一下
__weak ViewController *weakSelf =
self.myBlock = ^(){
[weakSelf doingSomeThing];
__unsafe_unretained ViewController *weakSelf =
self.myBlock = ^(){
[weakSelf doingSomeThing];
这样就可以避开循环引用问题
为了方便 &可以将 弱引用申明写成宏形式
#define WeakSelf __weak typeof(self) weakSelf = 这样就不用再每次使用block会出现循环引用的时候都去写
__weak ViewController *weakSelf =进一步方便其他的强引用对象在block中方便使用可以将宏定义修改成(带参宏)
#define WeakObj(o) __weak typeof(o) o##Weak =
在使用前 先 WeakObj(self) 申明一次 &然后就可以用&selfWeak&这个对self的弱引用来解决循环引用的问题我们可以把Block当做Objective-C的匿名函数。Block允许开发者在两个对象之间将任意的语句当做数据进行传递,往往这要比引用定义在别处的函数直观。另外,block的实现具有封闭性(closure),而又能够很容易获取上下文的相关状态信息。
block是代码块,其本质和变量类似。不同的是代码块存储的数据是一个函数体。使用Block,就可以像其他标准函数一样,传入参数,并得到返回值。
  block的格式:
&&&&&a:Block的返回值类型,可以为空(void);
&&&&&b:Block对象名称,可以理解为变量名;
&&&&&^:块的语法标记,声明b为一个Block对象;&
&&&&&c:第一个参数类型
&&&&&d:第二个参数类型
&&&&&name1,name2:参数名;
&&&&&{}:Block代码块的主题部分。
&&&&&例:&
int (^myBlock)(int,int) = ^(int num1, int num2) {
return num1 + num2;
NSLog(@"%d",myBlock(5,4));
打印结果:9。
定义和使用
定义无返回值、无参数的Block
// 1.定义无返回值、无参的Block
void (^block1)() = ^() {
NSLog(@"无返回无参的Block");
定义无返回值、有参数Block
// 2.定义无返回值、有参数的Block
void (^block2)(int) = ^(int a) {
NSLog(@"%d",a);
block2(2);
定义返回值为OC对象的Block
// 3.定义返回值为OC对象的Block
NSString *(^block3)(NSString *) = ^(NSString *string) {
string = [NSString stringWithFormat:@"%@_%@",string,string];
return string;
NSLog(@"%@",block3(@"我是字符串"));
由以上可知,定义Block变量就相当于定义了一个函数,只有在调用block的时候才会执行其主体块{}里面的代码
__block关键字的使用
在Block的代码块里,是不能修改在外面定义的变量,并且在给block赋值的时候,已经对代码块里的变量做了值的拷贝(只读不可修改)。
int x = 5;
int (^block4)(int) = ^(int y) {
int z = x +
NSLog(@"%d,%d",x +=5,block4(5));
打印的值是10,10;
分析:变量x在Block外定义的,在Block代码块编译的时候,取的x的值为之前的5(不可修改)。因此即使执行x += 5的使x的值变为10,但Block代码块里的x依然是5,所以block(5)的值为5+5=10。
在变量前添加__block关键字进行修饰后,此变量在Block代码块里的就是可更改的(可读可写),执行代码时取变量最新的值。
__block int x = 5;
int (^block4)(int) = ^(int y) {
int z = x +
NSLog(@"%d,%d",x +=5,block4(5));
打印的值是10,15;
作为OC对象的属性,实现对象之间的传值
Block可以看做是一个变量,因此可以作为OC对象的属性
需求:在ViewContrler的View上添加按钮,点击按钮模态跳转到FirstViewController视图控制器,FirstViewController的View上又两个按钮,一个是直接dismiss模态跳转到ViewController,一个是更改ViewController的背景色再dismiss模态跳转回ViewController
分析:FirstViewController是有ViewController模态推出的视图控制器,在FirstViewController里更改ViewController的背景色,这时就要做到反向传值。
实现步骤:
1.在FirstViewController.h文件里,定义将block变量作为@property属性
// 第一步定义, Block作为property属性
void: Block的返回值为空,即无返回值;
colorBlock: Block的作为对象属性时的属性名;
(UIColor *color): Block的参数是UIColor实例对象
@property (nonatomic, copy) void(^colorBlock)(UIColor *color);
在FirstViewController.m文件里,在按钮点击触发的方法里给block传参,调用block。
// 随机生成的颜色
UIColor *color = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1];
// 第二步 给Block传入参数color
if (self.colorBlock) {
self.colorBlock(color);
[self dismissViewControllerAnimated:YES completion:nil];
在ViewController.m 文件里,实例化FirstViewController对象的地方,执行block代码块。
FirstViewController *fvc = [[FirstViewController alloc] init];
// 执行Block代码块
fvc.colorBlock = ^(UIColor *color) {
self.view.backgroundColor =
效果展示:
阅读(...) 评论()如何在ios中使用block_百度知道
如何在ios中使用block
我有更好的答案
声明和使用Block:Apple文档中介绍了如何将一个Block声明为变量,并将其作为一个函数使用:int (^oneFrom)(int) = ^(int anInt) { return anInt - 1; }; // 创建了一个内联块^(int anInt)... ,其函数体和结果被传到了另外一个名为OneFrom的Block。 printf(&1 from 10 is %d&, oneFrom(10)); // 打印出: &1 from 10 is 9& // 这个block函数(distanceTraveled)传入3个float型参数,返回float值。 float (^distanceTraveled) (float, float, float) = ^(float startingSpeed, float acceleration, float time) { float distance = (startingSpeed * time) + (0.5 * acceleration * time * time);
}; 也可以传入一个Block作为一个参数,而不要以如上的方式声明,这样就可以在需要将block作为参数的时候以内联代码的方式简单地实现。NSArray *anArray = [NSArray arrayWithObjects: @&cat&, @&dog&,nil]; sortFunction(anArray, ^(string *a string *b){ if ( a == @&cat&) return TRUE; });
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。iOS 如何正确使用block才不会造成内存泄漏? - 知乎36被浏览<strong class="NumberBoard-itemValue" title="分享邀请回答@weakify(self);
@strongify(self);
54 条评论分享收藏感谢收起21 条评论分享收藏感谢收起

我要回帖

更多关于 ios中block回调 的文章

 

随机推荐