Objective-c語言特徵小探

1. Objective-c中類的聲明與定義

Objective-c中的類與C++語言的類含義是相同的,都有成員(實例)變量,成員(實例)函數,類函數,類變量,唯一的區別就是其稱呼不同,本質是一個東西,類的聲明和定義的表現形式也不同。@interface 中定義的實例變量默認情況下都爲@protected,可以直接被子類引用,在@implementation和@property定義的實例變量爲@private。其中在@interface中定義的@public變量需要用“->”來訪問。

//MyClass.h

@interfaceMyClass : NSObject

{

    int var;//定義在該接口內的變量,可以在子類中被直接訪問,默認爲@protected.

}

//帶“-”號爲成員函數,帶“+”號的表示類函數

-(void)method1;//without param

-(void)method2:(int) number; // with one param

-(void)method3:(int)number andName (NSString*) name; //with two param

+(void)method4;//類函數 相當於C++中的public static

 

@propertyint myProperty; //定義屬性 爲@private訪問

@end

 

//MyClass.m

#import“MyClass.h”

@implemetationMyClass{

int var1;//聲明成員變量,叫實例變量 爲@private

NSString* var2;

}

@syntherizemyProperty;

-(void)method1{}

-(void)method2:(int) number{}

-(void)method3:(int)number andName (NSString*) name{ var1 = number; var2 = name;}

+(void)method4{}

 

@end

 

2. Objective-c 語言中對象的分配內存與初始化

NSObject可以說是Foundation框架的根類,創建自定義類MyObject並繼承NSObject,在用MyObject時需要先對其分配內存alloc和初始化init,其中最值的注意的是,alloc創建該對象並設置所有的實例變量爲0,NSObject中提供的init函數僅僅是返回self,可以說只是一個佔位符,需要我們重寫該函數,以便能夠初始化MyObject中的自定義的實例變量(instance variable)。

@implementationMyObject

-(id)init:(void){

self = [super init];

if(self){

 //do your initialization

}

return self;

}

@end

 

MyObject*someObject = [[MyObject alloc] init];

 

 

3. Objective-c語言中的函數重載

Objective-c的函數重載比較特殊,只能通過改變參數的個數,或至少改變其中一個參數的名字(該方法我的感覺更像是改的函數名,請自己體會

(1)它不能通過改變參數類型達到重載的目的,例如:

-(void)method1:(NSInteger) param1{}

-(void)method1:(NSString*) param1{}

不能達到重載的目的,在C++中該方法是完全可行的。

(2)不能通過改變函數的返回值類型達到重載的目的,例如:

-(int)method1:(NSInteger) param1{  returnparam1; }

-(NSString*)method1:(NSString*) param1{ return param1; }

(3)通過改變參數個數達到重載目的,例如:

-(void)method1:(NSInteger) param1{}

-(void)method1:(NSInteger) param andParam2:(NSString*) param2{}

(4)通過改變其中一個參數名達到重載目的,該方法我的感覺是兩個函數了,因爲第二個參數的名字可以做爲函數的一部分了。例如:

-(void)drawCircleWithCenter:(CGPoint) param1 radius:(CGFloat) param2{}

-(void)drawCircleWithCenter:(CGPoint) param1 andRadius:(CGFloat) param2{}

 

 

4. Objective-c中的Block

可以像函數一樣,向Block傳遞參數或返回值,Block可以是全局的或局部的,當其定義在函數內部(即局部)時,可以訪問該函數範圍內的任何變量,其定義形式有點類似於函數指針的定義,Array的排序通常會用到block,詳情google下Array的排序部分。示例代碼如下:

voidmain(int argc,char* argv[])

{

@autoreleasepool{

    int sum = 20;

    //函數內部定義的block

int (^addLoop)(int) =^(int num){ //add 0 to num accumulately

    int tmp = 0;

    //num = sum;在此可以直接訪問函數範圍內的變量sum

while(num > 0){

    tmp += num;

    num--;

}

return tmp;

};// end block

 

sum = addLoop(sum);

NSLog(@”%i”, sum);

}

return 0;

}

 

輝輝                                                   

(FightingBull Studio)                                    

 

發佈了32 篇原創文章 · 獲贊 8 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章