iOS開發-OC語言 (六)點文法和@property,-oc@property
點文法和@property
知識點
1.setter/getter函數
2.點文法
3.@property文法和屬性
========================================
一、setter和getter函數
1.setter和getter函數的作用
setter 方法: 修改對象的欄位/執行個體變數
getter 方法: 讀取對象的欄位/執行個體變數
setter 方法: 可以帶有多個參數,可以同時給多個變數賦值
getter方法: 不帶參數,只能返回一個變數的值。
2.setter和getter如何命名
setter 方法的命名:
xxx: 表示的是成員變數的名字
//帶有一個參數
- (void)setXxx:(參數類型)參數1;
//帶有多個參數
- (void)setXxx:(參數類型)變數名字 xxx:(參數類型)變數名字 ……;
getter 方法的命名:
- (傳回值類型)xxx;
=======================================
二、點文法 為了讓程式設計簡單化
隱藏了記憶體管理細節
隱藏了多線程、同步、加鎖
2.點文法的作用
屬性可以在不適用 【對象 方法名字】 的情況下使用點文法
無需調用[foo value] 可以調用foo.value 來訪問. 注意跟結構體的區別
雖然foo.value 看起來像是直接存取value變數,但是屬性始終調用
方法,而這些方法又可以訪問對象的資料。
3.點文法的調用
//一個參數的set方法可以使用點文法賦值
[xiaoxin setName:@“小新”];
//這不是使用成員變數,是使用set方法
xiaoxin.name = @"小新";
//可以通過.文法調用get方法
NSString * ret = [xiaoxin name];
//xiaoxin.name在等號左邊就是set方法,使用這個運算式的值,就是get方法
ret = xiaoxin.name;
【注】點文法只是訪問setter getter方法,不是使用成員變數。
4.點文法和setter/getter函數的關係
【點文法和[]寫法】本質一樣,同樣是發送set和get訊息,只不過寫法不同。
dog.name = @“xiaobai”;
展開成: [dog setName: @“xiaobai”];
NSString *nameString = dog.name;
展開成: NSString *nameString = [dog name];
=======================================
三、屬性(@property)和合成(@synthesize)
1.當一個類中的成員變數非常多的時候,setter和getter是否會顯得非常臃腫,@property和@synthesize可以使代碼變得簡潔。
2.@property用處
1) 讓編譯器自動聲明setter和getter
3.@property使用
1) @property 成員變數類型 變數名;
4.@synthesize用處
1)讓編譯器自動實現setter和getter函數
5.@synthesize可以省略(Xcode4.6以後可以省略)
//聲明一個屬性,相當於聲明了下面兩個方法
@property NSString * name;
//- (void)setName:(NSString *)name;
//- (NSString *)name;
@synthesize name = _name;
//Xcode4.6以前,需要這樣實現,如同實現了下面兩個方法
//Xcode4.6起,無需寫@synthesize,自動實現下面兩個方法,會自動關聯名位_XXX的變數
//如果類中並沒有對應的變數,會自動產生相應的變數。
======================================
@property屬性
1.原子操作
atomic(預設)/nonatomic
2. assign 直接賦值修飾符(預設),一般用在基本類型。
//預設(預設)修飾符
@property (assign) NSString * name;
//同時產生set、get方法
直接賦值,展開的set方法:
- (void)setName:(NSString *)name
{
_name = name;
}
3.讀寫操作
readonly/readwrite(預設)
//唯讀修飾符
//只產生getter,沒有setter
@property (readonly) NSUInteger age;
/預設修飾符
//同時產生set、get方法
@property (readwrite) NSString *name;
4. 給set方法和get方法起別名
//getter修飾符
//給get方法起別名
@property (getter = myWeight) NSUInteger weight;
//setter修飾符
//給set方法起別名
@property (setter = setLife:) BOOL alive;
//一個屬性可以添加多個修飾符,多個修飾符間用逗號隔開。
@property (setter = setUsername:, getter = getUsername) NSString *name;
5. 多個屬性修飾符,需要用逗號隔開
@property (nonatomic, readonly,getter = birth)
NSString * birthday;