obejec-c单例类宏

来源:互联网 发布:mac移动硬盘安装win10 编辑:程序博客网 时间:2024/06/07 18:06

在使用object-c编程的时候,常常需要使用单例类来访问全局变量,每次重写都比较麻烦,有了宏就好多了

#import <objc/runtime.h>
#define CWL_DECLARE_SINGLETON_FOR_CLASS_WITH_ACCESSOR(classname, accessorMethodName) \+ (classname *)accessorMethodName;#if __has_feature(objc_arc)#define CWL_SYNTHESIZE_SINGLETON_RETAIN_METHODS#else#define CWL_SYNTHESIZE_SINGLETON_RETAIN_METHODS \- (id)retain \{ \return self; \} \\- (NSUInteger)retainCount \{ \return NSUIntegerMax; \} \\- (oneway void)release \{ \} \\- (id)autorelease \{ \return self; \}#endif
//实现单例类#define CWL_SYNTHESIZE_SINGLETON_FOR_CLASS_WITH_ACCESSOR(classname, accessorMethodName) \\static classname *accessorMethodName##Instance = nil; \\+ (classname *)accessorMethodName \{ \@synchronized(self) \{ \if (accessorMethodName##Instance == nil) \{ \accessorMethodName##Instance = [super allocWithZone:NULL]; \accessorMethodName##Instance = [accessorMethodName##Instance init]; \method_exchangeImplementations(\class_getClassMethod([accessorMethodName##Instance class], @selector(accessorMethodName)),\class_getClassMethod([accessorMethodName##Instance class], @selector(cwl_lockless_##accessorMethodName)));\method_exchangeImplementations(\class_getInstanceMethod([accessorMethodName##Instance class], @selector(init)),\class_getInstanceMethod([accessorMethodName##Instance class], @selector(cwl_onlyInitOnce)));\} \} \\return accessorMethodName##Instance; \} \\+ (classname *)cwl_lockless_##accessorMethodName \{ \return accessorMethodName##Instance; \} \\+ (id)allocWithZone:(NSZone *)zone \{ \return [self accessorMethodName]; \} \\- (id)copyWithZone:(NSZone *)zone \{ \return self; \} \- (id)cwl_onlyInitOnce \{ \return self;\} \\CWL_SYNTHESIZE_SINGLETON_RETAIN_METHODS#define CWL_DECLARE_SINGLETON_FOR_CLASS(classname) \CWL_DECLARE_SINGLETON_FOR_CLASS_WITH_ACCESSOR(classname, shared##classname)#define CWL_SYNTHESIZE_SINGLETON_FOR_CLASS(classname) \CWL_SYNTHESIZE_SINGLETON_FOR_CLASS_WITH_ACCESSOR(classname, shared##classname)

使用很方便,在头文件中使用

CWL_DECLARE_SINGLETON_FOR_CLASS(MyClass)

在实现文件中

CWL_SYNTHESIZE_SINGLETON_FOR_CLASS(MyClass)
	
				
		
原创粉丝点击