OC 屬性與成員變數的簡單介紹與區別

2021-06-23 03:43:22 字數 2014 閱讀 5422

@property和@synthesize可以自動生成某個類成員變數的訪問方法

readwrite:這個屬性是預設的情況,會自動為你生成訪問器

assign:這個屬性一般用來處理基礎型別,比如int、float等等,如果你宣告的屬性是基礎型別的話,assign是預設的,你可以不加這個屬性

natomic:預設是有該屬性的,這個屬性是為了保證程式在多執行緒情況,編譯器會自動生成一些互斥加鎖**,避免該變數的讀寫不同步問題

readonly:只生成getter不會有setter方法

copy:這個會自動生成你賦值物件的轉殖,相當於在記憶體中新生成了該物件的副本,這樣一來,改變賦值物件就不會改變你宣告的這個成員變數了

retain:會自動retain賦值物件

nonatomic:如果該物件無需考慮多執行緒的情況,**入這個屬性,這樣會讓編譯器少生成一些互斥加鎖**,可以提高效率

以上內容來自:

assign:指定setter方法用簡單的賦值,這是預設操作。你可以對標量型別(如int)使用這個屬性。你可以想象乙個float,它不是乙個物件,所以它不能retain、copy。

assign:簡單賦值,不更改索引計數(reference counting).使用assign: 對基礎資料型別 (nsinteger)和c資料型別(int, float, double, char,等)

retain:指定retain應該在後面的物件上呼叫,前乙個值傳送一條release訊息。你可以想象乙個nsstring例項,它是乙個物件,而且你可能想要retain它。

retain:釋放舊的物件,將舊物件的值賦予輸入物件,再提高輸入物件的索引計數為1 ,使用retain: 對其他nsobject和其子類 ,retain,是說明該屬性在賦值的時候,先release之前的值,然後再賦新值給屬性,引用再加1。

copy:指定應該使用物件的副本(深度複製),前乙個值傳送一條release訊息。基本上像retain,但是沒有增加引用計數,是分配一塊新的記憶體來放置它。copy是建立乙個新物件,retain是建立乙個指標,引用物件計數加1。copy:建立乙個索引計數為1的物件,然後釋放舊物件,copy是建立乙個新物件,retain是建立乙個指標,引用物件計數加1。

readonly:將只生成getter方法而不生成setter方法(getter方法沒有get字首)

。readwrite:預設屬性,將生成不帶額外引數的getter和setter方法(setter方法只有乙個引數)

。atomic:對於物件的預設屬性,就是setter/getter生成的方法是乙個原子操作。如果有多個執行緒同時呼叫setter的話,不會出現某乙個執行緒執行setter全部語句之前,另乙個執行緒開始執行setter的情況,相關於方法頭尾加了鎖一樣。

nonatomic:不保證setter/getter的原子性,多執行緒情況下資料可能會有問題。nonatomic,非原子性訪問,不加同步,多執行緒併發訪問會提高效能。先釋放原先變數,再將新變數    retain然後賦值;

注意,如果不加此屬性,則預設是兩個訪問方法都為原子型事務訪問。

以上內容來自:

面對這個問題我之前也含糊不清,隨著不斷地嘗試、看網上其他人的解答、**量的增加,大致總結以下內容。希望有所幫助。

成員變數是不與外界接觸的變數,應用於類的內部,如果你說那用@public外部不就是可以訪問了麼。簡單的說public只能適當使用,不要氾濫,否則就像你把鑰匙插在你自己家門上了。誰來都可以開門。毫無安全性。

由於成員變數的私有性,為了解決外部訪問的問題就有了屬性變數。屬性變數個人認為最大的好處就是讓其他物件訪問這個變數。而且你可以設定唯讀、可寫等等屬性,同時設定的方法我們也可以自己定義。記住一點,

屬性變數主要是用於與其他物件相互互動的變數。

如果對於上面所說還是含糊不清那就記住這幾點吧!

1.只有類內使用,屬性為private,那麼就定義成員變數。

2.如果你發現你需要的這個屬性需要是public的,那麼毫不猶豫就用屬性在.h中定義。

3.當你自己內部需要setter實現一些功能的時候,用屬性在.m中定義。

4.當你自己內部需要getter實現一些功能的時候,用屬性在.m中定義。

OC中類的屬性與成員變數的區別

先看一段 inte ce viewcontroller uiviewcontroller 屬性 property nonatomic,strong nsarray array2 end 成員變數,本例中的是例項成員變數,是作用於整個類物件內的。從生命週期來看,它比區域性變數要長一些,但它預設是私有的...

Category新增屬性與成員變數

category是objective c中常用的語法特性,通過它可以很方便的為已有的類來新增函式。但是category不允許為已有的類新增新的屬性或者成員變數。一種常見的辦法是通過runtime.h中objc getassociatedobject objc setassociatedobject來...

成員變數與屬性是不同的

成員變數 在類體的變數部分中定義的變數,也稱為字段 屬性 官方定義為屬性是指get或者set方法名 去掉get或者set後,把剩餘的部分首字母改為小寫後,即為這個類的屬性 例 public class test private string name public void setname stri...