您好,登錄后才能下訂單哦!
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如下
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方法
1readwrite : 指定屬性是可讀寫的這是默認值因此可以省略
@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
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。