標籤: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: 線程不安全的;