iOS學習(3)

來源:互聯網
上載者:User

標籤: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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.