天天看點

Objective-C中的屬性機制

        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

@interface Student : NSObject

{

NSString *name;

int

idNumber;

}

//定義屬性

@property NSString *name;

@property 

int

idNumber;

//定義其他方法

@end

        2.屬性的實作

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

            demo如下

@implementation Student

@synthesize name, idNumber;

//其他方法的實作

@end

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

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

    ​

//調用name的setter方法

[student setName : @

"ludashi"

];

//調用name的getter方法

NSString *name = [student name];

    ​    ​getter和setter方法也可以用點文法來實作

//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(指派): 直接指派,計數器不會加一,簡單的指派方法,預設指派方式,适合基本資料類型

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

    ​    ​    ​retain(保留):這種方式傳遞的是指針,原有的對象和被指派的對象的位址是一樣的

    ​    ​

    ​   4.原子操作

    ​    ​    ​    ​atomic: 線程安全的;

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

  我們可以簡寫屬性,直接在接口檔案中吧{}省略掉,直接用@property來定義方法,省去實作檔案中的@synthesize, 通路屬性時用_propertyName, 給屬性指派時用self.propertyName

作者:青玉伏案

出處:http://www.cnblogs.com/ludashi/

本文版權歸作者和共部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

如果文中有什麼錯誤,歡迎指出。以免更多的人被誤導。

收履歷:某網際網路公司,招聘iOS/Android靠譜工程師,入職後,可内部聯系樓主,有小禮品贈送,有意者可郵箱投遞履歷:[email protected]