单例模式
属性
代理
通知
某个类只产生一个对象,且是一个全局对象,以后每次创建该类对象时,只会得到第一次创建的那个类对象。
所以,可以用于在多视图场景下传递参数,原理如下图所示。

在创建单例类的时候,需要注意:
首先必须创建一个全局实例,通常存放在一个全局变量中,此全局变量设置为nil
需要重写+allocWithZone:方法,防止通过标准的alloc方式创建新的实例
需要重写-copyWithZone方法,防止通过copy方法得到新的实例
需要重写-mutableCopyWithZone:方法,防止通过copy方法得到新的实例
示例如下:
Singleton.h
@interface Singleton : NSObject <NSCopying, NSMutableCopying> @property (strong, nonatomic)NSString *value; //该属性可以被不同视图使用,传值依据 //单例方法 + (id)shareSingleton; @end
其中,继承NSCopying和NSMutableCopying协议是为了重写copyWithZone和mutableCopyWithZone方法
Singleton.m
static Singleton *instance = nil; //存在于整个程序生命周期
#pragma mark 单例方法
+ (id)shareSingleton{
if (nil == instance) {
instance = [[Singleton alloc]init];
}
return instance;
}
//重写allocWithZone:方法,防止通过标准的alloc方式创建新的实例
+(instancetype)allocWithZone:(struct _NSZone *)zone{
if (nil == instance) {
instance = [[super allocWithZone:zone]init];
}
return instance;
}
//重写copyWithZone:方法,防止通过copy方法得到新的实例
-(id)copyWithZone:(NSZone *)zone{
return self;
}
//重写mutableCopyWithZone:方法,防止通过copy方法得到新的实例
-(id)mutableCopyWithZone:(NSZone *)zone{
return self;
}
在A视图中赋值
//获取导航栏的大小 CGRect rectNav = nav.navigationBar.frame; //单例模式保存导航栏的高度 Singleton *singe = [Singleton shareSingleton]; singe.value = [NSString stringWithFormat:@"%f", rectNav.size.height];
在B视图中使用
Singleton *single = [Singleton shareSingleton]; CGRect frame = CGRectMake(0, 5+single.value.floatValue, self.frame.size.width, 200);
原文:http://my.oschina.net/u/2392723/blog/476791