iOS 關(guān)鍵字

1.淺Copy:指針的復(fù)制,只是多了一個指向這塊內(nèi)存的指針宴猾,共用一塊內(nèi)存圆存。
深Copy:內(nèi)存的復(fù)制,兩塊內(nèi)存是完全不同的仇哆,
也就是兩個對象指針分別指向不同的內(nèi)存沦辙,互不干涉。

2.atomic是Objc使用的一種線程保護技術(shù)讹剔,
基本上來講油讯,是防止在寫未完成的時候被另外一個線程讀取,
造成數(shù)據(jù)錯誤延欠。而這種機制是耗費系統(tǒng)資源的陌兑,
所以在iPhone這種小型設(shè)備上,如果沒有使用多線程間的通訊編程由捎,
那么nonatomic是一個非常好的選擇兔综。

2.各種屬性的解析

weak:

<修飾Object類型,ARC下修飾delegate屬性>
1.在ARC環(huán)境下狞玛,所有指向這個對象的weak指針都將被置為nil软驰。

這個特性很有用,很多codeer都有被指針指向已釋放的對象所造成的EXC_BAD_ACCESS困擾過心肪,使用ARC以后锭亏,不論是strong還是weak類型的指針,都不會再指向一個已經(jīng)銷毀的對象蒙畴,從根本上解決了意外釋放導(dǎo)致的crash贰镣。

2.修飾Object類型,修飾的對象在釋放后膳凝,指針地址會被置為nil碑隆,是一種弱引用。在ARC環(huán)境下蹬音,為避免循環(huán)引用上煤,往往會把delegate屬性用weak修飾;在MRC下使用assign修飾著淆。weak和strong不同的是:當(dāng)一個對象不再有strong類型的指針指向它的時候劫狠,它就會被釋放拴疤,即使還有weak型指針指向它,那么這些weak型指針也將被清除独泞。

assign:

< 用于非指針變量呐矾。用于基礎(chǔ)數(shù)據(jù)類型 (例如NSInteger)和C數(shù)據(jù)類型(int, float, double, char, 等),另外還有id >
1.用于對基本數(shù)據(jù)類型進行復(fù)制操作懦砂,不更改引用計數(shù)蜒犯。也可以用來修飾對象,但是荞膘,被assign修飾的對象在釋放后罚随,指針的地址還是存在的,也就是說指針并沒有被置為nil羽资,成為野指針淘菩。如果后續(xù)在分配對象到堆上的某塊內(nèi)存時,正好分到這塊地址屠升,程序就會crash潮改。之所以可以修飾基本數(shù)據(jù)類型,因為基本數(shù)據(jù)類型一般分配在棧上弥激,棧的內(nèi)存會由系統(tǒng)自動處理进陡,不會造成野指針。

我們常見的id delegate往往是用assign方式的屬性而不是retain方式的屬性微服,賦值不會增加引用計數(shù)趾疚,就是為了防止delegation兩端產(chǎn)生不必要的循環(huán)引用。如果一個UITableViewController 對象a通過retain獲取了UITableView對象b的所有權(quán)以蕴,這個UITableView對象b的delegate又是a糙麦, 如果這個delegate是retain方式的,那基本上就沒有機會釋放這兩個對象了丛肮。自己在設(shè)計使用delegate模式時赡磅,也要注意這點。因為循環(huán)引用而產(chǎn)生的內(nèi)存泄露也是Instrument無法發(fā)現(xiàn)的宝与,所以要特別小心焚廊。

copy:

修飾NSString、NSArray习劫、NSDictionary等有對應(yīng)可變類型的對象
建立一個索引計數(shù)為1的對象咆瘟,然后釋放舊對象。

是內(nèi)容拷貝,會在內(nèi)存里拷貝一份對象诽里,兩個指針指向不同的內(nèi)存地址袒餐。一般用來修飾NSString、NSArray等有對應(yīng)可變類型的對象,因為他們有可能和對應(yīng)的可變類型(NSMutableString)之間進行賦值操作灸眼,為確保對象中的字符串不被修改 卧檐,應(yīng)該在設(shè)置屬性是拷貝一份。而若用strong修飾焰宣,如果對象在外部被修改了霉囚,會影響到屬性。

在不可變對象之間進行轉(zhuǎn)換匕积,strong與copy作用是一樣的佛嬉,但是如果在不可變與可變之間進行操作,我比較推薦copy,這也就是為什么很多地方用copy闸天,而不是strong修飾NSString,NSArray等存在對應(yīng)不可變類型的對象了,避免出現(xiàn)意外的數(shù)據(jù)操作.

strong

ARC下的strong等同于MRC下的retain都會把對象引用計數(shù)加1斜做。
1.在ARC環(huán)境下苞氮,只要某一對象被一個strong指針指向,該對象就不會被銷毀瓤逼。如果對象沒有被任何strong指針指向笼吟,那么就會被銷毀。在默認情況下霸旗,所有的實例變量和局部變量都是strong類型的贷帮。可以說strong類型的指針在行為上跟MRC下得retain是比較相似的

retain

釋放舊的對象诱告,將舊對象的值賦予輸入對象撵枢,再提高輸入對象的索引計數(shù)為1

在MRC中,你需要自己retain一個想要保持的對象精居,ARC環(huán)境下就不需要了〕荩現(xiàn)在唯一要做的就是用一個指針指向這個對象,只要指針沒有被重置為空靴姿,對象就會一直在堆上沃但。當(dāng)指針指向新值的時候,原來的對象就會被release一次佛吓。這對實例變量宵晚,sunthesize的變量或者是局部變量都是實用的。

3.屬性之間區(qū)別

在iOS開發(fā)中我們知道一般nsstring维雇,就用copy淤刃,定義一個模型對象,就用strong谆沃,只是賦值的钝凶,例如int、double、char 以及CGRect類似的就用assign耕陷。但具體為什么可能很多人不是很清楚掂名。
這里進行簡單的解釋:
這些關(guān)鍵字基本上是針對屬性的set方法。
當(dāng)用copy時哟沫,set方法會先release舊值饺蔑,再copy一個新的對象,reference count 為1(減少了對上下文的依賴)嗜诀;當(dāng)用assign猾警,直接賦值,無retain操作隆敢。當(dāng)用retain决摧,release舊值,retain新值宰翅;

strong與weak的區(qū)別

strong類似于retain霎迫,會將對象的引用計數(shù)器+1,分配內(nèi)存地址温自。
weak類似于指針玄货,只是單純的指向某個地址,但是本身并未分配內(nèi)存地址悼泌。當(dāng)指向的地址被銷毀時松捉,該指針會自動nil。
例子:

@synthesize string1;
@synthesize string2;
來猜一下馆里,下面輸出是什么隘世?

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

分析一下,由于self.string1與self.string2指向同一地址鸠踪,且string2沒有retain內(nèi)存地址以舒,而 self.string1=nil釋放了內(nèi)存,所以string1為nil慢哈。聲明為weak的指針蔓钟,指針指向的地址一旦被釋放,這些指針都將被賦值為 nil卵贱。這樣的好處能有效的防止野指針滥沫。在c/c++開發(fā)過程中,指針的空間釋放了后键俱,都要將指針賦為NULL. 在這兒用weak關(guān)鍵字做了這一步兰绣。

assign和weak的區(qū)別

對于assign來說,一是非指針變量编振,比如說NSInteger之類的基礎(chǔ)數(shù)據(jù)類型缀辩、C數(shù)據(jù)類型,還有就是避免出現(xiàn)循環(huán)引用的時候,
對于weak臀玄,其和assign差不多瓢阴,但是它多了一點,就是健无,它會自動對該類型變量設(shè)置為nil荣恐。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市累贤,隨后出現(xiàn)的幾起案子叠穆,更是在濱河造成了極大的恐慌,老刑警劉巖臼膏,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硼被,死亡現(xiàn)場離奇詭異,居然都是意外死亡渗磅,警方通過查閱死者的電腦和手機祷嘶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夺溢,“玉大人,你說我怎么就攤上這事烛谊》缦欤” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵丹禀,是天一觀的道長状勤。 經(jīng)常有香客問我,道長双泪,這世上最難降的妖魔是什么持搜? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮焙矛,結(jié)果婚禮上葫盼,老公的妹妹穿的比我還像新娘。我一直安慰自己村斟,他們只是感情好贫导,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蟆盹,像睡著了一般孩灯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逾滥,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天峰档,我揣著相機與錄音,去河邊找鬼。 笑死讥巡,一個胖子當(dāng)著我的面吹牛掀亩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播尚卫,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼归榕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吱涉?” 一聲冷哼從身側(cè)響起刹泄,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎怎爵,沒想到半個月后特石,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡鳖链,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年姆蘸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芙委。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡逞敷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出灌侣,到底是詐尸還是另有隱情推捐,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布侧啼,位于F島的核電站牛柒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏痊乾。R本人自食惡果不足惜皮壁,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哪审。 院中可真熱鬧蛾魄,春花似錦、人聲如沸湿滓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茉稠。三九已至描馅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間而线,已是汗流浹背铭污。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工恋日, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嘹狞。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓岂膳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親磅网。 傳聞我的和親對象是個殘疾皇子谈截,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

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