Object C屬性訪問

2021-06-18 17:11:13 字數 1378 閱讀 2969

object-c 2.0引入了屬性的概念,使得我們可以通過點方法來訪問物件的成員變數。假設有乙個類為

a, 該類有乙個成員物件為

mtest

,mtest

是乙個型別為

b的物件,現在已經有了乙個

a類的例項物件為

a,為了能夠用

a.mtest 

這樣的方式,我們需要做到以下兩點:

一、在標頭檔案中用以下方式將mtest宣告為屬性

宣告屬性的語法:@property 型別 名字

比如我們可以這樣寫:@property(readwrite,nonatomic, retain) b *mtest;

這樣的宣告,最容易讓人迷惑的是型別部分,其實屬性主要分為三類: 

1. 讀寫屬性(readwrite/ readonly)

預設為readwrite,表示該屬性既可以讀取,也可以給該屬性變數賦值;readonly則表示只能讀取該屬性變數。

2. 原子屬性 (atomicity/nonatomic)

原子屬性中,atomic是預設值,表示屬性是原子的,支援多執行緒併發訪問(在setter實現中加入了同步鎖),後者是非原子的,適合在非多執行緒環境中提公升效率,沒有加入同步鎖。

3. setter屬性 (assign/retain/copy)

如果屬性是物件型別,你需要使用retain,assign,copy引數,表示setter方法內部實現的時候,持有物件的方式。其中retain就是增加引用計數,強引用型別。assign就是變數的直接賦值,弱引用型別,也是預設值。copy就是把setter的引數複製一遍,再賦給成員變數。 如果你不給出持有物件的方式,編譯器就會給出警告。

屬性的setter型別與記憶體管理密切相關,要相當謹慎使用,很多記憶體錯誤以及程式的莫名其妙崩潰都是由於對屬性的不正確使用造成的。

二、在.m 檔案中用以下方式合成對應的屬性讀取和設定函式

@synthesize mtest;

.m檔案中有了上面這樣一行,編譯器就會自動合成getter函式,如果屬性是可賦值的(即屬性型別為readwrite),還會合成setter

函式。編譯器合成的getter函式名與屬性名相同,合成的setter函式名則形如setmtest(即將屬性的首字母大寫)。

實際上,我們也可以不用編譯器來幫我們合成方法,自己來實現屬性的訪問方法。為了這樣做,我們需要將@synthesize mtest; 這句去掉,同時在.m檔案中實現以下兩個函式:

[cpp]view plain

copy

- (b *) mtest  

- void

setmtest:(b*) b    

自己去實現訪問方法是違背了屬性的初衷的,一般不採用,給大家講這個只是為了說明問題,僅此而已。

Object C 屬性引數

assign 預設引數setter 方法不會引起引用計數的變化 retain setter方法首先釋放舊的物件,將舊物件的值賦予輸入物件,再提高輸入物件的引用計數為1 copy setter 方法首先建立了乙個相同的物件,先物件引用計數為1舊物件引用計數無變化 arc中 strong retain ...

Object c 設定器與訪問器

設定器與訪問器 隱藏了例項變數 2.控制例項變數的讀寫 3.做正確性的校驗 對於設定器和訪問器來說,其命名規則 1.設定器 void set 首字母大寫的例項變數名 例項變數的返回值型別 去掉下劃線的例項變數名 2.訪問器 例項變數的返回值型別 去掉下劃線的例項變數名 note 對於類的名稱,其首字...

Python 屬性訪問

對於 python 而言,我們知道可以使用 property 這樣的decorator 來實現對於類的屬性訪問的控制。但是這種方法存在乙個限制,即,沒有乙個屬性需要進行屬性控制,就必須新增類似於如下的幾行語句 property defwidth self returnself.width 其實,我們...