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