Objective C中的屬性機制

2021-09-06 17:16:46 字數 3397 閱讀 5583

objective-c 2.0中的屬性機制為我們提供了便捷的獲取和設定例項變數的方式,也可以說屬性為我們提供了乙個預設的設定器和訪問器的實現。在學習oc中屬性之前我們先要知道為什麼要為變數實現getter和setter方法,我們先來了解一下例項的作用域。

例項變數的作用域如下:

1. @public : 共有的,該例項變數誰都可以訪問;

2.@protected :受保護的,該例項變數只能在該類和其子類內訪問,父類protected的例項變數在子類中是private的預設是protected;

3.@private: 私有的,該例項變數只能在該類的內部訪問;

因為要用protected 或者 private來隱藏類的內部細節,用類或者物件是沒法直接訪問被隱藏的細節的,所以要用getter和setter來訪問被隱藏的例項變數,oc中的屬性機制就為我們提供了預設的getter和setter方法。下面我們要學習一下oc中的屬性機制。

屬性的定義和實現

1.屬性的定義

屬性的定義用編譯器命令@property來定義,比如要為私有的變數 int a;定義getter和setter方法,@property int a;  用@property會自動的為修飾的變數加上

getter和setter方法。

demo如下:  

1

2

3

4

5

6

7

8

9

10

11

@inte***ce student : nsobject

//定義屬性

@property nsstring *name;

@propertyintidnumber;

//定義其他方法

@end

2.屬性的實現

在實現檔案中我們用@synthesize來實現,用@synthesize來修飾相應的變數就起到類getter 和 setter 的方法實現的作用。用@synthesize也可以給函式改名用@synthesize name = othername; 就可以給方法改名。

demo如下

1

2

3

4

@implementation student

@synthesize name, idnumber;

//其他方法的實現

@end

​    ​3.定義後屬性的使用

​    ​在使用getter和setter方法時有一點要注意:以neme為例,getter方法名為 name, 而setter的名為 setname;在使用getter和setter方法時和普通的函式用法一樣

1

2

3

4

//呼叫name的setter方法

[student setname : @"ludashi"];

//呼叫name的getter方法

nsstring *name = [student name];

​    ​getter和setter方法也可以用點語法來實現

1

2

3

4

5

//name的setter方法也可以這樣寫

student.name  =  @「ludashi」;

//name的getter方法也可以這樣寫

nsstring *name = student.name;

​     ​    上面呼叫getter和setter方法的方式看著想是直接操作類的屬性,其實不然,也是通過方法來操作的。

​4.property有關的語法

​    ​1.自定義訪問方法名

​    ​    ​系統預設的存方法是setpropertyname, 預設的取方法是propertyname。可以用以下方式來更改setter和getter方法的名字

​    ​    ​(1)用getter = gettername來指定getter自定義的名稱

​    ​    ​    ​    ​demo:  @property (getter = gettername) nsstring *name;

​    ​    ​(2)用setter = settername來指定setter自定義方法的名稱

​    ​    ​    ​    ​demo: @property (setter = settername) nsstring *name;

​    ​2. property的可讀寫性

​    ​    ​property的可讀寫性決定屬性是否有setter方法

​    ​    ​(1)readwrite : 指定屬性是可讀寫的,這是預設值,因此可以省略

​    ​    ​    ​    ​  @property (readwrite) nsstring *name;

​    ​    ​  (2) readonly : 指明屬性是唯讀的。系統不會setter方法,但有getter方法

​    ​    ​    ​    ​  @property (readonly) nsstring *name;

​   3.用於setter中的語義 :決定了以何種方式對資料成員賦予新值

strong : 表示強引用關係,即擁有物件的所有權。

weak : 表示弱引用,不擁有物件的所有權,當目標物件被銷毀之後,屬性值會被自動設為nil;

​    ​    ​assign(賦值): 直接賦值,計數器不會加一,簡單的賦值方法,預設賦值方式,適合基本資料型別

​   4.原子操作

​    ​    ​    ​atomic: 執行緒安全的;

​    ​    ​    ​nonatomic: 執行緒不安全的;

我們可以簡寫屬性,直接在介面檔案中吧{}省略掉,直接用@property來定義方法,省去實現檔案中的@synthesize, 訪問屬性時用_propertyname, 給屬性賦值時用self.propertyname

Objective C中的屬性特性

assign 用於基本資料型別,直接賦值。也可以用於物件,只不過當setter方法賦值時,只是簡單儲存位址,不會造成引用計數的改變,可以解決迴圈引用問題。retain 用於物件型別,當賦值時,先將舊值釋放,對新值retain引用計數加1 copy 用於物件型別,根據實現的nscopying協議的co...

Objective C中屬性的封裝

封裝 類就是更高階別的封裝.類將資料和行為封裝為了1個整體.好處 遮蔽內部的實現.外界不需要知道內部是如何實現的 只需要知道這個物件有什麼用.方便操作.後期的維護十分的便利.繼承多型 就是為物件的屬性賦值的時候 語法上其實只要資料的型別是屬性的型別就是可以的.但是,情理上這麼做是不合的.就像pers...

Objective C中copy屬性的概述

規範上nsstring做屬性都是寫成copy的,理論上應該是複製了字串而不是單純的增加引用計數,其實問題只會出現在把nsmutablestring賦值給nsstring的時候。objective c inte ce demo nsobject property nonatomic,retain ns...