Objective-C學習筆記(一)–類

1、類的定義與實現

1.1說明

所有的類都是繼承NSObject。類的接口與實現是分開的,一般類的定義是放在.h文件【包含類的名稱、成員變量、方法、屬性、繼承關係、遵從的協議】;實現部分是放在.m文件中【包含每個屬性和方法的具體實現以及協議的方法實現】

語法:【類的定義以@interface開頭以@end結束;類的實現以@implementation關鍵字開頭以@end結束】

Person.h

@interface Person:NSObject{
       //類的成員變量區【類的成員變量聲明】
 
}
 
//類的方法與屬性區【類的方法與屬性的定義】
@end


 

Person.m

 

#import “Person.h”
@implementation Person{
 
 
}
@end


 

 

1.2實例化alloc

實例一個新的對象需要調用類的alloc靜態方法。alloc方法一旦調用就表明了向內存申請了一個空間用來保存該類的信息。

具體流程是:alloc會查看所有該類及所有基類,統計出這些類一共定義了哪些成員變量,總共需要多大的內存空間用來保存這些信息,然後向操作系統發出請求申請這些空間,如果成功,alloc方法會將所有的成員亦是置爲0,除了一個特殊的指向其類元對象的成員之外,然後返回這塊申請下來的空間的首地址

 

流程圖:

 

 

 

 

 

2、成員變量與方法

 

2.1變量

變量分爲成員變量和類的靜態變量。

成員變量

可訪問性:@protected、@private、@public

關鍵字

可見性

描述

@protected

當前類及子類的實例方法可見

默認值,類裏聲明的成員變量的可訪問級別默認爲@protected。

 

@private

只對當前類的實例方法可見

私有訪問級別

@publice

成員變量對外可見

 

 

變量的聲明

@interface Person:NSObject{
 
@private    
       NSString*_name;
       int_age;
 
}


 

靜態變量

使用static關鍵字表示,定義在類的實例部分中所有實例方法之外。類的靜態變量對於實例方法和類方法都是可見的。

@implementation Person
 
       staticint NumberPerson=0;
 
@end


 

 

 

2.2方法

方法的聲明語法

+|-(返回值類型)方法名;

+|-(返回值類型)參數1說明:(參數1類型)參數1名稱  參數2說明: (參數2類型)參數2名稱;

+:加號表示該方法是一個類的方法,類的靜態方法,它不屬於類的任何實例只屬於該類。【類似於Java中的static方法】  調用格式爲  [類  方法名]  例: [PersonsetMaxAge:20];

-:減號表示該方法的實例方法,屬於實例。調用時必須先將實例化,然後再調用。調用格式爲[類的實例方法名] 

例:Person *xiaoMing=[[Person alloc] init];//實例化

[xiaoMing setName:@”90worker”];

 

注意:

-(BOOL)likeFood:(NSString *)food;

方法名爲likeFood:    【注意有個冒號】

-(id) initWithcName:(NSString *)name  andAge:(int) age;

方法名爲initWithcName: andAge:   【注意有多個冒號】

 

 

 

2.3選擇器@select

每一個Objective C方法都對應一個選擇器,即SEL類型的對象。

Objective C運行時通過方法對應的選擇來定位其實現代碼。可以通過@select指令,傳入方法名,可以獲取該方法的選擇器

用法 :  SELinitMethodSelect=@select(initWithName:age:);

用途:通常用於指定回調方法。

 

2.4屬性@property

語法:@property (屬性的附加特性) 類型名稱;.m文件實現用@synthesize關鍵字。【@synthesize 屬性名稱|@synthesize 屬性名稱=成員變量名稱】

 

聲明:@property (nonatomic,copy) NSString *name;

實現:@synthesize name;

屬性的附加特性:

 

關鍵詞

描述

nonatomic

線程安全的,編譯器默認會生成額外的代碼以保證訪問屬性的線程安全,會犧牲一定的性能。

readonly

屬性只可讀,@synthesize指令只會生成get方法還沒有set方法

readwrite

默認值。可讀寫

geter=get方法名,

setter=set方法名

當聲明一個屬性用@synthesize指令會生成相應的get方法和set方法,但可以通過getter和setter來手動指定get方法和set方法

assign、retain、copy

 

 

 

 

調用:對過點.來實現調用

xiaoMing.name=@”90worker”;

 

點語法oc2.0以後

爲什麼設計點語法

1、爲了方便別的程序員轉到OC開發來

2、爲了讓程序設計簡單化

3、隱藏了內存管理細節

4、隱藏了多線程、同步、加鎖細節

 

 

2.5@class關鍵字

@class爲前向聲明

現有兩個類的聲明

Wheel代表着輪子,Bike代表着自行車,我們知道Bike是需要Wheel的

於是有以下的代碼

Bike.h

@intefrace Bike:NSObject{
       Wheel* _frontWheel, *_rearWheel;
 
}
@end


在這裏我們用到了Wheel類,那麼我們到底是用#import還是用@class呢?我們用一個表格來說明#import和@class

關鍵字

描述

#import

將Wheel類的外部接口Wheel.h整個導入,這樣會產生編譯依賴和編譯時間的浪費。如果Bike.h中導入了Wheel.h而Bike.h文件又被很多其他的類導入 了,那麼這些類也會導入了Wheel.h,一旦Wheel.h修改了,所有導入了Wheel.h的文件都發生了變化需要重新編譯。

@class

1、可以有效的解除上面所說的編譯依賴。如果Wheel.h修改了,對於那些導入了Bike.h的文件並沒有發生變化所以也不需要重新編譯。使用了@class關鍵字只是在類的定義中前身引用了,但在Bike類的內部實現中還是需要導入Wheel.h的,因爲可能需要使用到Wheel.h中的某些定義方法

2、可以解決循環引用

 

 

 

 

 

 

2.6self關鍵字

 

self表示當前引用對象

記住以下兩句話:

1、誰在執行該函數 self就表示誰

2、super表示該對象的父對象

 

+(int)maxAge{
       //
       在+類方法 (靜方法) self表示本類【抽象】  對象是具體的、實例的
}


 

+(id) person{
       idobj=[[self alloc] init]; 
//用法==[[Person alloc]init];   == [[[self class ] alloc] init]
       //self=Person
       returnobj;
}
 
//調用  [xxx 方法名]  maxAge方法裏面的self表示
int maxAge=[Person maxAge];


 

 

2.7dealloc函數

 

dealloc【只調用一次】

       對象從內存中銷燬前夕調用的函數

在對象完全消失的時候調用  對象的計數器爲0的時候會自動調用dealloc  不能人爲的去調用此方法。應用這樣調用:[xxrelease]   //release計數器1減到0 系統就會自動的調用dealloc

-(void)dealloc{
       //在調用父類之前做一些處理
       [superdealloc];
}

 

 

2.8 initialize函數

 

+(void)initialize  NSObject 這個類的第一次實例化的時候調用第一次調用alloc 或者調用init的時候就會調用  【只調用一次】  類方法在該類第一次實例化的時候調用 並且只調用一次  在這裏做一些static變量的初始化操作

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章