oc85--利用宏定义简化单例

本文介绍了一种在Objective-C中实现单例模式的方法,利用宏定义简化代码,并支持ARC和MRC两种内存管理模式。通过定义宏interfaceSingleton和implementationSingleton,可以方便地创建单例对象。

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

复制代码
//Singleton.h

// 以后就可以使用interfaceSingleton来替代后面的方法声明。    \表示下一行也是上一行的内容。

#define interfaceSingleton(name)  +(instancetype)share##name


#if __has_feature(objc_arc)

//ARC编译这段

#define implementationSingleton(name)  \
+ (instancetype)share##name \
{ \
name *instance = [[self alloc] init]; \
return instance; \
} \
static name *_instance = nil; \
+ (instancetype)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [[super allocWithZone:zone] init]; \
}); \
return _instance; \
} \
- (id)copyWithZone:(NSZone *)zone{ \
return _instance; \
} \
- (id)mutableCopyWithZone:(NSZone *)zone \
{ \
return _instance; \
}
#else

// MRC,编译这段。

#define implementationSingleton(name)  \
+ (instancetype)share##name \
{ \
name *instance = [[self alloc] init]; \
return instance; \
} \
static name *_instance = nil; \
+ (instancetype)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [[super allocWithZone:zone] init]; \
}); \
return _instance; \
} \
- (id)copyWithZone:(NSZone *)zone{ \
return _instance; \
} \
- (id)mutableCopyWithZone:(NSZone *)zone \
{ \
return _instance; \
} \
- (oneway void)release \
{ \
} \
- (instancetype)retain \
{ \
return _instance; \
} \
- (NSUInteger)retainCount \
{ \
return  MAXFLOAT; \
}
#endif
复制代码
复制代码
//
//  Tools.h

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

@interface Tools : NSObject<NSCopying, NSMutableCopying>

// share + 当前的类名
//+ (instancetype)shareTools;

interfaceSingleton(Tools);  ////用Singleton.h里面的内容替换。

@end
复制代码
复制代码
//
//  Tools.m


#import "Tools.h"

@implementation Tools

/*
+ (instancetype)shareTools
{
    Tools *instance = [[self alloc] init];
    return instance;
}

static Tools *_instance = nil;
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [[super allocWithZone:zone] init];
    });
    return _instance;
}


- (id)copyWithZone:(NSZone *)zone{

    return _instance;
}

- (id)mutableCopyWithZone:(NSZone *)zone
{
    return _instance;
}

// MRC
- (oneway void)release
{

}

- (instancetype)retain
{
    return _instance;
}

- (NSUInteger)retainCount
{
    return  MAXFLOAT;
}
*/

implementationSingleton(Tools)   ////用Singleton.h里面的内容替换。

@end
复制代码
复制代码
//
//  Person.h
//

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

@interface Person : NSObject

interfaceSingleton(Person);   ////用Singleton.h里面的内容替换。

@end
复制代码
复制代码
//
//  Person.m


#import "Person.h"

@implementation Person

implementationSingleton(Person)    //用Singleton.h里面的内容替换。

@end
复制代码
复制代码
//
//  main.m
//  宏定义抽取单例,宏定义本质是替换,简化代码,用公用的代码进行替换。
//

#import <Foundation/Foundation.h>
#import "Tools.h"
#import "Person.h"

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

    
    Tools *t1 = [[Tools alloc] init]; //内部会调用allocWithZone
    Tools *t2 = [Tools new];// [[alloc] init]  allocWithZone
    Tools *t3 = [Tools shareTools];
    
    Tools *t4 = [t3 copy];
    Tools *t5 = [t3 mutableCopy];
    
    NSLog(@"%p, %p, %p, %p, %p", t1, t2, t3, t4, t5);//0x100300120, 0x100300120, 0x100300120, 0x100300120, 0x100300120
    
    Person *p1 = [Person sharePerson];
    Person *p2 = [Person sharePerson];
    Person *p3 = [Person sharePerson];
    
    NSLog(@"%p, %p, %p", p1 , p2, p3);//0x100202460, 0x100202460, 0x100202460
    
    
    // 如何判断当前是ARC还是MRC?
    // 可以在编译的时候判断当前是否是ARC
    #if __has_feature(objc_arc)
        NSLog(@"ARC");
    #else
        NSLog(@"MRC");
    #endif
    return 0;
}
复制代码

 


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/7443802.html,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值