自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

iOS開發(fā)中各種關(guān)鍵字的區(qū)別

移動(dòng)開發(fā)
淺Copy:指針的復(fù)制,只是多了一個(gè)指向這塊內(nèi)存的指針,共用一塊內(nèi)存。深Copy:內(nèi)存的復(fù)制,兩塊內(nèi)存是完全不同的.....本文為您介紹iOS開發(fā)中各種關(guān)鍵字的區(qū)別。

一、一些概念

  • 淺Copy:指針的復(fù)制,只是多了一個(gè)指向這塊內(nèi)存的指針,共用一塊內(nèi)存。
  • 深Copy:內(nèi)存的復(fù)制,兩塊內(nèi)存是完全不同的,

也就是兩個(gè)對(duì)象指針分別指向不同的內(nèi)存,互不干涉。

[[207056]]

atomic是Objc使用的一種線程保護(hù)技術(shù),

  • 基本上來(lái)講,是防止在寫未完成的時(shí)候被另外一個(gè)線程讀取,
  • 造成數(shù)據(jù)錯(cuò)誤。而這種機(jī)制是耗費(fèi)系統(tǒng)資源的,

所以在iPhone這種小型設(shè)備上,如果沒有使用多線程間的通訊編程,那么nonatomic是一個(gè)非常好的選擇。

二、各種屬性的解析

weak:

<修飾Object類型,ARC下修飾delegate屬性>

1.在ARC環(huán)境下,所有指向這個(gè)對(duì)象的weak指針都將被置為nil。

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

2.修飾Object類型,修飾的對(duì)象在釋放后,指針地址會(huì)被置為nil,是一種弱引用。在ARC環(huán)境下,為避免循環(huán)引用,往往會(huì)把delegate屬性用weak修飾;在MRC下使用assign修飾。weak和strong不同的是:當(dāng)一個(gè)對(duì)象不再有strong類型的指針指向它的時(shí)候,它就會(huì)被釋放,即使還有weak型指針指向它,那么這些weak型指針也將被清除。

assign:

< 用于非指針變量。用于基礎(chǔ)數(shù)據(jù)類型 (例如NSInteger)和C數(shù)據(jù)類型(int, float, double, char, 等),另外還有id >

1.用于對(duì)基本數(shù)據(jù)類型進(jìn)行復(fù)制操作,不更改引用計(jì)數(shù)。也可以用來(lái)修飾對(duì)象,但是,被assign修飾的對(duì)象在釋放后,指針的地址還是存在的,也就是說(shuō)指針并沒有被置為nil,成為野指針。如果后續(xù)在分配對(duì)象到堆上的某塊內(nèi)存時(shí),正好分到這塊地址,程序就會(huì)crash。之所以可以修飾基本數(shù)據(jù)類型,因?yàn)榛緮?shù)據(jù)類型一般分配在棧上,棧的內(nèi)存會(huì)由系統(tǒng)自動(dòng)處理,不會(huì)造成野指針。

我們常見的id delegate往往是用assign方式的屬性而不是retain方式的屬性,賦值不會(huì)增加引用計(jì)數(shù),就是為了防止delegation兩端產(chǎn)生不必要的循環(huán)引用。如果一個(gè)UITableViewController 對(duì)象a通過(guò)retain獲取了UITableView對(duì)象b的所有權(quán),這個(gè)UITableView對(duì)象b的delegate又是a, 如果這個(gè)delegate是retain方式的,那基本上就沒有機(jī)會(huì)釋放這兩個(gè)對(duì)象了。自己在設(shè)計(jì)使用delegate模式時(shí),也要注意這點(diǎn)。因?yàn)檠h(huán)引用而產(chǎn)生的內(nèi)存泄露也是Instrument無(wú)法發(fā)現(xiàn)的,所以要特別小心。

copy:

修飾NSString、NSArray、NSDictionary等有對(duì)應(yīng)可變類型的對(duì)象

建立一個(gè)索引計(jì)數(shù)為1的對(duì)象,然后釋放舊對(duì)象。

是內(nèi)容拷貝,會(huì)在內(nèi)存里拷貝一份對(duì)象,兩個(gè)指針指向不同的內(nèi)存地址。一般用來(lái)修飾NSString、NSArray等有對(duì)應(yīng)可變類型的對(duì)象,因?yàn)樗麄冇锌赡芎蛯?duì)應(yīng)的可變類型(NSMutableString)之間進(jìn)行賦值操作,為確保對(duì)象中的字符串不被修改 ,應(yīng)該在設(shè)置屬性是拷貝一份。而若用strong修飾,如果對(duì)象在外部被修改了,會(huì)影響到屬性。

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

strong

ARC下的strong等同于MRC下的retain都會(huì)把對(duì)象引用計(jì)數(shù)加1。

1.在ARC環(huán)境下,只要某一對(duì)象被一個(gè)strong指針指向,該對(duì)象就不會(huì)被銷毀。如果對(duì)象沒有被任何strong指針指向,那么就會(huì)被銷毀。在默認(rèn)情況下,所有的實(shí)例變量和局部變量都是strong類型的??梢哉f(shuō)strong類型的指針在行為上跟MRC下得retain是比較相似的

retain

釋放舊的對(duì)象,將舊對(duì)象的值賦予輸入對(duì)象,再提高輸入對(duì)象的索引計(jì)數(shù)為1

在MRC中,你需要自己retain一個(gè)想要保持的對(duì)象,ARC環(huán)境下就不需要了?,F(xiàn)在唯一要做的就是用一個(gè)指針指向這個(gè)對(duì)象,只要指針沒有被重置為空,對(duì)象就會(huì)一直在堆上。當(dāng)指針指向新值的時(shí)候,原來(lái)的對(duì)象就會(huì)被release一次。這對(duì)實(shí)例變量,sunthesize的變量或者是局部變量都是實(shí)用的。

三、屬性之間區(qū)別

在iOS開發(fā)中我們知道一般nsstring,就用copy,定義一個(gè)模型對(duì)象,就用strong,只是賦值的,例如int、double、char 以及CGRect類似的就用assign。但具體為什么可能很多人不是很清楚。

這里進(jìn)行簡(jiǎn)單的解釋:

  • 這些關(guān)鍵字基本上是針對(duì)屬性的set方法。
  • 當(dāng)用copy時(shí),set方法會(huì)先release舊值,再copy一個(gè)新的對(duì)象,reference count 為1(減少了對(duì)上下文的依賴);當(dāng)用assign,直接賦值,無(wú)retain操作。當(dāng)用retain,release舊值,retain新值;

strong與weak的區(qū)別

  • strong類似于retain,會(huì)將對(duì)象的引用計(jì)數(shù)器+1,分配內(nèi)存地址。
  • weak類似于指針,只是單純的指向某個(gè)地址,但是本身并未分配內(nèi)存地址。當(dāng)指向的地址被銷毀時(shí),該指針會(huì)自動(dòng)nil。

例子:

  • @synthesize string1;
  • @synthesize string2;

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

 

  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ā)過(guò)程中,指針的空間釋放了后,都要將指針賦為NULL. 在這兒用weak關(guān)鍵字做了這一步。

assign和weak的區(qū)別

  • 對(duì)于assign來(lái)說(shuō),一是非指針變量,比如說(shuō)NSInteger之類的基礎(chǔ)數(shù)據(jù)類型、C數(shù)據(jù)類型,還有就是避免出現(xiàn)循環(huán)引用的時(shí)候,
  • 對(duì)于weak,其和assign差不多,但是它多了一點(diǎn),就是,它會(huì)自動(dòng)對(duì)該類型變量設(shè)置為nil。

PS:***如果各位大佬發(fā)現(xiàn)那里有問題歡迎批評(píng)指出,覺得有用點(diǎn)個(gè)喜歡~

責(zé)任編輯:未麗燕 來(lái)源: DDB_CS
相關(guān)推薦

2013-03-28 15:19:31

assign、copy

2022-05-06 08:32:40

Pythonwith代碼

2012-06-02 00:53:39

Javafinally

2020-08-10 08:00:13

JavaFinal關(guān)鍵字

2023-11-19 22:52:42

2023-03-24 08:01:27

Go語(yǔ)言內(nèi)存

2011-06-14 13:26:27

volatile

2024-02-23 18:04:37

C++const關(guān)鍵字

2024-11-20 15:55:57

線程Java開發(fā)

2011-07-14 23:14:42

C++static

2021-01-05 10:26:50

鴻蒙Javafinal

2010-01-26 14:35:11

C++關(guān)鍵字

2019-12-17 08:16:04

JavaScriptthis編程

2023-12-11 13:59:00

YieldPython生成器函數(shù)

2024-01-07 20:15:49

Python編程語(yǔ)言

2024-03-15 15:12:27

關(guān)鍵字底層代碼

2022-11-12 18:32:50

Golangomitemptyjson

2021-02-01 13:10:07

Staticc語(yǔ)言UNIX系統(tǒng)

2022-02-17 08:31:38

C語(yǔ)言staic關(guān)鍵字

2025-01-09 10:30:40

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)