1、简单复习Block的定义、赋值、调用做学习传值铺垫:
//声明一个函数 无返无参
void printfHello(int a);
//函数的实现
void printfHello(int a){
printf("hello wold\n");
}
//函数指针的类型
//void (*)(int);
//定义一个函数指针变量
void printfHello(int a);
//函数的实现
void printfHello(int a){
}
//函数指针的类型
//void (*)(int);
//定义一个函数指针变量
void (*p)(int) = printfHello;
//block是块语法,实质就是匿名函数
//定义一个block变量,block的定义和函数的定义很像
void (^myBlock)(int);
======================Block传值========================
———————————————————————————————————————
AppDelegate.m
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];
@property(nonatomic,retain)UITextField *textField;
@property(nonatomic,retain)UIButton *button;
@end
@implementation FirstViewController
- (void)dealloc{
}
- (void)viewDidLoad {
}
- (void)handlePush : (UIButton *)push{
SecondViewController *secondVC = [[SecondViewController alloc]init];
- (void)handlePush : (UIButton *)push{
注意: 在block访问self,或者属性,或者使用self调用方法,都会造成对当前类的对象的引用计数+1,
使用
__block typeof(self) weakSelf = self;
block内部不会持有,也不会造成他的引用计数器+1
}
————————————————————————————————
SecondViewController.h
#warning block 传值
#warning 1 给block起别名
typedef void(^passBlock)(NSString *);
//1.定义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;
//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;
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属性赋值
- (void)dealloc{
}
- (void)sayHi{
}
- (void)viewDidLoad {
//添加方法
}
- (
//block的调用
//
}
最终效果:
————————————————————————————————————————
总结:
声明block的属性时,需要使用copy 在dealloc 中要使用对应的Block_release()
在block实现部分,不要直接self、实例变量、属性、会造成循环不能引用
=====================================================================
欢迎学习本文,转载请注明作者和出处链接!
