在開發過程中經常要用到定義屬性,@property和@synthesize是經常用到的關鍵字,那麼到底該如何正確定義乙個屬性呢,我們需要了解其中用到的關鍵字。
atomic: 原子操作(原子性是指事務的乙個完整操作,操作成功就提交,反之就回滾. 原子操作就是指具有原子性的操作)在objective-c 屬性設定裡面預設的就是atomic,意思就是setter/getter函式是乙個原子操作,如果多執行緒同時呼叫setter時,不會出現某乙個執行緒執行完setter所有語句之前,另乙個執行緒就開始執行setter,相當於函式頭尾加了鎖. 這樣的話併發訪問效能會比較低.
nonatomic: 非原子操作 一般不需要多執行緒支援的時候就用它,這樣在併發訪問的時候效率會比較高. 在objective-c裡面通常物件型別都應該宣告為非原子性的. ios中程式啟動的時候系統只會自動生成乙個單一的主線程.程式在執行的時候一般情況下是在同乙個執行緒裡面對乙個屬性進行操作. 如果在程式中我們確定某乙個屬性會在多執行緒中被使用,並且需要做資料同步,就必須設定成原子性的,但也可以設定成非原子性的,然後自己在程式中用加鎖之類的來做資料同步.通常說nonatomic 是提高在非多執行緒應用中的讀寫效率
在標頭檔案中宣告屬性的時候使用atomic 和 nonatomic等價於在標頭檔案裡面新增2個函式乙個是用於設定這個屬性的,乙個是用於讀取這個屬性,例如:- (nsstring *)name; - (void)setname:(nsstring *)str;
atomic / nonatomic 需要和@synthesize/@dynamic配和使用才有意義.
@synthesize如果不實現setter和getter方法,編譯器將會自動在生產setter和getter方法。
@dynamic表示變數對應的屬性訪問器方法,是動態實 現的,你需要在nsobject 中繼承而來的+(bool) resolveinstancemethod:(sel) sel 方法中指定動態實現的方法或者函式。
屬性修飾其他關鍵字:
getter=gettername
指定get方法,並需要實現這個方法。必須返回與宣告型別相同的變數,沒有引數
setter=settername
指定set方法,並需要實現這個方法。帶乙個與宣告型別相同的引數,沒有返回值(返回空值)
當宣告為readonly的時候,不能指定set方法
readwrite
如果沒有宣告成readonly,那就預設是readwrite。可以用來賦值,也可以被賦值
readonly
不可以被賦值
assign
所有屬性都預設assign,通常用於標量(簡單變數 int, float,cgrect等),只是簡單的傳遞指標.
一種典型情況是用在對物件沒有所有權的時候,通常是delegate,避免造成死迴圈(如果用retain的話會死迴圈)
retain
屬性必須是objc物件,擁有物件所有權,必須在dealloc中release一次,是在傳遞指標後 retaincount +1。
copy
屬性必須是objc物件,擁有物件所有權,必須在dealloc中release一次。且屬性必須實現nscopying協議
一般常用於nsstring型別,是建立分配乙個新的空間,從原址的內容複製內容過來
dealloc 後relase的事情,建議是在每個 object的 m檔案裡 成對的建立和銷毀變數.誰建立,誰負責銷毀,誰retain 誰來release
iOS開發之NSURLSession詳解
viewcontroller.m nsurlsession created by wang on 15 12 30.import viewcontroller.h inte ce viewcontroller property nonatomic,retain nsmutabledata recei...
iOS開發之AppDelegate詳解
說明 當應用程式進入活動狀態時執行,這個剛好跟上面那個方法相反 說明 當程式被推送到後台的時候呼叫。所以要設定後台繼續執行,則在這個函式裡面設定即可 說明 當程式從後台將要重新回到前台時候呼叫,這個剛好跟上面的那個方法相反。協議中其他定義的方法的作用 說明 當系統時間發生改變時執行 說明 當程式載入...
IOS 開發之UISearchBar 詳解及例項
ios uisearchbar 詳解 iphone開發之uisearchbar學習是本文要學習的內容,主要介紹了uisearchbar的使用,不多說,我們先來看詳細內容。關於uisearchbar的一些問題。1 修改uisearchbar的背景顏色 uisearchbar是由兩個subview組成的...