簡單的講,建構函式就是在建立一個物件的時候起到初始化的作用,對這個物件裡的一些成員變數進行初始化,解構函式就是在物件被刪除進行一些清理工作,也就是專門的掃尾工作,下面用程式碼來進行具體說明。
一、建構函式
在OC中凡是已init開頭的函式我們都稱之為建構函式,在宣告建構函式的時候,不帶引數的一般直接宣告為“-(id)init”,帶引數的一般宣告為“-(id)initWith...”。
1 @interface Person:NSObject{
2 @private
3 int age;
4 NSString *name;
5 }
6 -(id)init; //不帶引數的建構函式
7 -(id)initWithname:(NSString *)newname age:(int)newage; //帶引數的建構函式
8
9 @end
10
11
12 @implementation Person
13
14 -(id)init{
15 self = [super init];
16 if(self){
17 name = @“xiaoming”;
18 age = 20;
19 }
20 return self;
21 }
22
23 -(id)initWithname:(NSString *)newname age:(int)newage{
24 if(self=[super init]){
25 age = newage;
26 name = newname;
27 }
28 return self;
29 }
30 int main(int argc, const char * argv[]) {
31
32 Person *p1 = [[Person alloc] init]; //物件生成後呼叫初始化函式
33 Person *P2 = [[Person alloc] initWithnam:(NSString *)xiaohong age:19];
34 //呼叫帶引數的建構函式進行初始化
35 return 0;
36 }
這段程式碼裡,在Person類中宣告瞭,兩個初始化函式,第一個帶引數第二個不帶引數,在對對像進行初始化的時候,帶引數的初始化函式顯得更為靈活,裡面的初始值可以自己改動。
二、解構函式
解構函式宣告為“-(void)dealloc”這個函式我們不能通過物件去人為的呼叫它,解構函式會在對像快要死的時候自己執行,來看程式碼。
1 @interface Person:NSObject{
2 @private
3 int age;
4 NSString *name;
5 }
6 -(void)dealloc; //宣告解構函式,解構函式只能有一個
7 @end
8
9
10 @implementation Person //實現Person 類
11 -(void)dealloc{
12 NSLog(@"this is dealloc function");
13 [super dealloc];
14 }
15
16 @end
17
18 Person *xiaoming = [Person alloc];
19 [xiaoming release];
在程式碼的第六行我們宣告瞭解構函式,並且在第11行處我們對其進行了複寫,這個函式會在執行[xiaoming release];的時候執行,因為release函式就是銷燬物件。
注意:有時候我們複寫dealloc函式的時候加上[super dealloc];會出現錯誤
這是因為ARC是iOS 5推出的新功能,全稱叫 ARC(Automatic ReferenceCounting)。簡單地說,就是程式碼中自動加入了retain/release,原先需要手動新增的用來處理記憶體管理的引用計數的程式碼可以自動地由編譯器完成了。該機制在iOS 5/ Mac OS X 10.7 開始匯入,利用 Xcode4.2可以使用該機制。簡單地理解ARC,就是通過指定的語法,讓編譯器(LLVM3.0)在編譯程式碼時,自動生成例項的引用計數管理部分程式碼。有一點,ARC並不是GC,它只是一種程式碼靜態分析(StaticAnalyzer)工具。
解決辦法:雙擊中間的工程名稱,進入build setting
將中間的Objective-C Automatic Reference Counting改為no就OK了!