//界面间的传值:
1、代理传值:(谁要值谁就是代理);
(1)在代理文件中,设置代理,并实现协议中的方法;
(2)在传值的界面中,拥有一个代理属性,并使用代理属性调用代理的方法;进行传值;
2、属性传值:谁需要值,就要在谁中,声明一个属性变量:来接受传入的值,并进行显示;
3、 block传值:(谁要值,就把block的实现写在谁那里)(与代理类似)
(1)将block声明称属性(注意:要用copy修饰)(原因:block函数分布在桟区,当我们在其他的页面中调用时,
有可能被系统释放,造成野指针的内存问题,使用copy将其复制到堆区,进行手动的管理,可以避免野指针访问的问题)
(以便在其他的界面中使用)与 调用(要传值的那个界面)
(2) //获取上一个页面的视图控制器 的对象;(数组)viewControllers
RootViewController * controller = (RootViewController *)self.navigationController.viewControllers[0];
(3)要注意block的方法体的实现与调用的顺序:为了避免在调用时, block方法为实现的问题,经常在调用时,使用[要传值界面的对象 view]的方式;
//block在使用的过程中会引起引用计数加 1 的问题,造成内存泄露(循环引用)的问题;
//当block中用到self,以及实例变量时,一般使用__block进行修饰,来避免引用计数+1 的问题;
//例如:
__block FirstViewController * firstVC = self;
firstVC.block = ^(NSString * text){
firstVC.title = text;
};
4、单例传值:单例的声明:给其添加一个同步锁;与此同时,要将其设置为一种静态变量:
//工程里面只有一个实例对象(与程序同寿),并且不能被释放,销毁;
//单例 的使用场景:
//1、音乐播放器;(切换时,音乐不会停止);
//2、当有多个页面需要共同资源,可以将次资源放入单例对象中;
//(1)获取单例对象;
// (2)再取出单例对象的值;
//方法名: 如果方法名以standarxxx; onlyxxxx; defaultxxx; sharedxxx;开头,则表示为获取单例对象的方法;返回值为对象;为类方法;
方式如下:假设单例类为:DataHandle;
+ (DataHandle *)sharedInstance{
//同步锁(为了避免多个线程同时访问同一个额资源,导致资源不同;)
static DataHandle * dataHandle = nil;
@synchronized(self){
if (dataHandle == nil ) {
dataHandle = [[DataHandle alloc] init];
[dataHandle readPlist];
}
}
return dataHandle ;
}
5、target…..action 传值:
(1)在传出段端要使用:[_target performSelector:_action withObject:self];
并声明相应的属性:(id)target (SEL)action;并在相应的方法中进行调用;
(2)在接收端:给相应的属性赋值,并实现action的方法;如:_touchView2.target1 = self; _touchView2.action1 = @selector(pan);
转载于:https://my.oschina.net/u/2447735/blog/501631