#import "ViewController.h" @interface ViewController () @property (nonatomic ,strong) NSString *someString; @property dispatch_queue_t syncQueue; @end @implementation ViewController /** * 获取方法可能会死锁 */ -(NSString *)someString{ __block NSString *localSomeString; dispatch_sync(_syncQueue, ^{ localSomeString = self.someString; }); return localSomeString; } -(void)setSomeString:(NSString *)someString{ dispatch_async(_syncQueue, ^{ self.someString = someString; }); } - (void)viewDidLoad { [super viewDidLoad]; //dispatch_get_current_queue 判断当前代码正在那个队列上执行,iOS6.0后已弃用 //因为队列间有层级关系,因此“检查当前队列是否执行同步派发所用的队列”这种办法并不总有效。 /** * ”队列特有数据“ * * @return 任意数据以键值对的形式关联到队列里 */ dispatch_queue_t queueA = dispatch_queue_create("queueA.Jie", NULL); dispatch_queue_t queueB = dispatch_queue_create("queueB.Zou", NULL); dispatch_set_target_queue(queueA, queueB); static int kQueueSpecific; CFStringRef queueSpecificValue = CFSTR("queueA"); dispatch_queue_set_specific(queueA, &queueSpecificValue, (void *)queueSpecificValue, (dispatch_function_t)CFRelease); //queueA 待设置数据的队列 &queueSpecificValue (void *)queueSpecificValue 键和值 (dispatch_function_t)CFRelease 析构函数(只能带一个指针参数且返回值必须是void)调用CFRelease“参数”以清理旧值 dispatch_sync(queueB, ^{ dispatch_block_t block = ^{NSLog(@"No deadLock");}; CFStringRef retriedValue = dispatch_get_specific(&kQueueSpecific); if (retriedValue){ block(); }else{ dispatch_sync(queueA, ^{ }); } }); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end