全局函數(C語言函數)
一般在頭文件中定義,在實現文件中實現這個函數??稍谌我馕恢萌フ{用它。也可用OC的對象作為參數或返回值。
成員函數
1.實例方法(表達的是實例的行為)
1.1 定義:在接口頭文件中定義方法,在實現類文件中去實現方法行為。
-(返回值)方法名:(參數類型)參數名;
// 接口頭文件
-(void)sleep:(int)hour;
// 實現類文件
-(void)sleep:(int)hour{
NSLog(@"%@ 休息 %d 小時",self.name, hour);
}
1.2.調用
Human* human = [[Human alloc] init];
[human sleep:3]; //[對象名 方法名]
方法內可訪問的成員:實例成員(實例變量、屬性、實例方法、類方法、靜態變量)
2.類方法(表達的是類的行為)
+(返回值)方法名:(參數類型)參數名 對外參數名:(參數類型)參數名;
+(bool)marryToA:(Human *)a ToB:(Human *)b;
2.1.調用
[Human marryToA:tim ToB:jane]; //[類名 方法名:參數 外部參數名:參數];
類方法內訪問成員:類方法、靜態變量
不可訪問:實例成員(實例變量、方法、屬性)
注意:
OC中的所有方法默認就是Public的,沒有private或prodected方法,但是可以通過擴展的方法實現類似的功能。
動態消息分發:方法的調用是通過運行時動態消息分發實現,在對象上調用方法又稱“向對象發送消息”。
3.方法參數
如果參數類型是值類型,則為傳值方式,如果參數類型為引用類型 則為傳指針方式。
方法可以有參數,也可以沒有參數。
如果方法有參數,方法名約定包含第一個參數名,從第二個參數開始需要顯示提供外部參數名。
+(bool)marryToA:(Human *)a ToB:(Human *)b;
在調用時,第一個參數名是忽略,但后面的參數名會顯示。
[Human marryToA:tim ToB:jane];
注意:方法名 返回值 參數類型 等都相同,但外部參數名不同,屬于不同的方法。
4.動態方法調用機制
id human = [[Human alloc] init];
[human sleep:3];
通過id引用的對象在調用屬性時不可以用.的方式,但可以用訪問器方法。
支持運行時動態加入方法。詳細了解 OC的運行時機制。
5.初始化器 init
初始化器方法可以重載多個,在我們實例化對象的時候,會調用init方法,系統默認為我們的類添加init方法,它將我們的實例變量初始化為0或nil。我們也可以自定義init方法來初始化類的變量值。
5.1.定義
// 接口頭文件中
-(id)initWithName:(NSString *)aName WithGender:(NSString *)aGender;
-(id)initWithName:(NSString *)aName WithGender:(NSString *)aGender WithAge:(int)aAge;
// 實現類文件中
-(id)initWithName:(NSString *)aName WithGender:(NSString *)aGender{
return [self initWithName:aName WithGender:aGender WithAge:0];
}
-(id)initWithName:(NSString *)aName WithGender:(NSString *)aGender WithAge:(int)aAge{
self = [super init];
if (self) {
_name = aName;
_gender = aGender;
_age = aAge;
}
return self;
}
注意:在初始化器中,一定要調用父類初始化器方法獲取到self對象(前置調用),并判斷是否獲取到對象。
5.2.使用
Human* human = [[Human alloc] initWithName:@"Jane" WithGender:@"woman" WithAge:23];
實例化對象的另一種方式:
Human* human = [Human new]; // 等同于 Human* human = [[Human alloc] init]; //init 無參數版本
6.類加載器 initialize
子類的加載器會調用父類的加載器,所以如果重寫這個方法,需要判斷當前self的類型。
6.1.定義
// 接口頭文件中
+(void)initialize;
// 實現類文件中
+(void)initialize{
if (self == [Human class]) {
...
}
}
注意:類被加載時被系統自動調用,每個進程周期中只會被調用一次。相當于JAVA類中的靜態代碼塊。
6.析構器 dealloc
析構器在類中只存在一個,用于釋放對象擁有的動態資源,是實例方法。一般的對象由ARC自動釋放,但對于一些不受ARC管理的動態內存,如malloc分配的內存,就需要在dealloc中手動釋放了。另外還有非內存資源,如果文件句柄等。
子類的構造器會調用父類的構造器(后置調用)。
6.1.定義
// 接口頭文件中
-(void)dealloc;
// 實現類文件中
-(void)dealloc{
...
[super dealloc];
}