博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OC 单例模式
阅读量:5783 次
发布时间:2019-06-18

本文共 2443 字,大约阅读时间需要 8 分钟。

hot3.png

一.单例模式的特点

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;

}

转载于:https://my.oschina.net/u/2483162/blog/527606

你可能感兴趣的文章
runtime运行时 isa指针 SEL方法选择器 IMP函数指针 Method方法 runtime消息机制 runtime的使用...
查看>>
LeetCode36.有效的数独 JavaScript
查看>>
Scrapy基本用法
查看>>
PAT A1030 动态规划
查看>>
自制一个 elasticsearch-spring-boot-starter
查看>>
软件开发学习的5大技巧,你知道吗?
查看>>
【人物志】美团前端通道主席洪磊:一位产品出身、爱焊电路板的工程师
查看>>
一份关于数据科学家应该具备的技能清单
查看>>
机器学习实战_一个完整的程序(一)
查看>>
Web框架的常用架构模式(JavaScript语言)
查看>>
如何用UPA优化性能?先读懂这份报告!
查看>>
这些Java面试题必须会-----鲁迅
查看>>
Linux 常用命令
查看>>
NodeJS 工程师必备的 8 个工具
查看>>
CSS盒模型
查看>>
ng2路由延时加载模块
查看>>
使用GitHub的十个最佳实践
查看>>
脱离“体验”和“安全”谈盈利的游戏运营 都是耍流氓
查看>>
慎用!BLEU评价NLP文本输出质量存在严重问题
查看>>
基于干净语言和好奇心的敏捷指导
查看>>