property在IOS開發(fā)中占據(jù)了非常重要的位置偶洋,作為OC的一項特性版保,主要的作用是用來封裝和操作對象的數(shù)據(jù)博烂。那么property的本質(zhì)是什么证逻?
首先我們需要知道property的組成部分乐埠,它是由一個實例變量(ivar),以及存取方法(getter和setter)組成的囚企。換句話說property就是通過set方法對實例變量進(jìn)行寫入變量值丈咐,通過get方法讀取實例變量的變量值。當(dāng)我們使用property來定義一個對象的時候龙宏,系統(tǒng)會自動按照其給定的命名規(guī)范自動創(chuàng)建一套存取方法.
例如:
@interface student:NSObject
@property (nonatomic棵逊,copy)NSString * name;
@property ?(nonatomic, copy ) NSString * age;
@end;
以上是通過property來定義兩個字符串,其等效于:
@interface student:NSObject
{
NSString * name;
}
@end银酗;
#import "student.h"
@implementation student
- (void)setName:(NSString *)newName ?
{
name ?= newName;
}
-(NSString *)name?
{
return name;
}
由此可以看出實際上property就是為實例變量自動添加set和get方法的操作辆影,一般property會和synthesize一起使用,可以將property理解為給實例變量命名的關(guān)鍵字黍特,比如
@implementation student
@synthesize name = _myName;
這樣我們就將實例變量name命名為_myName蛙讥,如果沒有使用@synthesize,則系統(tǒng)默認(rèn)將實例變量添加一個下劃線灭衷,比如_name;
既然說到property次慢,肯定離不開幾種修飾符的使用
在使用property關(guān)鍵字定義屬性時,會用到幾種不同的修飾符
readwrite和readonly翔曲,當(dāng)使用readwrite時迫像,會自動生成set和get方法,是一種可讀可寫的狀態(tài)瞳遍,這是一種默認(rèn)的屬性闻妓。如果我們不希望在外部改變此變量的值,可以用readonly修飾掠械,這個時候指只會生成get方法由缆。
retain注祖、copy、assing犁功、weak以及strong
先來說說retain氓轰,使用retain修飾變量,會先釋放掉舊的對象浸卦,然后將久對象的值賦予輸入對象署鸡,然后將輸入對象的引用計數(shù)提升為1;也就是說實際上源對象和輸入對象指向的都是相同的內(nèi)容限嫌,可以理解成retain實際上是一個淺復(fù)制靴庆,復(fù)制的只是一個指向相同內(nèi)容的指針。
copy和retain不同怒医,copy是一個深復(fù)制炉抒,完全復(fù)制了一個新的對象,此對象引用計數(shù)為1稚叹,有自己獨立的內(nèi)存地址焰薄。一般當(dāng)我們在修飾OC中NSString,NSArray等自身還包含可變類型的類的時候扒袖,我們需要用copy來修飾塞茅,因為要避免當(dāng)NSString的值來源于他的可變的子類的時候,其值也很跟隨改變季率。詳情可見
www.reibang.com/writer#/notebooks/10310036/notes/9620077
而strong在ARC中基本和retain使用情況相同野瘦,但是要注意的是,在修飾可變的類型時飒泻,比如NSMutableArray我們又不能使用copy來修飾了鞭光,原因是如果我們將可變的類型copy一份,那么copy的那一份就變成了一個不可變的類型泞遗,但是這個時候又找不到原來的一些關(guān)于其可變類型的實例方法惰许,就會報錯,詳情也可以參考上面的鏈接史辙。
weak和assign的用法基本相同都是簡單的賦值汹买,不改變引用計數(shù)。區(qū)別在于weak必須是oc對象髓霞。并weak屬于歸零弱引用卦睹,當(dāng)對象被銷毀之后指針置nil畦戒。在需要放置循環(huán)引用的時候方库,通過一端采用weak來解決。
最后再說說nonatomic和atomic
基本上大家都知道atomic代表線程安全障斋,不過在一些情況下同樣也無法保證其安全纵潦,比如一個線程在連續(xù)多次讀取某個屬性值的過程中有別的線程在同時改寫該值徐鹤,那么即便將屬性聲明為atomic,也還是會讀取到不同的屬性值邀层。而且使用atomic對內(nèi)存的開銷很大返敬,所以基本上我們都會使用nonatomic。如果對原子和非原子的具體區(qū)別感興趣的可以參考一下