单例模式

来源:互联网 发布:3000元左右手机 知乎 编辑:程序博客网 时间:2024/06/05 04:10



创建一个学生类

在Student.h里

#import <Foundation/Foundation.h>@interface Student : NSObject@property (copy,nonatomic) NSString * name;@property (assign,nonatomic) int age;+(Student *) getInstance;@end

Student.m实现类

#import "Student.h"@implementation Student//1、创建一个全局实例,并且初始化为nilstatic Student * stu=nil;//2、实现工厂方法,然后返回单一一个对象+(Student *)getInstance{    if (stu==nil) {        stu = [[Student alloc]init];    }    return stu;    //是否需要autorelease?不用,因为全局使用的单例不需要释放}//3、为了防止alloc或new来创建新的实例,需要重写allocWithZone方法+(id)allocWithZone:(struct _NSZone *)zone{    if (stu==nil) {        stu = [[super allocWithZone:zone]init];    }    return stu;}//4、为了防止copy创建新的实例,重写copyWithZone-(id)copyWithZone:(NSZone *)zone{    return self;}//5.1、重写retainCount方法,防止被dealloc,此方法中返回最大值-(NSUInteger)retainCount{    return NSUIntegerMax;}//5.2、重写retain方法,因为单例不释放,所以引用计数器变化没有意义。-(id)retain{    return self;}//5.3重写release方法,因为单例不释放,所以引用计数器变化没有意义。-(oneway void)release{    }//5.4 重写autorelease方法,因为单例不释放-(id)autorelease{    return self;}@end



在Main函数里测试一下

#import <Foundation/Foundation.h>#import "Student.h"int main(int argc, const char * argv[]){    @autoreleasepool    {        Student * s1 = [[Student alloc]init];        Student * s2 = [Student getInstance];        Student * s3 = [Student getInstance];        Student * s4 = [s3 copy];        NSLog(@"%p",s1);        NSLog(@"%p",s2);        NSLog(@"%p",s3);        NSLog(@"%p",s4);    }    return 0;}

以上是一个安全的单例模式,不安全单例只需要创建一个全局静态实例和提供工厂方法对该全局实例进行访问。

0 0
原创粉丝点击