1.NSMutableArray和NSArray實例執(zhí)行mutableCopy和copy方法的區(qū)別毁兆?
NSMutableArray *arrM = [NSMutableArray arrayWithArray:@[@1,@2]];
id cp1 = [arrM mutableCopy];
id cp2 = [arrM copy];
NSLog(@"arrM %p, class %@", arrM, NSStringFromClass([arrM class]));
NSLog(@"cp1 %p, class %@", cp1, NSStringFromClass([cp1 class]));
NSLog(@"cp2 %p, class %@", cp2, NSStringFromClass([cp2 class]));
NSArray *arrI = @[@1,@2];
id cp3 = [arrI mutableCopy];
id cp4 = [arrI copy];
NSLog(@"arrI %p, class %@", arrI, NSStringFromClass([arrI class]));
NSLog(@"cp3 %p, class %@", cp3, NSStringFromClass([cp3 class]));
NSLog(@"cp4 %p, class %@", cp4, NSStringFromClass([cp4 class]));
執(zhí)行結(jié)果:
arrM 0x600002e562e0, class __NSArrayM
cp1 0x600002e56610, class __NSArrayM
cp2 0x60000206af40, class __NSArrayI
arrI 0x60000206c380, class __NSArrayI
cp3 0x600002e6d920, class __NSArrayM
cp4 0x60000206c380, class __NSArrayI
上面的問題分兩種情況:
- 當可變對象mutablecopy和copy之后,都會生成新的對象垃僚,只是新的對象的類型一個是可變的一個是不可變的勋又。
- 當不可變對象mutablecopy和copy之后田轧,只有mutablecopy會生成新的對象,copy則會只復制指針。
2.下面函數(shù)的執(zhí)行結(jié)果及發(fā)生錯誤的原因
dispatch_semaphore_t signal;
signal = dispatch_semaphore_create(1);
__block long x = 0;
NSLog(@"0_x:%ld",x);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(1);
NSLog(@"waiting");
x = dispatch_semaphore_signal(signal);
NSLog(@"1_x:%ld",x);
sleep(2);
NSLog(@"waking");
x = dispatch_semaphore_signal(signal);
NSLog(@"2_x:%ld",x);
});
// dispatch_time_t duration = dispatch_time(DISPATCH_TIME_NOW, 1*1000*1000*1000); //超時1秒
// dispatch_semaphore_wait(signal, duration);
x = dispatch_semaphore_wait(signal, DISPATCH_TIME_FOREVER);
NSLog(@"wait 1");
NSLog(@"3_x:%ld",x);
x = dispatch_semaphore_wait(signal, DISPATCH_TIME_FOREVER);
NSLog(@"wait 2");
NSLog(@"4_x:%ld",x);
x = dispatch_semaphore_wait(signal, DISPATCH_TIME_FOREVER);
NSLog(@"wait 3");
NSLog(@"5_x:%ld",x);
結(jié)果:
0_x:0
wait 1
3_x:0
waiting
1_x:1
wait 2
4_x:0
waking
2_x:1
wait 3
5_x:0
最后會出現(xiàn)一個Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
的錯誤
首先看一下信號量的幾個函數(shù):
dispatch_semaphore_create(M)
創(chuàng)建一個值為M的信號量
dispatch_semaphore_wait(信號量饭玲,等待時間)
如果該信號量的值大于0羊壹,則使其信號量的值-1蓖宦,否則,阻塞線程直到該信號量的值大于0或者達到等待時間油猫。
dispatch_semaphore_signal(信號量)
釋放信號量稠茂,使得該信號量的值加1
所以上面的結(jié)果不難推斷出,但是為什么會有最后的錯誤呢情妖?
在蘋果的開發(fā)文檔上有這么一段話
Calls to
dispatch_semaphore_signal
must be balanced with calls towait()
. Attempting to dispose of a semaphore with a count lower thanvalue
causes anEXC_BAD_INSTRUCTION
exception.
對dispatch_semaphore_signal
的調(diào)用必須與wait()
的調(diào)用相匹配睬关。試圖銷毀一個value低于初始化value值的信號將會導致一個EXC_BAD_INSTRUCTION
錯誤。