UI第十三讲 UITabBarController(标签视图控制器) Block块传值
一.UITabBarController标签视图控制器
二.配置UITabBar和自定义UITabBarItem
三.三大视图控制器的综合使用
示例代码:
总结: 1. 在UITabBarController中,对于Navigation,ViewController要放到ViewControllers数组里面
2.需要指定tabor为window的rootViewController。
3.有个代理方法;只需要记得一个ok,点击取消小圆点。
4.appearance 可以全局的替换Navigation、tabor的样式和颜色
5.tabbar上的VC,只有在第一次出现的时候才会走viewDidLoad方法。这几个界面基本不会被释放。
四.Block块传值
Block块的示例代码分析:
BLOCK在使用时应该注意:
1.只能用copy修饰,从栈区拷贝到堆区,防止其他人的释放。
2.如果在block里面使用了self,会造成循环引用,谁都释放不掉,也就是内存泄漏。如果一定要使用self,记得要使用__block(mrc环境下使用),__weak(arc环境下使用)
3.BLOCK和代理的区别:都可以对类的方法做拓展,但是BLOCK一次只能拓展一个。代理可以无限制的拓展方法。
引起循环引用的情况:(要注意,不要出现此种情况)
1 #import <UIKit/UIKit.h>
2 //block 传值过程
3
4
5
6 //第一步: 使用typedef 类型重定义一个 block
7 //typedef 返回值类型(^ 名字 )(参数类型)
8 typedef void(^BLOCK)(NSString *);
9
10 //block一次只能扩展一个方法 ,代理可以多个
11
12
13 @interface SecondViewController : UIViewController
14
15
16 //block 作为属性,需要使用copy修饰 ,从栈区拷贝到堆区 ;retain 和 assign 会出现野指针问题
17 //第二步: 把block 作为一个属性,要注意使用copy修饰
18 @property (nonatomic, copy) BLOCK myBlock;
19
20
21 @end
22
23 #import "SecondViewController.h"
24
25 @interface SecondViewController ()
26
27 @end
28
29 @implementation SecondViewController
30
31 //ARC也要写
32 -(void)dealloc
33 {
34 //因为Block 是C语言的,所以用宏释放block 不能直接用release(对OC语言)释放
35 //在ios 4.0 之后出现
36 //block释放;
37 Block_release(_myBlock);
38 //在ARC下不用释放block 或者 _myBlock = nil ;
39
40 NSLog(@"hahhha");
41
42 //其他的直接置为nil ;
43 [super dealloc];
44
45 }
46
47 - (void)viewDidLoad {
48 [super viewDidLoad];
49 // Do any additional setup after loading the view.
50
51 //__weak 是在ARC下使用的
52
53
54 //在block的块语法中使用self时;
55 // __block 修饰符不用考虑释放的问题,是在MRC下用的.预防循环引用照成的内存泄露,在ARC下 使用__weak ;
56 //如果要用self 的话就用它修饰这个类
57 //此处用本身调用本身时要注意,使用__block,避免引起循环引用
58 __block SecondViewController *secondVC = self;
59
60 //初始化block
61 self.myBlock = ^(NSString *str){
62
63 secondVC.view.backgroundColor = [UIColor redColor];
64
65 };
66
67
68 }
69
70
71 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
72 {
73
74
75 //调用block
76 //第四步 : 触发这个block
77 self.myBlock(@"好");//真正传值
78
79
80 [self.navigationController popViewControllerAnimated:YES];
81
82
83 }
已经学习的三种传值方法的简单总结: