一.单例模式的特点
1.相当于一个全局变量
2.只有一个对象
3.多个对象可以同时使用一个类属性
二.单例模式的优点
1.可更改实例化过程
2.确保了所有对象都访问唯一实例对象
三.单例模式的缺点
实例化出来的是单例对象 无法被释放
四.单例的写法
//定义了一个静态的全局变量,当第一次调用类方法时,全局变量为空,此时进入判断进行初始化得到第一个对象 接着再次调用时全局变量已经不为空 因此不会进入判断进行实例化 此时直接返回第一次实例化的对象 所以不管调用几次类方法 只有第一次进入判断进行对象的实例化 以后返回的都是同一个对象 这就是单例
static id color;
+(id)shareColor
{
if (color == nil) {
color = [[self alloc]init];
}
return color;
}
//创建一个单例对象
colorSubject *subject = [colorSubject shareColor];
//创建一个可变数组
NSMutableArray *array = [[NSMutableArray alloc]init];
//给可变数组添加元素
[array addObjectsFromArray:@[@"红色",@"绿色",@"蓝色",@"黄色"]];
//给类的数组属性设置array值
subject.colorArray = array;
Phone *phone = [[Phone alloc]init];
//单例传值
phone.phoneColor = subject.colorArray[2];
NSLog(@"手机颜色:%@",phone.phoneColor);
复习代码块得到的知识点
1.代码块也可以作为类的属性进行设置
在类的.h文件中先声明并写set方法
#import <Foundation/Foundation.h>
typedef void (^Block)(NSString *);
@interface Person : NSObject
@property(nonatomic,strong)Block blockTest;
-(void)setBlock:(Block)block;
2.在.m文件中实现
-(void)setBlock:(Block)block{
self.blockTest=block;
}
3.在主函数中设置
[person setBlock:^(NSString *name) {
personI.name=name;
}];
person.blockTest(@"jack");
NSLog(@"person name:%@",personI.name);
具体实例
有手机和主题两个类 手机有主题色属性 通过主题类给手机设置主题色
Phone.h:
#import <Foundation/Foundation.h>
@interface Phone : NSObject
@property(nonatomic,strong) NSString *phoneColor;
@end
Phone.m
#import "Phone.h"
@implementation Phone
@end
ColorSubject.h
#import <Foundation/Foundation.h>
@interface colorSubject : NSObject
@property(nonatomic,strong) NSMutableArray *colorArray;
+(id) shareColor;
@end
ColorSubject.m
#import "colorSubject.h"
@implementation colorSubject
static id color;
//定义了一个静态的全局变量,当第一次调用类方法时,全局变量为空,此时进入判断进行初始化得到第一个对象 接着再次调用时全局变量已经不为空 因此不会进入判断进行实例化 此时直接返回第一次实例化的对象 所以不管调用几次类方法 只有第一次进入判断进行对象的实例化 以后返回的都是同一个对象 这就是单例
+(id)shareColor
{
if (color == nil) {
color = [[self alloc]init];
}
return color;
}
@end
main.m
#import <Foundation/Foundation.h>
#import "colorSubject.h"
#import "Phone.h"
int main(int argc, const char * argv[]) {
//创建一个单例对象
colorSubject *subject = [colorSubject shareColor];
//创建一个可变数组
NSMutableArray *array = [[NSMutableArray alloc]init];
//给可变数组添加元素
[array addObjectsFromArray:@[@"红色",@"绿色",@"蓝色",@"黄色"]];
//给类的数组属性设置array值
subject.colorArray = array;
NSLog(@"%@",subject.colorArray);
Phone *phone = [[Phone alloc]init];
//单例传值
phone.phoneColor = subject.colorArray[2];
NSLog(@"手机颜色:%@",phone.phoneColor);
return 0;
}