IOS 開發學習總結 objective-c物件導向之——成員變數,類比類變數,單例模式
OC 中變數根據定義位置的不同,可以分為3大類:成員變數,局部變數和全域變數。
之前提到過方法是由函數演化而來的,所以不管是方法中定義的變數,還是函數中定義的變數,都是局部變數。
成員變數及其運行機制
成員變數:指的是在類介面部分或類實現部分定義的變數。
說明:objective-c 的成員變數都是執行個體變數,並不支援真正的類變數。
執行個體變數從該類的執行個體被建立開始起存在,直到系統完全銷毀這個執行個體,執行個體變數的範圍與對應執行個體的生存範圍相同。執行個體變數可以理解為執行個體成員變數,它作為執行個體的一個成員,與執行個體共存亡。
只要執行個體存在,程式就可以訪問該執行個體的執行個體變數,在程式中訪問執行個體變數的文法:執行個體->執行個體變數;
樣本程式:
#import @interface FKPerson : NSObject{ @public // 定義2個執行個體變數 NSString* _name; int _age;}@end@implementation FKPerson@endint main(int argc , char * argv[]) { @autoreleasepool{ // 建立Person對象 FKPerson* p = [[FKPerson alloc] init]; // 通過指標變數來訪問Person對象_name、_age執行個體變數 NSLog(@p變數的_name執行個體變數的值是:%@,p對象的_age成員變數的值是:%d , p->_name , p->_age); // 直接為p的name執行個體變數賦值 p->_name = @孫悟空; // 直接為p的age執行個體變數賦值 p->_age = 500; // 再次通過指標變數來訪問Person對象_name、_age執行個體變數 NSLog(@p變數的_name執行個體變數的值是:%@,p對象的_age成員變數的值是:%d , p->_name , p->_age); // 建立第一個FKPerson對象 FKPerson* p1 = [[FKPerson alloc] init]; // 建立第二個FKPerson對象 FKPerson* p2 = [[FKPerson alloc] init]; // 分別為兩個FKPerson對象的name成員變數賦值 p1->_name = @張三; p2->_name = @孫悟空; }}
總結說明:成員變數無需顯式初始化,只要為一個類定義了執行個體變數,系統會為執行個體變數執行預設初始化。基本類型的執行個體變數預設被初始化為0;指標類型的成員變數預設被初始化為 nil.
從記憶體儲存的角度看,objective-c 的對象與C 的結構體相似。
這裡用上面的代碼中定義的類建立2個執行個體。結合來說明 OC 中執行個體變數的初始化和記憶體中的運行機制。
// 建立第一個FKPerson對象FKPerson* p1 = [[FKPerson alloc] init];
// 建立第二個FKPerson對象FKPerson* p2 = [[FKPerson alloc] init];
// 分別為兩個FKPerson對象的name成員變數賦值 p1->_name = @張三; p2->_name = @孫悟空;
類比類變數
通過內部局部變數來類比類變數。
**注意:**static關鍵字不能修飾成員變數,只能修飾局部變數,全域變數和函數。
為了類比類變數,可以在類實現部分定義個 static 修飾的全域變數,並提供一個類方法來暴露該全域變數。
範例程式碼:
標頭檔:FKUser.h
#import @interface FKUser : NSObject+ (NSString*) nation;+ (void) setNation: (NSString*) newNation;@end
實現檔案:FKUser.m
#import FKUser.hstatic NSString* nation = nil;@implementation FKUser+ (NSString*) nation{ // 返回nation全域變數 return nation;}+ (void) setNation: (NSString*) newNation{ // 對nation全域變數賦值 if(![nation isEqualToString: newNation]) { nation = newNation; }}@endint main(int argc , char * argv[]) { @autoreleasepool{ // 為FKUser的類變數賦值 [FKUser setNation:@中國]; // 訪問FKUser的類變數 NSLog(@FKUser的nation類變數為:%@ , [FKUser nation]); }}
單例模式
如果一個類始終只能建立一個執行個體,則這個類稱為單例類。
單例類可以通過 static 全域變數來實現,程式考慮定義一個 static全域變數,該變數用於儲存已經建立的 singleton 對象——每次程式需要擷取該執行個體的時候,先判斷該 static 全域變數是不是為 nil, 如果為 nil,則初始化一個執行個體並賦值給 static 全域變數。
樣本程式:
FKSingleton.h
#import @interface FKSingleton : NSObject+ (id) instance;@end
FKSingleton.m
#import FKSingleton.hstatic id instance = nil;@implementation FKSingleton+ (id) instance{ // 如果instance為nil if(!instance) { // 建立一個Singleton執行個體,並將該執行個體賦給instance全域變數 instance = [[super alloc] init]; } return instance;}@endint main(int argc , char * argv[]) { @autoreleasepool{ // 判斷兩次擷取的執行個體是否相等,程式將會返回1(代表真) NSLog(@%d , [FKSingleton instance] == [FKSingleton instance]); }}