1.屬性的賦值與取值
書上面的解釋就是使用點運算子來訪問屬性,可以操作屬性來進行賦值與取值。按照字面意思來理解,你可能覺得只是使用點運算子來簡單的操作定義屬性時生成的例項變數,實則不然。按照書上講的,點運算子操作屬性的同時,也具有呼叫方法的功能。按照這樣理解,點運算子的右側跟什麼方法名,就呼叫的是哪個方法。但細心的人會發現,之前我們經常用的乙個例子違反了這乙個規則。這個例子出現在屬性這部分之前,它首先定義了乙個例項變數,再給這個例項變數設定乙個訪問方法(如例項變數origin,再分別定義兩個方法:origin和setorigin),書上說這個例子等價於你直接定義乙個origin屬性。那麼,接下來,我們觀察,按照之前的規則,如果我們使用點運算子右邊跟乙個origin,那麼會有兩個問題產生:第一,我們到底呼叫的是origin變數還是origin方法呢;第二,如果呼叫的時origin方法,而origin方法是乙個取值方法,也就是說我們只能將它返回的值賦給其他的同型別變數,可是我們在書上卻見到將其他的值賦給它。思考這兩個問題,假如是呼叫變數,那麼那兩個方法該如何解釋呢?因此可以確定,點運算子呼叫的是方法。那麼問題又來了,如果是呼叫方法的話,那麼為什麼將乙個取值方法作為乙個賦值運算子的左側物件來使用呢?說道這裡,你可能會想到,這不正是設定方法的功能嗎?答案是肯定的。如果點運算子後面跟origin,如果對它賦值,實際上呼叫的是setorigin方法。
2.特性
oc中的屬性特徵主要有assign,copy,retain這三個主要的,還有readonly,readwrite. 另外,atomic和nonatomic;以及strong,weak。
assign主要是針對基礎型別資料和c資料型別的簡單賦值,而且它不呼叫索引計數器(retain count)。
retain主要是指呼叫oc中的物件,對oc中的物件進行賦值(主要針對nsobject及其子類),需要呼叫索引計數器(retain count)進行+1操作,開闢新的記憶體空間,在賦予新值之後便進行release操作。
copy是指使用物件的副本,索引計數器的計數依舊保持為1,它只是為物件建立了乙個新的指標,指向記憶體相應位置的物件,並沒有開闢新的記憶體空間(此時的複製為淺複製)。
readonly是只生成getter方法,而不生成setter方法,就是唯讀儲存。
readwrite是預設屬性,將生成不帶額外引數的getter和setter方法。
assign是一種原子訪問,如果有多個執行緒呼叫setter方法的話,不會出現在乙個執行緒呼叫setter沒有完成之前,另乙個執行緒開始呼叫setter這個方法,可以講該屬性鎖定。
nonassign是非原子訪問,不加同步和多執行緒,不進行鎖定,當出現多執行緒的時候,會出現問題,但是這樣相對提高了效能。
最後
特性不能用於有引數的setter和getter方法,假如要有引數的setter和getter方法的話,則必須重寫setter和getter方法如:
_郭挺
oc中屬性以及屬性的特性
1.掌握setter getter的作用以及書寫格式 1.settergetter 在oc裡,為例項變數賦值的方法稱作setter 設定器 讀取例項變數值的方法稱作getter 訪問器 無論是setter還是getter 內部操作的都是例項變數。每個例項變數都需要一對setter和getter方法。...
thinkphp它的特性
簡單易用 thinktemplate是乙個使用了xml標籤庫技術的編譯型模板引擎,支援兩種型別的模板標籤,使用了動態編譯和快取技術,而且支援自定義標籤庫。其特點包括 1 支援xml標籤庫和普通標籤的混合定義 2 編譯一次,下次直接執行而無需重新編譯 3 模板檔案更新後,自動更新模板快取 4 自動載入...
CSS的 important屬性 以及對它的誤解
css中的 important是乙個非常重要的屬性,這個屬性是css規範中的,但ie6不支援,也正是因為它不支援,才讓人找到了解決ie6和別的瀏覽器不相容問題的辦法。一般來說,在css中,如果在同乙個css塊中寫兩個相同的屬性,那麼是按照後出現的來執行的,比如 body margin left 20...