Fork me on GitHub

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 }

 

 

 

 已经学习的三种传值方法的简单总结:

 

 

 

posted @ 2015-09-25 09:31  DengHuiCheng  阅读(170)  评论(0编辑  收藏  举报