1、简单复习Block的定义、赋值、调用做学习传值铺垫:
//声明一个函数
无返无参
void printfHello(int a);
//函数的实现
void printfHello(int a){

   
printf("hello wold\n");

}
//函数指针的类型
//void (*)(int);
//定义一个函数指针变量
void (*p)(int) = printfHello;
//block是块语法,实质就是匿名函数
//定义一个block变量,block的定义和函数的定义很像
void (^myBlock)(int);

   
//函数的调用

   
printfHello(3);

   

   
//使用函数指针调用

    p(1);

   

   
//给block变量赋值
   
myBlock = ^(int a){
       
NSLog(@"%d",a);

    };

   

   
//block变量的调用
   
myBlock(10);
   
//无返无参
   
typedef void(^aBlock) ();

   
//使用重命名的block类型定义block变量

    aBlock show
= ^(){

       
NSLog(@"我是中国人");

    };

   
//block调用
   
show();
======================Block传值========================

 2、使用Block在两个界面之间传值(Block高级用法:Block传值)
 
 
   使用Block的地方很多,其中传值只是其中的一小部分,下面介绍Block在两个界面之间的传值:
   
    先说一下思想:
   
首先,创建两个视图控制器,在第一个视图控制器中创建一个UITextField和一个UIButton,其中UILabel是为了显示第二个视图控制器传过来的字符串,UIButton是为了push到第二个界面。
   
第二个界面的只有一个UITextField,是为了输入文字,当输入文字,并且返回第一个界面的时候,当第二个视图将要消失的时候,就将第二个界面上TextFiled中的文字传给第一个界面,并且显示在UITextField上。
———————————————————————————————————————
AppDelegate.m
 self.window.rootViewController
=
[[[UINavigationController
alloc]initWithRootViewController:[FirstViewController
new]]autorelease];
FirstViewController.m
#import "SecondViewController.h"
@interface FirstViewController
()
@property(nonatomic,retain)UITextField *textField;
@property(nonatomic,retain)UIButton
*button;
@end
@implementation FirstViewController

- (void)dealloc{

   
self.textField = nil;

   
self.button= nil;



   
[super
dealloc];

}

- (void)viewDidLoad {

   
[super
viewDidLoad];

   
self.textField = [[UITextField alloc]initWithFrame:CGRectMake(50, 100, 220, 30)];

   
self.textField.placeholder = @"请输入内容";

   
self.textField.borderStyle = UITextBorderStyleRoundedRect;

[self.view addSubview:self.textField];

   
[self.textField release];

 
  
   
self.button = [UIButton buttonWithType:(UIButtonTypeSystem)];

self.button.frame = CGRectMake(100, 160, 120, 30);

   
[self.button setTitle:@"进入下一个界面" forState:( UIControlStateNormal)];

   
[self.view
addSubview:self.button];
 
 //添加方法
   
[self.button
addTarget:self action:@selector(handlePush :) forControlEvents:(UIControlEventTouchUpInside)]; 
 
}

- (void)handlePush : (UIButton *)push{



   
SecondViewController
*secondVC =
[[SecondViewController
alloc]init];
   
#warning  3
在push之前给block属性赋值
注意: 在block访问self,或者属性,或者使用self调用方法,都会造成对当前类的对象的引用计数+1,使用__block
typeof(self) weakSelf = self; block内部不会持有,也不会造成他的引用计数器+1
   
__block typeof(self) weakSelf = self; 
   
secondVC.passValue = ^(NSString *string){

       
//在block块内给空间赋值
       
weakSelf.textField.text =
string; 
 
   
};
   
[self.navigationController
pushViewController:secondVC
animated:YES];

   
[secondVC release];
}
————————————————————————————————
SecondViewController.h
#warning block 传值

#warning 1 给block起别名
typedef void(^passBlock)(NSString *);
//1.定义block类型起别名
typedef void (^aBlock)();
@interface SecondViewController :
UIViewController
//2.定义block类型的属性
//block变量存在于栈区,用copy修饰后就会存放在堆区,从而保证block块不会丢失,但是申请了内存就要释放内存

@property(nonatomic,copy)aBlock testBlock;
//@property
(nonatomic,copy)void (^testBlock2)();
#warning 2
定义block类型的变量
@property(nonatomic,copy)passBlock passValue;
@end
——————————————————————————————
SecondViewController.m
//1.给block类型起别名

typedef
void(^aBlock)
();
@interface SecondViewController
()
@property(nonatomic,retain)UITextField *textField;
@property(nonatomic,retain)UIButton *button;
@end
@implementation SecondViewController

- (void)dealloc{

   
self.textField = nil;

   
self.button = nil;

   
Block_release(_testBlock);//block 属性释放

   
NSLog(@"第二个视图被销毁了");

[super
dealloc];

}

- (void)sayHi{

   
NSLog(@"你好");

}

- (void)viewDidLoad {

   
[super
viewDidLoad];

   
self.view.backgroundColor = [UIColor cyanColor];

   

   
  给block属性赋值

   
  在block访问self,或者属性,或者使用self调用方法,都会造成对当前类的对象的引用计数+1 
 重点:第一种:
 
//MRC
   
  __block SecondViewController *weakSelf =
self;
 
  使用__block修饰的对象block内部不会持有,也不会造成他的引用计数器+1  
 
     
     
  第二种:  
   //ARC
 
  __weak SecondViewController *weakSelf1 =
self;
 
     
     
     
 第三种: __block typeof(self) weakSelf3 = self;
   
__block
typeof(self) weakSelf3 = self;
   
self.testBlock = ^(){

       
[weakSelf3 sayHi];

   
};

   
self.textField = [[UITextField alloc]initWithFrame:CGRectMake(50, 100, 220, 30)];

   
self.textField.placeholder = @"请输入内容";

   
self.textField.borderStyle = UITextBorderStyleRoundedRect;

[self.view addSubview:self.textField];

   
[self.textField release];

 
 
   
self.button = [UIButton buttonWithType:(UIButtonTypeSystem)];

self.button.frame = CGRectMake(100, 160, 120, 30);

   
[self.button
setTitle:@"返回上一个界面" forState:( UIControlStateNormal)];
//添加方法
   
[self.button addTarget:self action:@selector(handlePush :) forControlEvents:(UIControlEventTouchUpInside)];

[self.view addSubview:self.button];

   

}

- (void)handlePush : (UIButton *)push{
//block的调用

//   
self.textBlock();

   

#warning  4
pop之前调用block块

   
self.passValue(self.textField.text);
   
[self.navigationController
popViewControllerAnimated:YES];
}
最终效果:



————————————————————————————————————————
总结:
声明block的属性时,需要使用copy  在dealloc
中要使用对应的Block_release()
在block实现部分,不要直接self、实例变量、属性、会造成循环不能引用
=====================================================================
欢迎学习本文,转载请注明作者和出处链接!

Block高级用法:Block传值UI_12(3)的更多相关文章

  1. iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值)

    iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值)   使用Block的地方很多,其中传值只是其中的一小部分,下面介绍Block在两个界面之间的传值: 先说一下思想: ...

  2. iOS block的用法

    本章学习目标: 1. 了解何谓block. 2. 了解block的使用方法. Block 是iOS在4.0之后新增的程式语法,严格来说block的概念并不算是基础程式设计的范围,对初学者来说也不是很容 ...

  3. ios Block详细用法

    ios Block详细用法 ios4.0系统已开始支持block,在编程过程中,blocks被Obj-C看成是对象,它封装了一段代码,这段代码可以在任何时候执行.Blocks可以作为函数参数或者函数的 ...

  4. iOS block的用法 by -- 周傅琦君

    X.1 初探Block X.1.1 宣告和使用Block 我们使用「^」运算子来宣告一个block变数,而且在block的定义最后面要加上「;」来表示一个完整的述句(也就是将整个block定义视为前面 ...

  5. iOS中block的用法 以及和函数用法的区别

    ios中block的用法和函数的用法大致相同 但是block的用法的灵活性更高: 不带参数的block: void ^(MyBlock)() = ^{}; 调用的时候  MyBlock(); 带参数的 ...

  6. OC中 block 的用法

    block 常用于反向传值 声明 返回值类型 (^block)(参数列表) 调用 闭包的名字=^(参数列表){}: 闭包的名字(): 如: void(^aaaaa)(int num,NSString ...

  7. 黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (高级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (高级) 企业库验证应用程序模块之配置文件模式: ...

  8. 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级) 本章介绍的是企业库加密应用程序模块 ...

  9. 黄聪:Microsoft Enterprise Library 5.0 系列教程(一) Caching Application Block (高级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(一) Caching Application Block (高级) Caching Application Bl ...

随机推荐

  1. C指针 指针和数组 二维数组的指针 指针应用

    直接到变量名标识的存储单元中读取变量的值--直接寻址 通过其他变量间接找到变量的地址读取变量的值--间接寻址 指针变量存放地址 显示变量的地址 指针变量使用前必须初始化,若不知指向哪,可先指向NULL ...

  2. JAVA局部内部类

    在刚刚学到的android开发中了解到Button的onClick是通过局部内部类的方式实现的,具体的原理我以后再去了解,只是遇到问题总是想知道为什么,不要告诉我这是规则,死记住就可以了. 问题是局部 ...

  3. 排序算法的C语言实现(上 比较类排序:插入排序、快速排序与归并排序)

    总述:排序是指将元素集合按规定的顺序排列.通常有两种排序方法:升序排列和降序排列.例如,如整数集{6,8,9,5}进行升序排列,结果为{5,6,8,9},对其进行降序排列结果为{9,8,6,5}.虽然 ...

  4. A potentially dangerous Request.Form value was detected from the client问题处理

    问题剖析: 用户在页面上提交表单到服务器时,服务器会检测到一些潜在的输入风险,例如使用富文本编辑器控件(RichTextBox.FreeTextBox.CuteEditor等)编辑的内容中包含有HTM ...

  5. 这交互炸了(四) :一分钟让你拥有微信拖拽透明返回PhotoView

    本文已授权微信公众号:鸿洋(hongyangAndroid)原创首发 <交互炸了>或许是一系列高端特效教程, 文中会介绍一些比较炫酷的特效,以及实现的思路.特效实现本身也许不会有太大的难度 ...

  6. 制定一个apk路径 然后跳出安装界面

    制定一个apk的路径 然后跳出界面让用户选择是否安装 我们系统有一个写好的Activity来协助我们完成这一功能 我们来看看它的清单文件 <?xml version="1.0" ...

  7. linux2.6.37内核接两个硬盘导致读写效率变低的问题

    一.问题分析: 通过跟踪定位write系统调用的实现发现,在每次调用a_ops->write_end之后,都会去调用balance_dirty_pages_ratelimited,该函数负责检查 ...

  8. Android开发学习之路--基于vitamio的视频播放器(一)

      之前也试过vitamio这个库,后来不知道被什么事情给耽搁了,就没继续下去.近来觉得视频还是需要学习一下的,谁让直播那么火呢,就想着写一个简单的视频播放的app先吧.好了那就开始吧,暂时取名为JP ...

  9. [CSDN_Markdown] 使用LaTeX写矩阵

    简介 LaTeX 的公式功能非常强大,一次性讲全不是件容易的事情.将LaTeX 的这些功能分成较小的相互独立的部分来讲,一方面方便大家单独查阅:另一方面,所有[CSDN_Markdown]相关的文章都 ...

  10. Android图表库MPAndroidChart(十二)——来点不一样的,正负堆叠条形图

    Android图表库MPAndroidChart(十二)--来点不一样的,正负堆叠条形图 接上篇,今天要说的,和上篇的类似,只是方向是有相反的两面,我们先看下效果 实际上这样就导致了我们的代码是比较类 ...