OC--单例模式

作者: 就怕是个demo | 来源:发表于2016-02-25 15:58 被阅读50次

    话不多说,同样是个人笔记。

    1、在头文件声明类方法
    #import <Foundation/Foundation.h>

    @interface Student : NSObject
    + (Student*) getInstance;
    @end
    

    2、在源文件中实现相应方法

    #import "Student.h"
    
    static Student* instance = nil;
    
    @interface Student()
    - (instancetype) init;
    @end
    
    @implementation Student
    + (Student*) getInstance {
        if (instance == nil) {
            instance = [[Student alloc]init];
        }
    
        return instance;
    }
    
    - (instancetype) init {
        return self;
    }
    
    //覆盖allocWithZone
    + (id) allocWithZone:(struct _NSZone *)zone {
        @synchronized(self) {
            if (!instance) {
                instance = [super allocWithZone:zone];//确保使用同一块内存地址
                return instance;
            }
        }
    
        return nil;
    }
    
    - (id) copyWithZone: (NSZone*)zone {
        return self;//确保copy对象也是唯一
    }
    @end
    

    3、调用

    Student* stu1 = [Student getInstance];
    Student* stu2 = [Student getInstance];
    Student* stu3 = [stu1 copy];
        
    NSLog(@"stu1 = %@", stu1);
    NSLog(@"stu2 = %@", stu2);
    NSLog(@"stu3 = %@", stu3);
    

    4、测试结果

    stu1 = <Student: 0x100503920>
    stu2 = <Student: 0x100503920>
    stu3 = <Student: 0x100503920>

    相关文章

      网友评论

      • ShawnDu:其实项目中没有写这么多的, oc中一般都是用
        + (AccountManager *)sharedInstance
        {
        static AccountManager *sharedAccountManagerInstance = nil;
        static dispatch_once_t predicate;
        dispatch_once(&predicate, ^{
        sharedAccountManagerInstance = [[self alloc] init];
        });
        return sharedAccountManagerInstance;
        }
        swift中,一般就一句话 static let sharedInstance = ConnectManager()
        就怕是个demo:@杜帅帅_shawn 但是还没普及。所以我还得搞OC
        ShawnDu:@疯狂的米老鼠 用swift还可以,比OC简洁多了
        就怕是个demo:@杜帅帅_shawn 谢谢你。我是用swift开发项目。现在反过来看看oc。其实写单例也并不只有一种方式。这个相对好理解些。再次谢谢你😄

      本文标题:OC--单例模式

      本文链接:https://www.haomeiwen.com/subject/gngikttx.html