多视图间传递参数问题

提出问题:刚遇到这个问题,就忍不住想到MFC、QT,也存在着窗口之间传递参数的问题。MFC中一般使用消息机制来解决这个问题,sendMessage(),PostMessage()。QT中使用的是信号与槽的机制,具体的实现原理将分别写两篇文章来详细的研究一下。那么,问题来了,为什么各种框架下,窗口之间不能直接传递参数,原因是什么呢?为什么对话框之间不能直接访问?每一个对话框/视图都是一个类,那么这个问题可以看成是类与类之间传递消息的问题。

解决问 ---iOS中多视图见传递参数的方法有:

1)委托设计模式,协议Delegate

2)广播通知NSNotification

3)单例设计模式

4)块语法block


深入理解---block和代理的,通知的区别。block的用法需要注意些什么。

通知:

1、“一对多”,在APP中,很多控制器都需要知道一个事件,应该用通知;
delegate:
1,“一对一”,对同一个协议,一个对象只能设置一个代理delegate,所以单例对象就不能用代理;
2,代理更注重过程信息的传输:比如发起一个网络请求,可能想要知道此时请求是否已经开始、是否收到了数据、数据是否已经接受完成、数据接收失败
block:
1:写法更简练,不需要写protocol、函数等等
2,block注重结果的传输:比如对于一个事件,只想知道成功或者失败,并不需要知道进行了多少或者额外的一些信息

3、block的运行成本很高,block出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是加计数,使用完或者block置nil后才消除;delegate只是保存了一个对象指针,直接回调,没有额外消耗。相对C的函数指针,只多做了一个查表动作 。

4,block需要注意防止循环引用:
ARC下这样防止:
__weak typeof(self) weakSelf = self;
  [yourBlock:^(NSArray *repeatedArray, NSArray *incompleteArray) {
       [weakSelf doSomething];
    }];
非ARC
__block typeof(self) weakSelf = self;
  [yourBlock:^(NSArray *repeatedArray, NSArray *incompleteArray) {
       [weakSelf doSomething];
    }];


从上又引出--->__weak和__block的区别:

1.__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。 
2.__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。 
3.__block对象可以在block中被重新赋值,__weak不可以。 


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值