单例模式
属性
代理
通知
单例模式
某个类只产生一个对象,且是一个全局对象,以后每次创建该类对象时,只会得到第一次创建的那个类对象。
所以,可以用于在多视图场景下传递参数,原理如下图所示。
与C++不一样,使用ObjectiveC创建单例类的时候,需要注意:
首先必须创建一个全局实例,通常存放在一个全局变量中,此全局变量设置为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);