OC设计模式中的单例模式

单例模式的特点:(1)只有一个对象(2)相当于一个全局变量 (3)可以多个对象使用(相当于多个指针指向了这一个对象)
单例模式的优点: 1.实例控制:会阻止其他对象实例化自己的单例对象的副本,从而确保所有对象都访问唯一实例
2.灵活性:因为类控制了实例化过程,所以类可以更灵活更改实例化过程
单例模式的缺点: 一:开销 
每次对象请求引用的时候都要检查一次是否存在类的实例,会增加内存,可以通过静态初始化的方法来解决
二:可能的开发混淆
使用单例对象的时候 ,不能以new关键字实例化对象 使用new关键字无法实例化这个类
三:对象生存期 
无会被轻易释放,要谨慎使用!

实现:
(1)创建一个类(2)在实现文件证明一个全局变量(3)封装一个实例化单例对象的方法,这是以一个类方法,判断全局变量是否为空最终保证对象性的唯一性(4)接口文件中声明封装的方法(5)引入特殊类的头文件(6)通过封装的实例化单例对象的方法实例化出对象。
单例对象:(1)可以有多个指针指向(2)单例对象可以传值

#import <Foundation/Foundation.h>

#import "Person.h"

#import "Theme.h"

#import "Moblie.h"




int main(int argc, const char * argv[]) {

    @autoreleasepool {

        // insert code here...

        NSLog(@"Hello, World!");

        //一般对象实例化的过程

        Person *newPerson=[[Person alloc]init];

        

        //利用了我们自己封装的方法实例化的对象,这时的对象叫单例对象

        Person *person=[Person sharePerson];

        //利用了我们自己封装的方法实例化的对象,这时的对象叫单例对象

        Person *personI=[Person sharePerson];

        //利用了我们自己封装的方法实例化的对象,这时的对象叫单例对象

        Person *personII=[Person sharePersonI];

//        对一个单例对象进行属性赋值

        personII.name=@"xiaoMing";

        personII.age=10;

        

        Person *personIII=[Person sharePersonI];

//        虽然换一个指针仍是之前的对象,修改属性值后两个指针找到的属性都会改变

        personIII.name=@"xiaoXiaoMing";

        

        NSLog(@"personII name:%@  personII age :%i      personIII name:%@  personIII age :%i",personII.name,personII.age,personIII.name,personIII.age);

        

//        NSLog(@"newPerson:%p  person:%p   personI:%p",newPerson,person,personI);

        NSLog(@"newPerson:%p  personII:%p  personIII:%p",newPerson,personII,personIII);

    

        Theme *theme=[[Theme alloc]init];

        NSMutableArray *muArray=[[NSMutableArray alloc]initWithCapacity:10];

        [muArray addObjectsFromArray:@[@"浅蓝",@"灰色"]];

        NSLog(@"%@",muArray[0]);

        theme.color=muArray;

        Moblie *phone=[[Moblie alloc]init];

//    通过单例传值

        phone.moblieColor=theme.color[0];

        NSLog(@"手机的主题颜色:%@",phone.moblieColor);

        

        NSArray *array=@[@"1",@"11",@"14",@"2"];

        NSComparisonResult (^sort)( id ,id ) = ^( id object1 , id object2 ){0

            return [object1 compare:object2];

        };

        

//        NSArray *sortArray=[array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {

//            return [obj1 compare:obj2];

//        }];

        NSArray *arratS=[array sortedArrayUsingComparator:sort];

      

        NSLog(@"%@",arratS);

        

        [person setBlock:^(NSString *name) {

            person.name=name;

        }];

        person.blockTest(@"jack");

        NSLog(@"person name:%@",person.name);

        

        //-------复习代码块

         __block int q=9;

        //无返回无参数的代码块;

        void (^my_block)(void);//声明

        my_block=^(void){

            q=q-6;

           

        };//定义

        my_block();//调用

        NSLog(@"%i",q);

        

        //有返回值有参数的

        int (^block)( double , double ) = ^(double num1, double num2){

            return (int)num1 + (int)num2;

        };

        NSLog(@"%i", block(2,4));

        

        //构造块:

        typedef int (^add_block) (int,int);

        add_block addMethod=^(int num , int num1){

            return num1+num;

            

        };

        int sum=addMethod(2,3);

        NSLog(@"%i",sum);

        

        //静态块,在递归调用时使用

        static int (^blockI) ( void )=^{

            return 1;

        };

        

        //-------设计模式--(单例模式)

//        特点:(1)只有一个对象(2)相当于一个全局变量 3)多个对象使用

//        实现:

//        1)创建一个类(2)在实现文件证明一个全局变量(3)封装一个实例化单例对象的方法,这是以一个类方法,判断全局变量是否为空最终保证对象性的唯一性(4)接口文件中声明封装的方法(5)引入特殊类的头文件(6)通过封装的实例化单例对象的方法实例化出对象。

//        单例对象:(1)可以有多个指针指向(2)单例对象可以传值

        

//        注意:单例对象不会轻易被释放,谨慎使用

        

        

    //代码块练习:字符串编码:利用代码块将字符串@“apple”变化为@“abpqpqlmef”

//        单例练习:建立Son类,有属性motherNamefatherName,单例传值给父亲对象和母亲你、对象

        

    }

    return 0;

}





//

//  Theme.h

//  单例模式

//

//  Created by 非凡 程序员 on 15/11/4.

//  Copyright (c) 2015 非凡 程序员. All rights reserved.

//


#import <Foundation/Foundation.h>


@interface Theme : NSObject

@property(nonatomic,strong)NSMutableArray *color;

+(id)shareTheme;

@end



//

//  Moblie.h

//  单例模式

//

//  Created by 非凡 程序员 on 15/11/4.

//  Copyright (c) 2015 非凡 程序员. All rights reserved.

//


#import <Foundation/Foundation.h>


@interface Moblie : NSObject

@property(nonatomic,strong)NSString *moblieColor;

@end


//

//  Moblie.m

//  单例模式

//

//  Created by 非凡 程序员 on 15/11/4.

//  Copyright (c) 2015 非凡 程序员. All rights reserved.

//


#import "Moblie.h"


@implementation Moblie


@end


//

//  Theme.m

//  单例模式

//

//  Created by 非凡 程序员 on 15/11/4.

//  Copyright (c) 2015 非凡 程序员. All rights reserved.

//


#import "Theme.h"


@implementation Theme

static id themeObject;

+(id)shareTheme{

    if (themeObject==nil) {

        themeObject=[[self alloc]init];

    }

    return themeObject;

}

@end



//

//  Person.h

//  单例模式

//

//  Created by 非凡 程序员 on 15/11/4.

//  Copyright (c) 2015 非凡 程序员. All rights reserved.

//


#import <Foundation/Foundation.h>

typedef void (^Block)(NSString *);

@interface Person : NSObject


@property(nonatomic,strong)NSString *name;

@property(nonatomic,assign)int age;

@property(nonatomic,strong)Block blockTest;

-(void)setBlock:(Block)block;

//定义实例化单例对象的方法一:以Person类指针作为返回值

+ ( Person * ) sharePersonI ;

//定义实例化单例对象的方法二:以id类型(对象类型)作为返回值,这里的id类型指Person类的对象

+ ( id ) sharePerson ;

@end


//

//  Person.m

//  单例模式

//

//  Created by 非凡 程序员 on 15/11/4.

//  Copyright (c) 2015 非凡 程序员. All rights reserved.

//


#import "Person.h"


@implementation Person

//先定义全局变量

static Person *person=nil;

//Person类指针作为返回值实现实例化单例对象的方法

+(Person *)sharePersonI{

//    判断指针指向的地址为空

    if (person==nil) {

//        如果指针没有指向有效的内存地址,就需要实例化对象

        person=[[self alloc]init];

    }

//    返回新实例化的对象(当没有对象时)或者已有的对象

    return person;

}

//先定义全局变量

static id singlePerson;

//:以id类型(对象类型)作为返回值,这里的id类型指Person类的对象定义实例化单例对象的方法

+(id)sharePerson{

    //    判断指针指向的地址为空

    if (singlePerson==nil) {

        //        如果指针没有指向有效的内存地址,就需要实例化对象

        singlePerson=[[self alloc]init];

    }

    //    返回新实例化的对象(当没有对象时)或者已有的对象

    return singlePerson;

}

-(void)setBlock:(Block)block{

    self.blockTest=block;

}

//检查对象是否被释放。将检查发现单例对象没有被释放

-(void)dealloc{

    NSLog(@"person 释放");

}

@end


转载于:https://my.oschina.net/u/2499773/blog/525945

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值