单例模式(singleton)
单例模式(singleton)
木木情深 发表于4年前
单例模式(singleton)
  • 发表于 4年前
  • 阅读 74
  • 收藏 4
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

摘要: 主要作用:多个对象之间共享数据。(貌似和浅拷贝有点像,呵呵。。。。。)

1. 主要作用:多个对象之间共享数据。(貌似和浅拷贝有点像,呵呵。。。。。

2. 主要特点:

    1).单例就是C中的全局变量

    2).在整个程序生命周期内,该对象只有一份存在内存中。

    3).单例对象在创建时,不要使用alloc 来创建。

    4).可以在多个对象之间共享数据。

3. 示例:皮肤主题的更换(确定的主题这一对象是唯一的,只是内容在变);UIDevice对象(可取得手机的序列号,版本等等);

主题共享代码实现:

ThemeManage.m文件:

static id sharedMyManager;

+(id)sharedThemeManage

{

    if(sharedMyManager == nil)

    {

        //第一次调用sharedMyManager 把存入全局变量中

        sharedMyManager = [[[self class] alloc]init];      

    }

    return sharedMyManager;

}

调用方法:

//创建单例对象

ThemeManage *theme = [ThemeManage sharedThemeMyManager];

//修改单例对象属性

theme.name = @"how are you";

NSLog(@"theme.name = %@",theme.name);

ThemeManage *theme1 = [ThemeManage sharedThemeMyManager];

NSLog(@"theme is %p,theme1 is %p",theme,theme1);


theme1.name = @"Nice to meet you";

NSLog(@"theme.name = %@,theme1.name = %@",theme.name,theme1.name);

输出结果:  theme.name = how are you

            theme is 0x1001004f0,theme1 is 0x1001004f0

            theme.name = Nice to meet you,theme1.name = Nice to meet you

1) 说明:1.单例对象不管建立多少次,内存地址都是唯一的

      2.正因为1的结论,我们同过单例才可以共享数据,修改 theme1的变量属性时,theme 的变量属性页跟着一起被改变

2) 缺点:两个线程同时调用时,会同时进入,导致内存泄露,优化方案:

    方案一:Lock free (免锁)

            +(voidq)initialize

            {

                static BOOL initialized = NO;

                if(initialized == NO)

                {

                    initialized = YES;

                    sharedMyManager = [[self alloc]init];

                }

            }

    方案二:GCD ( center dispath)dispatch_once保证block 只能执行一次

         +(id)sharedManager

        {

            static dispatch_once_t once;

            dispatch_once(&once,^{

                sharedMyManager = [[self alloc]init];

            });

            return sharedMyManager;

        }

    方案三:@synchronized(self) 保证这段代码处于atomic状态,即多个线程进入这段代码时,这段代码只能被一个线程执行

        +(id)sharedThemeManager

        {

            @synchronized(self)

            {

                if(sharedMyManager == nil)

                {

                    sharedMyManager = [[[self class] alloc]init];      

                }

                return sharedMyManager;

            }

        }

    方案四:完全的单例,需要重写以下方法

        //alloc 时需要调用

        +(id)allocWithZone:(NSZone *)zone

        {

             return [[self sharedThemeManager] retain];  

         }

        //copy 时需要调用

        +(id)copyWithZone:(NSZone *)zone

        {

            return self;

        }

        -(id)retain

        {

            return self;

        }

        -(oneway void)release

        {

            

        }

        -(MSUInteger)retainCount

        {

            return UINT_MAX;

        }

        -(id)autorelease

        {

            return self;

        }

说明:完全写法可以保证以下的创建单例对象写法,也可以成功的创建全局唯一的一个变量

        ThemeManage *theme2 = [[ThemeManage alloc]init];

        ThemeManage *theme3 = [theme2 copy];

4)


标签: singleton
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 37
博文 186
码字总数 26451
×
木木情深
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: