Objective-C 单例

<pre name="code" class="objc">单例模式就是只有一个实例,确保一个类只有一个实例,并且自行实例化并向整个系统提供这个实例,一个单例类可以实现在不同的窗口之间传递数据。

在oc中要实现一个单例类,至少需要做以下四个步骤:

1、为单例对象实现一个静态实例,并初始化,然后设置成nil,

2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例,

3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例,

4、再写一个copyWithZone 防止其他人copy 生成新的实例。

 
/**
 *  Student.h文件
 *
 */
#import <Foundation/Foundation.h>

@interface Student : NSObject

//在要设计成单例类的 .h 文件声明一个构造的单例方法
+ (Student *)sharedStudent;

@end
/**
 *  Student.m 文件
 */
#import "Student.h"
//声明一个静态实例对象 只能执行一次
static Student *stu = nil;

@implementation Student

+ (Student *)sharedStudent
{
    if (stu == nil) {
        stu = [[Student alloc] init];
    }
    return stu;
}


//为了防止 allco 或 new 创建实例变量
+ (id)allocWithZone:(struct _NSZone *)zone
{
    //@synchronized(self){}  这叫锁令牌。这里可以解决线程问题。可以理解为不管谁来了都要排队
    @synchronized(self) {
        if (stu == nil) {
            stu = [super allocWithZone:zone];
        }
        return stu;
    }
}


//防止copy
- (id)copyWithZone:(NSZone *)zone
{
    return self;
}
@end



/**
 *  main.m
 *
 */

#import <Foundation/Foundation.h>
#import "Student.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        /*
         设计模式:(用来解决编程某些特定的问题)
         单例模式
                什么时候使用单例
                在一个工程中。一些类只需要一个实例变量,我们就可以这些类定义成单例模式
         单例模式的实现思路:一个类只能创建一个实例个一个获得实例方法
         
         */
        Student *student1 = [Student sharedStudent];
        Student *student2 = [[Student alloc] init];
        if (student1 == student2) {
            NSLog(@"YES");
        }
        
        Student *student3 = [student2 copy];
        if (student2 == student3) {
            NSLog(@"YES");
        }
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值