OC程序设计中的单例模式

来源:互联网 发布:数据库有5个事务 编辑:程序博客网 时间:2024/06/03 02:54
在程序设计中,我们有时候只需要程序在一段时间里只返回一个对象,但是这个对象不是固定的。正如在一段时间里,在职的国家主席永远只有一个一样。而单例模式就是为了做核心控制,一次只开辟一块内存,这块内存可以反复使用,从而减少对内存的使用。
单例方法:+(id)非类名起始 ,注意与便利构造器的调用类方法的区别,调用类方法的起始名以类名开始
下面的代码是一个最简单的单例模式
1.声明文件(.h):

#import 


@interface Student : NSObject

@property(retain,nonatomic) NSString*name;


//声明一个名为sharedStudent的单例方法

+(id) sharedStudent;


@end


2.实现文件(.m):

#import "Student.h"


@implementation Student

@synthesize name;


static Student *singleton;//声明一个静态变量的指针类型singleton


+(id) sharedStudent

{

    @synchronized(self)//同步代码段,表示同一时间只允许一个线程访问

    {

        if (singleton==nil)

        {

            singleton=[[Student alloc]init];

        }

    }

    return singleton;

}


@end



3.主函数:

#import 

#import "Student.h"//引入头文件


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

{


    @autoreleasepool {

        

        Student *st1=[Student sharedStudent];

        st1.name=@"007";

        NSLog(@"name1=%@",st1.name);//输出:name1=007


        

        Student *st2=[Student sharedStudent];

        st2.name=@"尼奥";

        NSLog(@"name2=%@",st2.name);//输出:name2=尼奥

        

        Student *st3=[Student sharedStudent];

        st3.name=@"蝙蝠侠";

        NSLog(@"name3=%@",st2.name);//输出:name3=蝙蝠侠 why??我打印的是st2.name,为什么结果是st3.name的值呢?

      内存分析:首先,我们定义的是static类型的指针类型的变量singleton,既然是指针,编译器为singleton开辟的一块内存,内存里面存的是指针的地址,因为是存的地址,所以给变量赋值时,地址里面的内容变了,但指针的地址是不会变的,所以我们不管我们打印哪个变量的值,其结果都是最后一次给变量赋的值,因为我们在开辟内存时,是同一块内存地址,也就是同一块内存,内存里面的内容可以变,但地址是不会变的。  

             

    }

    return 0;

}

0 0
原创粉丝点击