2.屬性詳解(@property/@dynamic/@synthesize)

@property分為@property和@dynamic或者@synthesize:

  • @property闽寡,寫在.h 文件的@interface中,完成屬性的聲明
  • @dynamic或者@synthesize歉备,寫在.m文件的@implementation中康辑,完成屬性時實現(xiàn)
  • @dynamic 的意思是告訴編譯器樱溉,該屬性的實例變量和存取方法由用戶自己實現(xiàn),不自動生成齐饮。

用@property聲明的NSString(或NSArray捐寥,NSDictionary)經(jīng)常使用copy關(guān)鍵字,為什么祖驱?如果改用strong關(guān)鍵字握恳,可能造成什么問題?

  1. 因為父類指針可以指向子類對象捺僻,使用copy的目的是為了讓本對象的屬性不受外界的影響乡洼,使用copy無論傳入的是一個可變的對象還是一個不可變的對象,我本身持有的都是一個不可變的副本匕坯。
  2. 如果使用的是strong束昵,那么這個屬性就有可能指向一個可變的對象,如果這個可變對象在外界被修改了葛峻,那么會影響該屬性锹雏。
//.h 文件中
@property (nonatomic) NSInteger age;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) NSNUmber *number;

// .m文件中
@synthesize name = _name,age = _age, number = _number;
// 該語句不寫就是默認(rèn)自動生成的术奖,代表所有 setter 和 getter 方法的實現(xiàn)

在平時的使用中礁遵,在.h中進(jìn)行@property后,會自動在.m中生成相對應(yīng)的@synthesize采记。

@synthesize 的作用:
1.添加屬性對應(yīng)的成員變量
2.規(guī)定了該屬性聲明的 setter getter 方法所操作的成員變量
3.如果@synthesize 省略不寫佣耐,則自動生成對應(yīng)屬性的 setter 和 getter 方法,
默認(rèn)操作的成員變量是‘_’+屬性名
4.檢測手動實現(xiàn)了@synthesize唧龄,就會按照你的要求生成成員變量名稱并生成對應(yīng)的 setter 
和 getter 方法兼砖,
如@synthesize name =  _myName; 這樣成員變量就是 _myNam 了
5.在以下幾種情況下不會自動合成setter 和 getter 方法,而且也不會檢測成員變量是否存在,
也就不會幫助我們生成對應(yīng)的成員變量掖鱼,則需要我們自己添加成員變量:
    1>同事重寫了 setter 和 getter 時然走; 
    2>重寫了只讀屬性的 getter 時;
    3>使用了@dynamic時;
    4>在@protocol 中定義的所有屬性戏挡;
    5>在 category 中定義的所有屬性;
    6>重寫的屬性晨仑,當(dāng)你在子類中重寫了父類中的屬性褐墅,你必須使用@synthesize來手動合成ivar。 

關(guān)于@property的說明:

1.讀寫特性

(1)readwrite(可讀可寫)默認(rèn)屬性洪己,既生成 setter 方法妥凳,又生成 getter 方法
(2)readonly(只讀),只生成getter方法答捕,不會生成setter方法
(3)setter = 方法名逝钥,給生成的setter方法起一個其他的方法名
(4)getter = 方法名,給生成的getter方法起一個其他的方法名

2.原子特性

atomic(原子特性)默認(rèn)屬性拱镐,保證線程安全艘款,也就是當(dāng)前的實例變量只能由一個線程訪問,在這個過程中有一個加鎖解鎖的過程(其實然并卵沃琅,這個操作并不能根本上保證線程的安全哗咆,還會因為加鎖解鎖的操作增加損耗。)

對于atomic的屬性益眉,系統(tǒng)生成的 getter/setter 會保證 get晌柬、set 操作的完整性,不受其他線程影響郭脂。比如年碘,線程 A 的 getter 方法運行到一半,線程 B 調(diào)用了 setter:那么線程 A 的 getter 還是能得到一個完好無損的對象展鸡。

nonatomic就沒有這個保證了屿衅。所以,nonatomic的速度要比atomic快娱颊。

不過atomic可并不能保證線程安全傲诵。如果線程 A 調(diào)了 getter,與此同時線程 B 箱硕、線程 C 都調(diào)了setter——那最后線程 A get 到的值拴竹,3種都有可能:可能是 B、C set 之前原始的值剧罩,也可能是 B set 的值栓拜,也可能是 C set 的值。同時,最終這個屬性的值幕与,可能是 B set 的值挑势,也有可能是 C set 的值。

3.語義特性

(1)assign 默認(rèn)屬性啦鸣,一般用來修飾非對象類型的屬性潮饱,但是也可以修飾對象類的屬性
(2)retain 針對于對象,會將對象的引用計數(shù)加1 诫给,MRC下的香拉,在ARC下被strong取代
(3)copy 針對于對象,將對象拷貝一份中狂,產(chǎn)生一個新的對象凫碌,多用于像NSStringNSDictionary胃榕,NSArray這樣本身有可變類型的盛险。可變類型的對象不能用copy 勋又,copy過來會是不可變類型
(4)weak 弱引用苦掘,針對于對象,不持有對象赐写,當(dāng)對象被釋放時鸟蜡,自動將對象置為nil,用于防止循環(huán)引用挺邀。

copy與retain

  1. copy是建立一個相同的對象揉忘,retain不是
  2. copy是內(nèi)容拷貝,retain是指針拷貝端铛。
  3. copy是內(nèi)容的拷貝 ,對于像NSString,的確是這樣泣矛,但是如果copy的是一個NSArray呢?這時只是copy了指向array中相對應(yīng)元素的指針.這便是所謂的"淺復(fù)制".
  4. copy的情況:NSString *newPt = [pt copy];
    此時會在堆上重新開辟一段內(nèi)存存放@"abc" 比如0X1122 內(nèi)容為@"abc" 同時會在棧上為newPt分配空間 比如地址:0Xaacc 內(nèi)容為0X1122 因此retainCount增加1供newPt來管理0X1122這段內(nèi)存;

assign與retain:

  1. assign: 簡單賦值禾蚕,不更改索引計數(shù)您朽;
  2. assign的情況:NSString *newPt = [pt assing];

此時newPtpt完全相同 地址都是0Xaaaa 內(nèi)容為0X1111newPt只是pt的別名,對任何一個操作就等于對另一個操作换淆, 因此retainCount不需要增加哗总;

3.assign就是直接賦值;
4.retain使用了引用計數(shù)倍试,retain引起引用計數(shù)加1, release引起引用計數(shù)減1讯屈,當(dāng)引用計數(shù)為0時,dealloc函數(shù)被調(diào)用县习,內(nèi)存被回收涮母;
5.retain的情況:NSString *newPt = [pt retain];
此時newPt的地址不再為0Xaaaa谆趾,可能為0Xaabb 但是內(nèi)容依然為0X1111。 因此newPtpt 都可以管理"abc"所在的內(nèi)存叛本,因此 retainCount需要增加1 沪蓬;

readonly:

  1. 屬性是只讀的,默認(rèn)的標(biāo)記是讀寫来候,如果你指定了只讀跷叉,在@implementation中只需要一個讀取器》涂保或者如果你使用@synthesize關(guān)鍵字性芬,也是有讀取器方法被解析

readwrite:

  1. 說明屬性會被當(dāng)成讀寫的,這也是默認(rèn)屬性剧防。設(shè)置器和讀取器都需要在@implementation中實現(xiàn)。如果使用@synthesize關(guān)鍵字辫樱,讀取器和設(shè)置器都會被解析峭拘;

nonatomic:

  1. 非原子性訪問,對屬性賦值的時候不加鎖狮暑,多線程并發(fā)訪問會提高性能鸡挠。如果不加此屬性,則默認(rèn)是兩個訪問方法都為原子型事務(wù)訪問搬男;

weak and strong property (強引用和弱引用的區(qū)別):

  1. weakstrong 屬性只有在你打開ARC時才會被要求使用拣展,這時你是不能使用retain release autorelease 操作的,因為ARC會自動為你做好這些操作缔逛,但是你需要在對象屬性上使用weakstrong,其中strong就相當(dāng)于retain屬性备埃,而weak相當(dāng)于assign
  2. 只有一種情況你需要使用weak(默認(rèn)是strong)褐奴,就是為了避免retain cycles(就是父類中含有子類{父類retain了子類}按脚,子類中又調(diào)用了父類{子類又retain了父類},這樣都無法release
  3. 聲明為weak的指針敦冬,指針指向的地址一旦被釋放辅搬,這些指針都將被賦值為nil。這樣的好處能有效的防止野指針脖旱。

ARC(Automatic Reference Counting):

  1. 就是代碼中自動加入了retain/release堪遂,原先需要手動添加的用來處理內(nèi)存管理的引用計數(shù)的代碼可以自動地由編譯器完成了。
    該機(jī)能在 iOS 5/ Mac OS X 10.7 開始導(dǎo)入萌庆,利用 Xcode4.2 以后可以使用該特性溶褪。

strong,weak,copy 具體用法:

  1. 具體一點:IBOutlet可以為weakNSStringcopy踊兜,Delegate一般為weak竿滨,其他的看情況佳恬。一般來說,類“內(nèi)部”的屬性設(shè)置為strong于游,類“外部”的屬性設(shè)置為weak毁葱。說到底就是一個歸屬權(quán)的問題。小心出現(xiàn)循環(huán)引用導(dǎo)致內(nèi)存無法釋放贰剥。
  • assign聲明的delegate倾剿,在delegate指向的對象銷毀后,delegate中依然會保留之前對象的地址蚌成,即delegate變成野指針前痘。
  • weak聲明的delegate,在delegate指向的對象銷毀后担忧,delegate = nil
  1. 不用ARC的話就會看到很多retian芹缔。
  2. 如果你寫了@synthesize abc = _abc;的話瓶盛,系統(tǒng)自動幫你聲明了一個_abc的實例變量最欠。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市惩猫,隨后出現(xiàn)的幾起案子芝硬,更是在濱河造成了極大的恐慌,老刑警劉巖轧房,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拌阴,死亡現(xiàn)場離奇詭異,居然都是意外死亡奶镶,警方通過查閱死者的電腦和手機(jī)迟赃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來实辑,“玉大人捺氢,你說我怎么就攤上這事〖羟耍” “怎么了摄乒?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長残黑。 經(jīng)常有香客問我馍佑,道長,這世上最難降的妖魔是什么梨水? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任拭荤,我火速辦了婚禮,結(jié)果婚禮上疫诽,老公的妹妹穿的比我還像新娘舅世。我一直安慰自己旦委,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布雏亚。 她就那樣靜靜地躺著缨硝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪罢低。 梳的紋絲不亂的頭發(fā)上查辩,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機(jī)與錄音网持,去河邊找鬼宜岛。 笑死,一個胖子當(dāng)著我的面吹牛功舀,可吹牛的內(nèi)容都是我干的萍倡。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼辟汰,長吁一口氣:“原來是場噩夢啊……” “哼遣铝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起莉擒,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瘫絮,沒想到半個月后涨冀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡麦萤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年鹿鳖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壮莹。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡翅帜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出命满,到底是詐尸還是另有隱情涝滴,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布胶台,位于F島的核電站歼疮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏诈唬。R本人自食惡果不足惜韩脏,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铸磅。 院中可真熱鬧赡矢,春花似錦杭朱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至送浊,卻和暖如春梦谜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背袭景。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工唁桩, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人耸棒。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓荒澡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親与殃。 傳聞我的和親對象是個殘疾皇子单山,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容