Block高级用法:Block传值UI_12(3)

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、实例变量、属性、会造成循环不能引用

=====================================================================

欢迎学习本文,转载请注明作者和出处链接!

时间: 2024-10-28 16:07:01

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

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

原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级) 本章介绍的是企业库加密应用程序模块Cryptographyproviders中为对称加密配置Key文件的3种方式: create a new key  : 使用一串字符串作为Key,然后通过加密保存到一个Key文件中. use an existing DPAPI-protected key file  : 使用一个现有的Key文件进

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

原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (高级) 企业库验证应用程序模块之配置文件模式:   1.       新建一个控制台应用程序,并创建一个Customer类,其代码如下所示: 代码 using System;using System.Collections.Generic;using System.Linq;using System.Text; using Microsoft.

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

原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(一) Caching Application Block (高级) Caching Application Block 的基本架构如下所示,图中很清楚的写出了Cache Manager可以使用3中方式对数据进行缓存: 1. Null backing store 存储策略   : 默认的存储策略,存储的数据只存储在内存的缓存中,并不持久保存, 它可用于所有支持的应用类型.适合于保存一些临时的数据,或者用于保存当

一些Ipython的高级用法总结

今天我们由浅入深的看看ipython, 本文作为读者的你已经知道ipython并且用了一段时间了. %run 这是一个magic命令, 能把你的脚本里面的代码运行, 并且把对应的运行结果存入ipython的环境变量中: $cat t.py # coding=utf-8 l = range(5) $ipython In [1]: %run t.py # `%`可加可不加 In [2]: l # 这个l本来是t.py里面的变量, 这里直接可以使用了 Out[2]: [0, 1, 2, 3, 4] a

ping的高级用法

高级 ping的高级用法 对于Windows下ping命令相信大家已经再熟悉不过了,但是能把ping的功能发挥到最大的人却并不是很多,当然我也并不是说我可以让ping发挥最大的功能,我也只不过经常用ping这个工具,也总结了一些小经验,现在和大家分享一下. 现在我就参照ping命令的帮助说明来给大家说说我使用ping时会用到的技巧,ping只有在安装了TCP/IP协议以后才可以使用: ping [-t] [-a] [-n count] [-l length] [-f] [-i ttl] [-v

Wordpress标签高级用法 你用对了吗?

使用Wordpress建站的朋友,对标签是再熟悉不过了.对标签的使用也是各有各的看法,主要集中在两点:一种是倾向于屏蔽,另一种是不屏蔽.倾向于屏蔽的理由是随着文章的增多标签会越来越多,造成网站的臃肿;不屏蔽的理由是标签有利于搜索引擎的收录.笔者认为这个标签不应屏蔽,wordpress作为用户最多的博客程序之一,自然有其妙处.下面笔者就目前流行用法做一个罗列及评述,并提供一种高级用法,与网友分享. 一.华而不实的标签云 记得多年前,没有使用wordpress的时候,看到很多网友的博客,侧边栏上有个

sscanf函数高级用法

大家都知道sscanf是一个很好用的函数,利用它可以从字符串中取出整数.浮点数和字符串等等.它的使用方法简单,特别对于整数和浮点数来说.但新手可能并不知道处理字符串时的一些高级用法,这里做个简要说明吧. 1. 常见用法. 以下是引用片段:char str[512] = {0};sscanf("123456 ", "%s", str);printf("str=%s\n", str); 2. 取指定长度的字符串.如在下例中,取最大长度为4字节的字符串

Excel自动筛选的9个高级用法

  Excel自动筛选的9个高级用法            源表:A列为数字 1.筛选包含1的数字 很简单,在搜索框中输入1即可. 2.筛选以1开始的数字 在搜索框中输入1*,这里*是通配符,可以是任意多个字符. 3.筛选以1结尾的数字 在搜索框中输入*1. 4.筛选以至少包含2个1的数字 在搜索框中输入*1*1*. 5.筛选两个1之间隔一个数字的数字

windows系统自带计算器高级用法分享

  不知道验友有没有研究过windows自带的计算器,反正小编研究之后发现,windows自然的计算器确实很强大,之前都忽视了.现在,跟着懒蛇来看一下,windows自带计算器的一些高级用法. 如何快速打开计算器? 1.win + R 组合键,打开运行对话框 2.输入calc,敲回车执行 3.打开windows自带的标准型计算器. 注意,如果第一次打开,默认打开标准型计算机.如果上次打开程序员类型计算器,下次打开还是程序员类型. 计算器的几种工作模式 1.标准型 2.科学型 3.程序员型 4.统