Objective-C中的屬性機制

來源:互聯網
上載者:User

標籤:style   color   使用   檔案   io   資料   cti   div   

        Objective-C 2.0中的屬性機製為我們提供了便捷的擷取和設定執行個體變數的方式,也可以說屬性為我們提供了一個預設的設定器和訪問器的實現。在學習OC中屬性之前我們先要知道為什麼要為變數實現getter和setter方法,我們先來瞭解一下執行個體的範圍。

    執行個體變數的範圍如下:

        1. @public : 共有的,該執行個體變數誰都可以訪問;

        [email protected] :受保護的,該執行個體變數只能在該類和其子類內訪問,父類protected的執行個體變數在子類中是private的預設是protected;

        [email protected]: 私人的,該執行個體變數只能在該類的內部訪問;

 

        因為要用protected 或者 private來隱藏類的內部細節,用類或者對象是沒法直接存取被隱藏的細節的,所以要用getter和setter來訪問被隱藏的執行個體變數,OC中的屬性機制就為我們提供了預設的getter和setter方法。下面我們要學習一下OC中的屬性機制。

 

        屬性的定義和實現

        1.屬性的定義

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

     getter和setter方法。

        Demo如下:  

1234567891011 @interface Student : NSObject{    NSString *name;    int idNumber;}//定義屬性@property NSString *name;@property int idNumber; //定義其他方法@end

 

        2.屬性的實現

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

            demo如下

 

1234 @implementation Student @synthesize name, idNumber;    //其他方法的實現@end

 

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

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

    ?

1234 //調用name的setter方法[student setName : @"ludashi"];//調用name的getter方法NSString *name = [student name];

    ?    ?getter和setter方法也可以用點文法來實現

    ?

12345 //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中的語義 :決定了以何種方式對資料成員賦予新值

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

    ?    ?    ?copy(拷貝):把原來的對象拷貝過來,計數器會加一,比如原來對象的地址為0x01 ,拷貝過來的對象的地址為0x02;

    ?    ?    ?retain(保留):這種方式傳遞的是指標,原有的對象和被賦值的對象的地址是一樣的

    ?    ?

    ?   4.原子操作

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

    ?    ?    ?    ?nonatomic: 線程不安全的;

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.