IOS基礎知識梳理(1)

2021-07-03 14:43:37 字數 3437 閱讀 1628

readwrite,readonly,assign,retain,copy,nonatomic等等屬性的作用?

readwrite:此標記說明屬性會被當成讀寫的,這也是預設屬性。設定器和讀取器都需要在@implementation中實現。如果使用@synthesize關鍵字,讀取器和設定器都會被解析。表示既有getter,又有setter。

readonly:此標記說明屬性是唯讀的,預設的標記是讀寫,如果你指定了唯讀,在@implementation中只需要乙個讀取器。或者如果你使用@synthesize關鍵字,也是有讀取器方法被解析。而且如果你試圖使用點操作符為屬性賦值,你將得到乙個編譯錯誤。表示只有getter方法。

assign: 簡單賦值,不更改索引計數

對基礎資料型別 (例如nsinteger,cgfloat)和c資料型別(int, float, double, char, 等) 適用簡單資料型別

此標記說明設定器直接進行賦值,這也是預設值。

retain:釋放舊的物件,將舊物件的值賦予輸入物件,再提高輸入物件的索引計數為1

對其他nsobject和其子類

對引數進行release舊值,再retain新值

指定retain會在賦值時喚醒傳入值的retain訊息。此屬性只能用於objective-c物件型別,而不能用於core foundation物件。(原因很明顯,retain會增加物件的引用計數,而基本資料型別或者core foundation物件都沒有引用計數)。

注意: 把物件新增到陣列中時,引用計數將增加物件的引用次數+1。

copy:建立乙個索引計數為1的物件,然後釋放舊物件 對nsstring

對nsstring 它指出,在賦值時使用傳入值的乙份拷貝。拷貝工作由copy方法執行,此屬性只對那些實行了nscopying協議的物件型別有效。

assign與retain:

假設你用malloc分配了一塊記憶體,並且把它的位址賦值給了指標a,後來你希望指標b也共享這塊記憶體,於是你又把a賦值給(assign)了b。此時a和b指向同一塊記憶體,請問當a不再需要這塊記憶體,能否直接釋放它?答案是否定的,因為a並不知道b是否還在使用這塊記憶體,如果a釋放了,那麼b在使用這塊記憶體的時候會引起程式crash掉。使用引用計數(reference counting),還是上面的那個例子,我們給那塊記憶體設乙個引用計數,當記憶體被分配並且賦值給a時,引用計數是1。當把a賦值給b時引用計數增加到2。這時如果a不再使用這塊記憶體,它只需要把引用計數減1,表明自己不再擁有這塊記憶體。b不再使用這塊記憶體時也把引用計數減1。當引用計數變為0的時候,代表該記憶體不再被任何指標所引用,系統可以把它直接釋放掉。這就是assign和retain的區別,assign就是直接賦值,當資料為int, float等原生型別時,可以使用assign。retain使用了引用計數,retain引起引用計數加1, release引起引用計數減1,當引用計數為0時,dealloc函式被呼叫,記憶體被**。

copy與retain:

copy其實是建立了乙個相同的物件,而retain不是:

比如乙個nsstring物件,位址為0×1111,內容為@」str」

copy到另外乙個nsstring之後,位址為0×2222,內容相同,新的物件retain為1,舊有物件沒有變化

retain到另外乙個nsstring之後,位址相同(建立乙個指標,指標拷貝),內容當然相同,這個物件的retain值+1

也就是說,retain是指標拷貝,copy是內容拷貝。

retain的set方法是淺複製,copy的set方法應該是深複製了

copy另乙個用法:

copy是內容的拷貝 ,對於像nsstring,的確是這樣.

但是,如果是copy的是乙個nsarray呢?比如,

nsarray *array = [nsarray arraywithobjects:@」hello」,@」world」,@」baby」];

nsarray *array2 = [array copy];

這個時候,,系統的確是為array2開闢了一塊記憶體空間,但是我們要認識到的是,array2中的每個元素,,只是copy了指向array中相對應元素的指標.這便是所謂的」淺複製」.

nonatomic:非原子性訪問,對屬性賦值的時候不加鎖,多執行緒併發訪問會提高效能。如果不加此屬性,則預設是兩個訪問方法都為原子型事務訪問。atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作。

atomic: 設定成員變數的@property屬性時,預設為atomic,提供多執行緒安全。在多執行緒環境下,原子操作是必要的,否則有可能引起錯誤的結果。加了atomic,setter函式會變成下面這樣:

if (property != newvalue)

nonatomic禁止多執行緒,變數保護,提高效能。

atomic是objc使用的一種執行緒保護技術,基本上來講,是防止在寫未完成的時候被另外乙個執行緒讀取,造成資料錯誤。而這種機制是耗費系統資源的,所以在iphone這種小型裝置上,如果沒有使用多執行緒間的通訊程式設計,那麼nonatomic是乙個非常好的選擇。指出訪問器不是原子操作,而預設地,訪問器是原子操作。這也就是說,在多執行緒環境下,解析的訪問器提供乙個對屬性的安全訪問,從獲取器得到的返回值或者通過設定器設定的值可以一次完成,即便是別的執行緒也正在對其進行訪問。如果你不指定 nonatomic ,在自己管理記憶體的環境中,解析的訪問器保留並自動釋放返回的值,如果指定了 nonatomic ,那麼訪問器只是簡單地返回這個值。

weak 和 strong 屬性只有在你開啟arc時才會被要求使用,這時你是不能使用retain release autorelease 操作的,因為arc會自動為你做好這些操作,但是你需要在物件屬性上使用weak 和strong,其中strong就相當於retain屬性,而weak相當於assign。

只有一種情況你需要使用weak(預設是strong),就是為了避免retain cycles(就是父類中含有子類,子類中又呼叫了父類,這樣都無法release)

arc是ios 5推出的功能,全稱叫 arc(automatic reference counting)。簡單地說,就是**中自動加入了retain/release,原先需要手動新增的用來處理記憶體管理的引用計數的**可以自動地由編譯器完成了。

該機能在 ios 5/ mac os x 10.7 開始匯入,利用 xcode4.2 以後可以使用該特性。

什麼時候用assign

基礎型別(簡單型別,原子型別):nsinteger,cgpoint,cgfloat,c資料型別(int,float,double,char等)

什麼時候用copy

含有可深拷貝的mutable子類的類,如nsarray,nsset,nsdictionary,nsdata的,nscharacterset,nsindexset,nsstring

(可深度拷貝的房子)

但是nsmutablearray這樣的不可以,mutable的不能用copy,不然初始化會有問題。切記

什麼時候用retain

其他nsobject和其子類物件 (大多數)

IOS基礎知識梳理(2)

堆和棧的區別 管理方式 對於棧來講,是由編譯器自動管理,無需我們手工控制 對於堆來說,釋放工作由程式設計師控制,容易產生memory leak。申請大小 棧 在windows下,棧是向低位址擴充套件的資料結構,是一塊連續的記憶體的區域。這句話的意思是棧頂的位址和棧的最大容量是系統 預先規定好的,在w...

IP基礎知識梳理

離開學校後看書少了很多,發現掌握的ip知識不是很牢,所以在這裡也稍稍梳理下,感覺語言也沒書本上詳盡 完全是筆記形式,望讀者勿噴 ip層 網路層也叫internet層,負責將分組報文從源端傳送到目的端。作用 tcp ip模型 參考 即整個網路上傳送的二進位制資料總結為如下格式 後的鏈路配置為trunk...

jQuery基礎知識梳理

語法 jquery語法是為html元素的選取編制的,可以對元素執行某些操作。基礎語法 selector action 美元符號定義jquery 選擇符 selector 查詢 和 查詢 html元素 jquery的action 執行對元素的操作 文件就緒函式 為防止文件在完全載入之前裕興jquery...