iOS常用的传值方式有以下几种:
属性传值、单例传值、代理传值、block传值、通知传值
接下来我就分别讲述一下这几种方式的使用方法
一、属性传值
假设现在又A和B俩个控制器,现在A->B传值 我们可以分为下面三步完成
1、在B中定义一个属性接收A的值。
![](https://i-blog.csdnimg.cn/blog_migrate/cbd62c149469d581e0ff08cd145f8d27.webp?x-image-process=image/format,png)
2、当A中点击提交按钮的时候给B中的strValue属性赋值。
![](https://i-blog.csdnimg.cn/blog_migrate/abe4dc58359335fa73c3062561d1a12d.webp?x-image-process=image/format,png)
3、在B中使用属性strValue给相应的控件赋值,刷新界面。
![](https://i-blog.csdnimg.cn/blog_migrate/739132c5af8bdff7526c5e97a46b0b17.webp?x-image-process=image/format,png)
至此属性传值已完成——是不是很简单呀,确实很简单!!!
二、单例传值
说到单例传值,首先你需要明白一个概念——什么是单例模式
单例模式:单例模式就是只有一个实例,确保一个类只有一个实例,并且自行实例化并向整个系统提供这个实例,一个单例类可以实现在不同的窗口之间传递数据。
单例传值既可以使用系统中的单例类也可以使用自定义的单例类进行。
(一)、系统单例类传值
常用的系统单例类:
UIApplication (应用程序实例)
NSNotificationCenter (消息中心)
NSFileManager (文件管理)
NSUserDefaults (应用程序设置)
NSURLCache (请求缓存)
NSHTTPCookieStorage (应用程序cookies池);
1、传数据
![](https://i-blog.csdnimg.cn/blog_migrate/0fc0386053ee6ab3d6affac5af30e6fe.webp?x-image-process=image/format,png)
2、接收数据
![](https://i-blog.csdnimg.cn/blog_migrate/7c2b7106106d1eeb4b4cd81a5f94a54b.webp?x-image-process=image/format,png)
(二)、自定义单例类传值
创建一个SingleClass类,里面定义一个要传的值的属性,再声明一个share类方法,在类方法中用static定义类的实例变量,让它只初始化一次。
在oc中要实现一个单例类,至少需要做以下四个步骤:
1、为单例对象实现一个静态实例,并初始化,然后设置成nil。
2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例。
3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实例的时候产生的还是那个实例。
4、适当实现allocWitheZone,copyWithZone,release和autorelease。
![](https://i-blog.csdnimg.cn/blog_migrate/20952d3803e301f603ffe65a77f4aa59.webp?x-image-process=image/format,png)
这里还给大家介绍另外一种创建单例的方式:通过GCD创建单例
static SingleClass *singleClass = nil;
static dispatch_once_t onceToker;
_dispatch_once(&onceToker, ^{
singleClass = [[SingleClass alloc] init];
});
return singleClass;
传数据:
![](https://i-blog.csdnimg.cn/blog_migrate/6915558afc0f43efdd8ad1394e07d091.webp?x-image-process=image/format,png)
收数据:
![](https://i-blog.csdnimg.cn/blog_migrate/b4fd995266fb8ab3908d6edb6b439935.webp?x-image-process=image/format,png)
单例传值 —— GAME OVER!!!
三、代理传值
代理传值 ——通俗点来讲就是,自己不想干的事情你告诉别人方法让别人来代替你干。
现假设有A和B俩个控制器,B向A传值,可以分为以下六步:
1、首先在B的.h文件中声明协议和方法:
![](https://i-blog.csdnimg.cn/blog_migrate/9d15c7245583d8a41d7f0cc82457ad0a.webp?x-image-process=image/format,png)
2、在B的.h文件中声明一个协议属性:
![](https://i-blog.csdnimg.cn/blog_migrate/cf07e76468f4cfb2442750c7abe99466.webp?x-image-process=image/format,png)
3、在B即将POP回前一个界面的时候,在pop方法的上一行使用协议方法传递数据
[self.delegate 协议方法名称:(参数,也就是要传回的数据):
![](https://i-blog.csdnimg.cn/blog_migrate/ec08858ddf1ee9165b85a134568276b9.webp?x-image-process=image/format,png)
4、在A的.m中,在push到B界面的push方法之前,B对象的初始化之后,指定A对象为B对象的代理(B对象).delegate = self,调用下面方法的时候需要带上A的self
![](https://i-blog.csdnimg.cn/blog_migrate/47bb864187242a4cb9fc5f5665c6459b.webp?x-image-process=image/format,png)
5、在A的.h文件中导入协议<协议名称>
![](https://i-blog.csdnimg.cn/blog_migrate/7743d7aab81528e2e05ad97758373d6d.webp?x-image-process=image/format,png)
6、在A的.m文件中实现协议方法,刷新界面
![](https://i-blog.csdnimg.cn/blog_migrate/125dd05ef369d63cc0a94c673ce1619f.webp?x-image-process=image/format,png)
代理传值就此演示完毕!!!
四、block传值
block传值——首先你需要了解block是什么!(自己去查阅OC基础内容学习吧)
block传值和代理传值应用场景相似,都是从后向前传值。
block传值比代理传值方便简单,只需要你理解了很方便的,block传值过程大体分为以下三步:
1、这一步和协议有点类似,首先在B.h文件中定义声明一个block(注意用copy修饰block属性)
![](https://i-blog.csdnimg.cn/blog_migrate/09487b133b1b905bff92115925a03761.webp?x-image-process=image/format,png)
2、在B的.m的返回方法中调用block的方法
![](https://i-blog.csdnimg.cn/blog_migrate/9c1c1c15b8d0a61ef2f2776092cc38c9.webp?x-image-process=image/format,png)
3、在A的.m中创建B的实例的地方,为B的block属性赋值,也就是说,写好这个block中的内容,类似于给B的某一个属性赋初值
![](https://i-blog.csdnimg.cn/blog_migrate/1de0373c4a978905585ee9c6e0e160cf.webp?x-image-process=image/format,png)
没有引用局部变量的block内存存储在全局区
引用了局部变量的block内存存储在栈区
当对block进行copy操作的时候blcok的内存在堆区
注意:在ARC下使用weak修饰变量防止循环引用
链接一篇描述block回调挺有意思的文章:http://blog.csdn.net/mobanchengshuang/article/details/11751671
五、通知传值
现有A和B俩个控制器,B向A通过通知传值
1、首先在A控制器注册通知,监听通知
![](https://i-blog.csdnimg.cn/blog_migrate/f86ec033cb833e4d4b6961a479d1bbe4.webp?x-image-process=image/format,png)
2、B控制器发送通知
![](https://i-blog.csdnimg.cn/blog_migrate/f8dff218fe0b7ad60db8297495760890.webp?x-image-process=image/format,png)
3、A控制器监听到通知,接收通知,实现代理方法
![](https://i-blog.csdnimg.cn/blog_migrate/a37bde8763c45413dd5797148b4d9dfa.webp?x-image-process=image/format,png)
4、A控制器移除通知
-(void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}