程式設計筆記 objective c 宣告屬性

2021-08-26 21:48:23 字數 3060 閱讀 4379

屬性的宣告使用關鍵字@property。屬性的宣告可以是在@inte***ce類中的方法宣告塊的任何地方。@property同樣也可以在protocal(協議)和category(種類)中。其通用形式如下:

@property ( attributes) type name

由於英文property和attribute在漢語中都有屬性的含義,為了避免混淆,暫且不對這兩個詞彙進行翻譯。其中的attributes是用來描述名稱為name的property的屬性的;type表明了名稱為name的property的型別,這裡的型別可以是任何的objective-c的類和pod型別(關於pod參見:型別;name表示屬性的名稱。

其中,attribute可以是用逗號間隔的一組描述資訊 ,這一組描述資訊共同修飾後面的名稱為name的property。這些描述資訊可以分成如下幾種:

1. 訪問方法名稱相關

預設的setter()方法名稱為:set+屬性名稱 ;

預設的getter()方法名稱為:屬性名稱;

訪問方法的名稱可以通過以下的方式來進行顯示地指定:

指定setter()方法的名稱:setter =方法名稱;其中該方法應該是只有乙個引數,且引數的型別與property的型別一致;方法的返回型別必須是void型別。

指定getter()方法的名稱:getter = 方法名稱;其中該方法的返回值應該和該 property的型別一致,並且不需要返回值。

2. property的可讀寫性

預設情況下,property是可讀寫的:readwrite,也就是說getter和setter方法都是存在的。還可以指定property為readonly,即該 property是唯讀的。此時property就不應該有setter方法。(沒有看到過 writeonly的property,可能是因為這樣的property沒有什麼實際的用處吧。)

3. 關於setter的一些細節

下面的關鍵字用於描述setter方法應該如何設定property的值:

assign

表明setter方法只是進行簡單的賦值運算。這個是預設的。通常對於標量型別以及不屬於該類的物件使用assign來進行描述。比如delegate。(標量,scalar type是與aggregate type 相對而言的。scalar type代表的是乙個簡單的數值,如語言內建的資料型別基本上都是scalar type的;aggregate type代表的是相同型別的或者是不同型別的多個值,如陣列,結構體,類等。)

retain

表明setter方法應該對新的值傳送retain訊息,或者說呼叫新值的retain方法。舊值會被傳送release訊息。

copy

表明setter方法中在進行賦值時應該進行拷貝賦值。舊值會被傳送release訊息。通過呼叫新值的copy方法來賦值給該property。這種賦值方式只適用於物件型別,並且要求該物件遵循nscopying協議。

上述的這些關鍵字是相互排斥的,也就是說同時只能使用一種。

4. 關於多執行緒(原子性)

可以使用nonatomic關鍵字來表明該property是非原子的。預設情況下property都是原子的,這樣可以在多執行緒環境下提供對資料的安全訪問 。

另外,還有iboutlet關鍵字用來表示該property是inte***ce builder的乙個outlet。它不是正式的property attribute。

來看看在之前的程式中屬性name的型別為nsstring*,這不是乙個基本的資料型別,而name屬性本身是屬於student類的物件的,因此在預設的情況下name的setter方法將採用assign的方式進行賦值,這是不太合理的。採用retain的方式來進行賦值比較合理一些。修改上面的程式如下:

student.h:

[cpp]view plain

copy

#import

@inte***cestudent:nsobject

//增加retain關鍵字,按照記憶體管理的基本原則,在dealloc的時候需要傳送release訊息給name

@property(retain)nsstring*name;

@propertyfloat

math;

@propertyfloat

english;

-(id)initwithname:(nsstring*)anamemath:(float

)scoremathenglish:(

float

)scoreenglish;

//-(nsstring*)getname;

//-(float)getmath;

//-(float)getenglish;

@end

student.m如下:

[cpp]view plain

copy

#import"student.h"

@implementationstudent

@synthesizename;

@synthesizemath;

@synthesizeenglish;

-(id)init

return

self; }

-(id)initwithname:(nsstring*)anamemath:(float

)scoremathenglish:(

float

)scoreenglish

return

self; }

//-(nsstring*)getname //

////-(float)getmath //

////-(float)getenglish //

////-(void)dealloc //

-(void

)dealloc

@end

main.m保持不變。此時編譯,發現之前出現的編譯警告消失了。程式輸出結果如下:

name:tony

math:99.000000

math:89.980003

結果正確。

程式設計筆記 objective c 關於屬性

在c 中,通常需要編寫getter和setter方法來獲取或者是設定例項變數的值。這兩種方法需要在程式中顯示的完成。這種方式在objective c中也是適用的。但是objective c提供了一種更為便捷的方式來完成這種功能。它就是屬性。和c 中的顯示的getter和setter方法相比,屬性機制...

程式設計筆記 objective c 關於屬性

在c 中,通常需要編寫getter和setter方法來獲取或者是設定例項變數的值。這兩種方法需要在程式中顯示的完成。這種方式在objective c中也是適用的。但是objective c提供了一種更為便捷的方式來完成這種功能。它就是屬性。和c 中的顯示的getter和setter方法相比,屬性機制...

程式設計筆記 objective c 關於屬性

在c 中,通常需要編寫getter和setter方法來獲取或者是設定例項變數的值。這兩種方法需要在程式中顯示的完成。這種方式在objective c中也是適用的。但是objective c提供了一種更為便捷的方式來完成這種功能。它就是屬性。和c 中的顯示的getter和setter方法相比,屬性機制...