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變量的初始化操作