第2章
6.理解“屬性”這一概念
<strong>屬性最終還是得通過實(shí)例變量來實(shí)現(xiàn)</strong>
(1)使用@property語法挠他,OC就可以根據(jù)名稱自動創(chuàng)建出存取方法扳抽。
- 使用屬性的話,編譯器會自動編寫訪問這些屬性所需的方法,此過程叫做“自動合成”贸呢。
- 除了生成方法外镰烧,編譯器還自動向類中添加適當(dāng)類型的實(shí)例變量,并且在屬性名前加下劃線贮尉,以此作為實(shí)例變量名拌滋。(@synthesize語法可以為屬性指定實(shí)例變量的名字)
- 使用@dynamic關(guān)鍵字,它會告訴編譯器:不要自動創(chuàng)建實(shí)現(xiàn)屬相所用的實(shí)例變量猜谚,也不為其創(chuàng)建存取方法败砂。
(2)屬性特質(zhì)
- 原子性:如果屬性不具備nonatomic特質(zhì),那他就是原子的(atomic)魏铅。
- 讀/寫權(quán)限:1.readwrite(讀寫)2.readonly(只讀)昌犹。
- 內(nèi)存管理語義
1.assign “設(shè)置方法”只會執(zhí)行針對“純量類型”(CGFloat,NSInteger等)的簡單賦值操作览芳。
2.strong 此特質(zhì)表明該屬性定義了一種“擁有關(guān)系”斜姥。為屬性設(shè)置新值時,設(shè)置方法會先保留新值沧竟,并釋放舊值铸敏,然后再將新值設(shè)置上去。
3.weak 此特質(zhì)表明該屬性定義了一種“非擁有關(guān)系”悟泵。為屬性設(shè)置新值時杈笔,設(shè)置方法既不保留新值,也不并釋放舊值糕非。此特質(zhì)與assign類似蒙具,在屬性所指的對象遭到摧毀時,屬性值會被置為nil朽肥。
4.unsafe_unretained 此特質(zhì)的語義與assign相同禁筏,但它適用于“對象類型”,該特質(zhì)表達(dá)一種“非擁有關(guān)系”(“不保留”,unreatined),當(dāng)目標(biāo)對象被銷毀時衡招,屬性值不會自動情空篱昔,這與weak不同。
5.copy 此特質(zhì)所表達(dá)的所屬關(guān)系與strong類似蚁吝。設(shè)置方法并不保留心智旱爆,而是將其“拷貝”。當(dāng)屬性類型為NSString*時窘茁,經(jīng)常用此特質(zhì)保護(hù)其封裝性怀伦。
- 方法名:1.getter=<name> 指定“獲取方法”的方法名。2.setter=<name> 指定“設(shè)置方法”的方法名山林。
7.在對象內(nèi)部盡量直接訪問實(shí)例變量
在讀取實(shí)例變量的時候采用直接訪問的形式房待,而在設(shè)置實(shí)例變量的時候通過屬性來做邢羔。
(1)兩種寫法的區(qū)別
- 直接訪問實(shí)例變量不經(jīng)過OC的“方法派發(fā)”,速度較快桑孩。
- 直接訪問實(shí)例變量是拜鹤,不會調(diào)用其setter方法,這就繞過了相關(guān)屬性所定義的內(nèi)存管理語義流椒。例如:在ARC下直接訪問一個聲明為copy的屬性敏簿,并不會拷貝屬性,只會保留新值并釋放舊值(相當(dāng)于strong)宣虾。
- 直接訪問實(shí)例變量惯裕,不會觸發(fā)“鍵值觀察”(KVO)通知。
<strong>在寫入實(shí)例變量時绣硝,通過其setter來做蜻势,而在讀取實(shí)例變量時,則直接訪問</strong>
<strong>注意:當(dāng)使用“懶加載”的時候鹉胖,必須通過“獲取方法”來訪問屬性握玛,否則實(shí)例變量永遠(yuǎn)不會初始化。</strong>
<strong>在初始化方法及dealloc方法中甫菠,總是應(yīng)該直接通過實(shí)例變量來讀寫數(shù)據(jù)</strong>