Objective-C中的单例模式

本文介绍了一种使用Objective-C实现单例模式的方法,并通过具体的示例代码展示了如何在实际项目中正确使用单例模式来管理全局状态。文章还探讨了如何避免常见的陷阱,如过度共享资源导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单例类:ApplicationContext.h文件

#import <Foundation/Foundation.h>

@interface ApplicationContext : NSObject<NSCopying>
@property (nonatomic,copy) NSString *userName;
@property (nonatomic,copy) NSString *passWord;
@property (nonatomic,copy) NSMutableDictionary *dictData;

+(id)shareApplicationContext;
@end


单例类:ApplicationContext.m文件

#import "ApplicationContext.h"

static ApplicationContext *appcationContext =nil;
@implementation ApplicationContext

//自定义的一个类方法
+(id)shareApplicationContext{

    NSLog(@"share:appcationContext = %@",appcationContext);
    //判断当前类的实例是否为空,如果为空了,创建
    if(appcationContext == nil){
        //实例化当前的类的对象
        appcationContext = [[[self class] alloc] init];
        return appcationContext;
        
    }
    //否则直接返回
    return appcationContext;
}

//覆盖父类的alloc方法
+ (id)allocWithZone:(struct _NSZone *)zone{
    NSLog(@"alloc:appcationContext = %@",appcationContext);
    //判断当前类的实例是否为空,如果为空了,创建
    if(appcationContext == nil){
    
        NSLog(@"对象第一次被创建~");
        //实例化当前的类的对象
        appcationContext = [super allocWithZone:zone];
        return appcationContext;
    }
    //否则直接返回
    return appcationContext;
}

//覆盖copy方法,防止copy此对象产生新的实例
- (id)copyWithZone:(NSZone *)zone{

    NSLog(@"copy");
    return self;

}

//也不让修改引用计数
-(id)retain{
    return appcationContext;
}
//永远返回最大的整数
-(NSUInteger)retainCount{
    //返回最大整数
    return UINT_MAX;
}

//覆盖autorelease方法
-(id)autorelease{

    return appcationContext;
}

//覆盖release方法
-(oneway void)release{
    

}


- (void)dealloc
{
    [_userName release];
    [_passWord release];
    [_dictData release];
    [super dealloc];
}

@end


测试类:main.m文件


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

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

    @autoreleasepool {
        
        //实例化单例的类
        ApplicationContext *appContext = [ApplicationContext shareApplicationContext];
        appContext.userName =@"admin";
        appContext.passWord =@"123456";
        //先定义一个字典
        NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"v1",@"k1",@"v2",@"k2", nil];
        [dict setValue:@"v3" forKey:@"k3"];
        //设置字典
        appContext.dictData = dict;
        
//        //实例化单例的类
//        ApplicationContext *appContext2 = [ApplicationContext shareApplicationContext];
//        ApplicationContext *appContext3 = [[ApplicationContext alloc] init];
//        ApplicationContext *appContext4 = [appContext copy];
//        
//        NSLog(@"appContext4 %@",appContext3.userName);
        
        Person *p = [[Person alloc] init];
        p.pid = 1234;
        [p test];
        
        NSLog(@"username : %@",appContext.userName);
        
        
        Student *stu = [[Student alloc] init];
        stu.sid = 45678;
        [stu stuTest];
        
        
    }
    return 0;
}

测试类:Person.h文件


#import <Foundation/Foundation.h>

@interface Person : NSObject
@property (nonatomic,assign) int pid;
-(void)test;
@end


测试类:Person.m文件

#import "Person.h"
#import "ApplicationContext.h"

@implementation Person
-(void)test{

    NSLog(@"person id :%d",_pid);
    ApplicationContext *appContext1 = [[ApplicationContext alloc] init];
    NSLog(@"person name :%@,password = %@",appContext1.userName,appContext1.passWord);
    
    //appContext1.dictData 从单例模式的类中获取的
    NSMutableDictionary *dict2 = appContext1.dictData;
    //重新修改字典的内容
    //[dict2 setValue:@"new" forKey:@"k4"];
    appContext1.userName  = @"person";
    
    NSLog(@"dictdata %@",dict2);

}
@end


测试类:Student.h文件

#import <Foundation/Foundation.h>

@interface Student : NSObject
@property int sid;
-(void)stuTest;
@end


测试类:Student.m文件

#import "Student.h"
#import "ApplicationContext.h"

@implementation Student
-(void)stuTest{

    NSLog(@"stu id :%d",_sid);
    ApplicationContext *appContext = [ApplicationContext shareApplicationContext];
    NSLog(@"student username :%@",appContext.userName);


}
@end




资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简的Pipeline脚本示: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值