调试发现
AppShareDataManager *A = [[AppShareDataManager alloc] init];
NSLog(@"A:%@",A);
AppShareDataManager *B = [AppShareDataManager sharedManager];
NSLog(@"B:%@",B);
打印出的是
2013-02-28 23:27:25.368 ZON2012[10647:c07] A:<AppShareDataManager: 0x12638630>
2013-02-28 23:27:25.369 ZON2012[10647:c07] B:<AppShareDataManager: 0xb584b40>
不是一个内存地址,也就是不是同一个实体!
这是apple官方的一个单例建议:
https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html#//apple_ref/doc/uid/TP40002974-CH4-SW32
大致如下:
这是一种很标准的Singleton实现,中规中矩。不过这种实现并不是线程安全的。所以各路大神都各显神威,给出了多种单例模式的实现。
现在把他加强下:
再调试
MyClass *A = [[MyClass alloc] init];
NSLog(@"A:%@",A);
MyClass *B = [MyClass sharedMyClass];
NSLog(@"B:%@",B);
MyClass *C = [A copy];
NSLog(@"C:%@",C);
打印出的是
A:<MyClass: 0x6a1e130>
B:<MyClass: 0x6a1e130>
C:<MyClass: 0x6a1e130>
都是指向同一块内存地址
-----------------------------------切糕分割线--------------------------------------------------------
然而这个人(http://eschatologist.net/blog/?p=178)觉的繁琐,所以给出如下实现:
-----------------------------------切糕分割线--------------------------------------------------------
自苹果引入了Grand Central Dispatch (GCD)(Mac OS 10.6和iOS4.0)后,利用GCD(Grand Central Dispatch)和ARC(Automatic Reference Counting)实现单例。
函数void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);其中第一个参数predicate,该参数是检查后面第二个参数所代表的代码块是否被调用的谓词,第二个参数则是在整个应用程序中只会被调用一次的代码块。dispach_once函数中的代码块只会被执行一次,而且还是线程安全的。
看到如下一篇文章,用宏实现(https://gist.github.com/lukeredpath/1057420):
ExampleClass.m
GCDSingleton.h