// .h文件
// 下面的代碼就會發(fā)生崩潰 @property (nonatomic, copy) NSMutableArray *mutableArray;
// .m文件
?// 下面的代碼就會發(fā)生崩潰?
?NSMutableArray *array = [NSMutableArray arrayWithObjects:@1,@2,nil];?
self.mutableArray = array; [self.mutableArray removeObjectAtIndex:0];
接下來就會奔潰:
-[__NSArrayIremoveObjectAtIndex:]: unrecognized selector sent to instance0x7fcd1bc30460
兩個問題:
1、添加,刪除,修改數(shù)組內(nèi)的元素的時候,程序會因為找不到對應(yīng)的方法而崩潰.因為 copy 就是復(fù)制一個不可變 NSArray 的對象千劈;
2赤惊、使用了 atomic 屬性會嚴(yán)重影響性能 墓阀;
第1條的相關(guān)原因在下文中有論述***《用@property聲明的NSString(或NSArray禾乘,NSDictionary)經(jīng)常使用 copy 關(guān)鍵字惋耙,為什么乱陡?如果改用strong關(guān)鍵字浇揩,可能造成什么問題?》*** 以及上文***《怎么用 copy 關(guān)鍵字憨颠?》***也有論述胳徽。
第2條原因积锅,如下:
該屬性使用了同步鎖,會在創(chuàng)建時生成一些額外的代碼用于幫助編寫多線程程序养盗,這會帶來性能問題缚陷,通過聲明 nonatomic 可以節(jié)省這些雖然很小但是不必要額外開銷。
在默認(rèn)情況下往核,由編譯器所合成的方法會通過鎖定機制確保其原子性(atomicity)箫爷。如果屬性具備 nonatomic 特質(zhì),則不使用同步鎖聂儒。請注意虎锚,盡管沒有名為“atomic”的特質(zhì)(如果某屬性不具備 nonatomic 特質(zhì),那它就是“原子的”(atomic))薄货。
在iOS開發(fā)中翁都,你會發(fā)現(xiàn),幾乎所有屬性都聲明為 nonatomic谅猾。
一般情況下并不要求屬性必須是“原子的”柄慰,因為這并不能保證“線程安全” ( thread safety),若要實現(xiàn)“線程安全”的操作税娜,還需采用更為深層的鎖定機制才行坐搔。例如,一個線程在連續(xù)多次讀取某屬性值的過程中有別的線程在同時改寫該值敬矩,那么即便將屬性聲明為 atomic概行,也還是會讀到不同的屬性值。
因此弧岳,開發(fā)iOS程序時一般都會使用 nonatomic 屬性凳忙。但是在開發(fā) Mac OS X 程序時,使用 atomic 屬性通常都不會有性能瓶頸禽炬。