定義屬性時(shí)夭问,常用的關(guān)鍵字及其作用詳解

atomic:

原子操作(原子性是指事務(wù)的一個(gè)完整操作烛卧,操作成功就提交,反之就回滾. 原子操作就是指具有原子性的操作)在objective-c 屬性設(shè)置里面 默認(rèn)的就是atomic 缝彬,意思就是 setter /getter函數(shù)是一個(gè)原子操作萌焰,如果多線程同時(shí)調(diào)用setter時(shí),不會(huì)出現(xiàn)某一個(gè)線程執(zhí)行完setter所有語(yǔ)句之前谷浅,另一個(gè)線程就開(kāi)始執(zhí)行setter扒俯,相當(dāng)于 函數(shù)頭尾加了鎖 . 這樣的話 并發(fā)訪問(wèn)性能會(huì)比較低 .

nonatomic:

非原子操作 一般不需要多線程支持的時(shí)候就用它,這樣在 并發(fā)訪問(wèn)的時(shí)候效率會(huì)比較高 . 在objective-c里面通常對(duì)象類型都應(yīng)該聲明為非原子性的. iOS中程序啟動(dòng)的時(shí)候系統(tǒng)只會(huì)自動(dòng)生成一個(gè)單一的主線程.程序在執(zhí)行的時(shí)候一般情況下是在同一個(gè)線程里面對(duì)一個(gè)屬性進(jìn)行操作. 如果在程序中 我們確定某一個(gè)屬性會(huì)在多線程中被使用一疯,并且需要做數(shù)據(jù)同步撼玄,就必須設(shè)置成原子性的,但也可以設(shè)置成非原子性的墩邀,然后自己在程序中用加鎖之類的來(lái)做數(shù)據(jù)同步.

在頭文件中聲明屬性的時(shí)候使用atomic 和 nonatomic等價(jià)于在頭文件里面添加2個(gè)函數(shù)一個(gè)是用于設(shè)置這個(gè)屬性的掌猛,一個(gè)是用于讀取這個(gè)屬性,例如:- (nsstring *)name; - (void)setName:(NSString *)str;

atomic / nonatomic 需要和@synthesize/@dynamic配和使用才有意義.

@synthesize

如果沒(méi)有實(shí)現(xiàn)setter和getter方法眉睹,編譯器將會(huì)自動(dòng)在生產(chǎn)setter和getter方法荔茬。

@dynamic

表示變量對(duì)應(yīng)的屬性訪問(wèn)器方法 , 是動(dòng)態(tài)實(shí) 現(xiàn)的 , 你需要在 NSObject 中繼承而來(lái)的 +(BOOL) resolveInstanceMethod:(SEL) sel 方法中指定 動(dòng)態(tài)實(shí)現(xiàn)的方法或者函數(shù)。

屬性修飾其他關(guān)鍵字:

getter=getterName

指定 get 方法辣往,并需要實(shí)現(xiàn)這個(gè)方法 兔院。必須返回與聲明類型相同的變量殖卑,沒(méi)有參數(shù)

setter=setterName

指定 set 方法站削,并需要實(shí)現(xiàn)這個(gè)方法 。帶一個(gè)與聲明類型相同的參數(shù)孵稽,沒(méi)有返回值(返回空值)

當(dāng)聲明為 readonly 的時(shí)候许起,不能指定 set 方法

readwrite

如果沒(méi)有聲明成 readonly ,那就 默認(rèn)是 readwrite 菩鲜≡跋福可以用來(lái)賦值,也可以被賦值

readonly

不可以被賦值

assign

所有屬性都 默認(rèn) assign 接校,通常用于標(biāo)量(簡(jiǎn)單變量 int 猛频, float , CGRect 等)
一種典型情況是用在對(duì)對(duì)象沒(méi)有所有權(quán)的時(shí)候蛛勉,通常是 delegate 鹿寻,避免造成死循環(huán)(如果用 retain 的話會(huì)死循環(huán))

retain

屬性必須是 objc 對(duì)象,擁有對(duì)象所有權(quán)诽凌,必須在 dealloc 中 release 一次毡熏。

copy

屬性必須是 objc 對(duì)象,擁有對(duì)象所有權(quán)侣诵,必須在 dealloc 中 release 一次痢法。且屬性必須實(shí)現(xiàn) NSCopying 協(xié)議
一般常用于 NSString 類型

iOS5以后新加入了ARC狱窘,增加了新的關(guān)鍵字strong, weak, unsafe_unretained

iOS5中新的關(guān)鍵字strong, weak, unsafe_unretained. 可以與以前的關(guān)鍵字對(duì)應(yīng)學(xué)習(xí)strong與retain類似,weak與unsafe_unretained功能差不多(有點(diǎn)區(qū)別财搁,等下會(huì)介紹蘸炸,這兩個(gè)新 關(guān)鍵字與assign類似)。在iOS5中用這些新的關(guān)鍵字尖奔,就可以不用手動(dòng)管理內(nèi)存了幻馁,從java等其它語(yǔ)言轉(zhuǎn)過(guò)來(lái)的程序員非常受用。

strong

strong關(guān)鍵字與retain關(guān)似越锈,用了它仗嗦,引用計(jì)數(shù)自動(dòng)+1,用實(shí)例更能說(shuō)明一切

1 @property (nonatomic, strong) NSString *string1;   
2 @property (nonatomic, strong) NSString *string2;

有這樣兩個(gè)屬性

1 @synthesize string1;   
2 @synthesize string2; 

猜一下下面代碼將輸出什么結(jié)果甘凭?

1 self.string1 = @"String 1";   
2 [self.string2 = self.string1;   
3 [self.string1 = nil;  
4 [NSLog(@"String 2 = %@", self.string2); 

結(jié)果是:String 2 = String 1

由于string2是strong定義的屬性稀拐,所以引用計(jì)數(shù)+1,使得它們所指向的值都是@"String 1", 如果你對(duì)retain熟悉的話丹弱,這理解并不難德撬。

weak

接著我們來(lái)看weak關(guān)鍵字:

如果這樣聲明兩個(gè)屬性:

1 @property (nonatomic, strong) NSString *string1;   
2 @property (nonatomic, weak) NSString *string2; 

并定義

1 @synthesize string1;   
2 @synthesize string2; 

再來(lái)猜一下,下面輸出是什么躲胳?

1 self.string1 = [[NSString alloc] initWithUTF8String:"string 1"];   
2 elf.string2 = self.string1;   
3 self.string1 = nil;  
4 NSLog(@"String 2 = %@", self.string2); 

結(jié)果是:String 2 = null

分析一下蜓洪,由于 self.string1與self.string2指向同一地址,且string2沒(méi)有retain內(nèi)存地址坯苹,而self.string1=nil釋放 了內(nèi)存隆檀,所以string1為nil。聲明為weak的指針粹湃,指針指向的地址一旦被釋放恐仑,這些指針都將被賦值為nil。這樣的好處能有效的防止野指針为鳄。在 c/c++開(kāi)發(fā)過(guò)程中裳仆,為何大牛都說(shuō)指針的空間釋放了后,都要將指針賦為NULL. 在這兒用weak關(guān)鍵字幫我們做了這一步孤钦。

unsafe_unretained

接著我們來(lái)看unsafe_unretained

從名字可以看出歧斟,unretained且unsafe,由于是unretained所以與weak有點(diǎn)類似偏形,但是它是unsafe的静袖,什么是unsafe的呢,下面看實(shí)例壳猜。

如果這樣聲明兩個(gè)屬性:

并定義

1 @property (nonatomic, strong) NSString *string1;   
2 @property (nonatomic, unsafe_unretained) NSString *string2; 

再來(lái)猜一下勾徽,下面的代碼會(huì)有什么結(jié)果?

1 self.string1 = [[NSString alloc] initWithUTF8String:"string 1"];   
2 self.string2 = self.string1;   
3 self.string1 = nil;  
4 NSLog(@"String 2 = %@", self.string2); 

請(qǐng)注意,在此我并沒(méi)有叫你猜會(huì)有什么輸出喘帚,因?yàn)楦静粫?huì)有輸出畅姊,你的程序會(huì)crash掉。 原因是什么吹由,其實(shí) 就是野指針造成的若未,所以野指針是可怕的。為何會(huì)造成野指針呢倾鲫?同于用unsafe_unretained聲明的指針粗合,由于 self.string1=nil已將內(nèi)存釋放掉了,但是string2并不知道已被釋放了乌昔,所以是野指針隙疚。然后訪問(wèn)野指針的內(nèi)存就造成crash. 所以盡量少用unsafe_unretained關(guān)鍵字。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末磕道,一起剝皮案震驚了整個(gè)濱河市供屉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌溺蕉,老刑警劉巖伶丐,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異疯特,居然都是意外死亡哗魂,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)漓雅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)录别,“玉大人,你說(shuō)我怎么就攤上這事故硅∈樱” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵吃衅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我腾誉,道長(zhǎng)徘层,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任利职,我火速辦了婚禮趣效,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘猪贪。我一直安慰自己跷敬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布热押。 她就那樣靜靜地躺著西傀,像睡著了一般斤寇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拥褂,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天娘锁,我揣著相機(jī)與錄音,去河邊找鬼饺鹃。 笑死莫秆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的悔详。 我是一名探鬼主播镊屎,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼茄螃!你這毒婦竟也來(lái)了杯道?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤责蝠,失蹤者是張志新(化名)和其女友劉穎党巾,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體霜医,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡齿拂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肴敛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片署海。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖医男,靈堂內(nèi)的尸體忽然破棺而出砸狞,到底是詐尸還是另有隱情,我是刑警寧澤镀梭,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布刀森,位于F島的核電站,受9級(jí)特大地震影響报账,放射性物質(zhì)發(fā)生泄漏研底。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一透罢、第九天 我趴在偏房一處隱蔽的房頂上張望榜晦。 院中可真熱鬧,春花似錦羽圃、人聲如沸乾胶。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)识窿。三九已至斩郎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腕扶,已是汗流浹背孽拷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留半抱,地道東北人脓恕。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像窿侈,于是被迫代替她去往敵國(guó)和親炼幔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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