Effective OC: 6. 7. 8

來源:互聯網
上載者:User

標籤:objective-c

6. 理解 屬性 property 這一特性.

屬性來封裝對象中的資料,這些執行個體變數通過access方法來訪問,即 getter和setter.  編譯器會自動編寫getter與setter, 開發人員可以通過點文法 dot syntax來訪問屬性. 編譯器將點文法轉換為調用getter和setter,也就是點文法只是簡單的文法糖而已.

使用@ dynamic關鍵字,在實現檔案中,可以使編譯器不自動建立gettersetter方法,且忽略編譯時間無法訪問getter , setter的警告, 其存取方法可以在運行時,動態賦予.

屬性 的attribute:

原子性: nonatomic  , 不設定nonatomic就是atomic原子的, 原子性極大訪問降低效率.

讀寫權限: readwrite預設 ,readonly唯讀: 可以在聲明中聲稱屬性是唯讀,然後再class-continuation中重新定義為讀寫.

記憶體管理: 

assign: 對單一資料型別,即非對象的基礎資料類型,進行賦值操作.

strong: 屬性為擁有,即__strong

weak: 屬性未非擁有,當對象被其他人釋放時,該屬性值為nil.

unsafe_unretained: 不安全的非持有狀態,與assign的區別在於前者針對對象,而後者針對基礎資料類型,與weak的區別在於其不安全,weak對象釋放後為nil, 而這個不安全的屬性值不會清空.

copy: 屬性為持有狀態,但是持有的不是設定的對象,而是該對象的copy, 這又涉及到copy與mutablecopy, 以及深淺賦值的內容. 設定該屬性的目的是 建立賦值對象的不變版本,以儲存這個可能會變化的值的當前屬性值. 設定的對象必須實現NSObject的copy協議.

方法名: 屬性可以指定方法名稱,getter = ming , setter= ming , 以進行定製.


個人觀點,對於一般私人不用於繼承的屬性,為了效率,都會直接存取屬性本身,因為通過getter setter方法進行訪問,本身效率就很低. 但是對於getter setter方法, 其對效率的提高還是有的. 但 對於建立消耗較大的對象, 使用getter 方法來實現延遲建立, 只有用到的時候才建立該對象, 而表示固定在初始化時建立, 這樣對效率的提高還是很大的.


7. 在對象內部盡量直接存取執行個體變數

這裡繼續對屬性進行討論, 方法派發 method dispatch是很耗時的,與一般語言比起來,效率低太多,其他語言直接根據函數地址訪問函數,而OC中,要發送訊息,然後訊息響應對象中尋找訊息函數,然後調用.

所以,一般的做法都是,在類中直接存取執行個體變數, 而著重注意這些屬性的初始化,以防直接存取未初始化的執行個體變數. 一般選擇在建構函式中進行初始化,但是 如果調用setter方法進行初始化,調用的可能是子類派生的寫法,所以也還是應該直接存取執行個體變數進行賦值.


所以說,對象內部盡量使用 直接存取, 而通過存取方法getter能夠帶來的速度提升,體現在 惰性初始化,延遲建立上, 對於耗費較大的對象,可以忽略調用的消耗,而強調延遲建立帶來的效率提升. 


8. 理解equality 這一概念.

同其他語言一樣, 直接對 執行個體對象進行== 判斷,判斷的是對象指標是否相等,即地址是否相同. 要實現真正的對象是否相同的判斷, 要實現和使用NSObject 協議中的 

- (BOOL) isEqual: (id) object;

-(NSUInteger) hash;

如果兩個對象使用isEqual 判斷相等, 那麼 hash必須返回相同的值 . 但是反之不是如此,即hash值相同但是兩者並不一定isEqual .

而在isEqual中對兩者是否相同的判斷,一般先判斷兩者地址是否相同,地址相同一般是相同的,然後判斷對象 的 類 是否相同, 但是基類和衍生類別的類是不相同的, 但是兩者有可能是相同的, 所以要注意這一點,進行考慮.

hash 使用在collection中, 作為hash值,來進行索引. 設計一個相對合理 碰撞較少 且速度較快的 雜湊演算法. 

而在這裡還需要注意的一點是, 在容器中加入可變對象後, 會引發一些不好的效果. 首先,collection在加入對象時,記錄其hash值,而不再進行維護. 對collection裡面的可變對象進行修改, 如果拿這個collection與其他collection進行比較,比較的是修改前的hash. 而如果在set中,對可變對象進行修改可以導致set中含有多個相同的對象.




著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Effective OC: 6. 7. 8

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.