標籤:mod user cts inline tor .com 實現 mac os 問題:
4. 這個寫法會出什麼問題: @property (copy) NSMutableArray *array;
兩個問題:1、加入,刪除,改動數組內的元素的時候,程式會由於找不到相應的方法而崩潰.由於 copy 就是複製一個不可變 NSArray 的對象;
2、使用了 atomic 屬性會嚴重影響效能 ;
第1條的相關原因在下文中有論述《用@property聲明的NSString(或NSArray,NSDictionary)常常使用 copy keyword,為什嗎?假設改用strongkeyword,可能造成什麼問題?》 以及上文《怎麼用 copy keyword?》也有論述。
比方以下的代碼就會發生崩潰
// .h檔案
// http://weibo.com/luohanchenyilong/
// https://github.com/ChenYilong
// 以下的代碼就會發生崩潰
@property (nonatomic, copy) NSMutableArray *mutableArray;
// .m檔案
// http://weibo.com/luohanchenyilong/
// https://github.com/ChenYilong
// 以下的代碼就會發生崩潰
NSMutableArray *array = [NSMutableArray arrayWithObjects:@1,@2,nil];
self.mutableArray = array;
[self.mutableArray removeObjectAtIndex:0];
接下來就會奔潰:
-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x7fcd1bc30460
第2條原因。例如以下:
該屬性使用了同步鎖(atomic)。會在建立時產生一些額外的代碼用於協助編寫多線程程式,這會帶來效能問題,通過聲明 nonatomic 能夠節省這些儘管非常小可是不必要額外開銷。
在預設情況下,由編譯器所合成的方法會通過鎖定機制確保其原子性(atomicity)。
假設屬性具備 nonatomic 特質,則不使用同步鎖。請注意,雖然沒有名為“atomic”的特質(假設某屬性不具備 nonatomic 特質,那它就是“原子的”(atomic))。
在iOS開發中。你會發現。差點兒全部屬性都聲明為 nonatomic。
普通情況下並不要求屬性必須是“原子的”,由於這並不能保證“安全執行緒” ( thread safety)。若要實現“安全執行緒”的操作,還需採用更為深層的鎖定機制才行。比如,一個線程在連續多次讀取某屬性值的過程中有別的線程在同一時候改寫該值,那麼即便將屬性聲明為 atomic,也還是會讀到不同的屬性值。
因此。開發iOS程式時一般都會使用 nonatomic 屬性。可是在開發 Mac OS X 程式時,使用 atomic 屬性通常都不會有效能瓶頸。
iOS學習(3)