2013年11月27日日誌:
1.屬性:
@property(assign ,copy或retain內存管理的信息)類型 實例變量名
@synthesize 實例變量名
屬性方法實現了實例變量的get和set方法,等同於:
-(void)set實例變量名:(參數類型)參數名{
實例變量名 = 參數名;
}和
-(返回值類型)實例變量名{
return 實例變量名;
}
需要注意的是屬性方法不能實現那些需要接受額外參數的方法,例如car對象中輪胎的狀況:
-(void)setTire:(Tire*)tire
atIndex:(int)index;
-(Tire*)tireAtIndex:(int)index;
從而說明特性不是萬能的,它只支持替代-setBlah和-blah方法。屬性可以減少我們所寫代碼的數量。使用屬性方法後就可以使用點語法了,點語法只是調用實例的set和get方法的一種快捷方式。
dealie.blah=greeble;等同於[dealie setBlah:greeble];
shronk = dealie.greeble;等同於shronk = [dealie greeble];
2.協議:
聲明協議:
@protocol 協議名稱
@optional
方法聲明列表
@required
方法聲明列表
@ end
協議的所有使用者都要實現協議中的方法,其中@optional可選擇實現,@required聲明協議中必須實現的方法,如果不加聲明的情況下默認爲@required,即方法必須實現。要注意的是協議的使用不引入新的實例變量。
協議也具有動態綁定特性,比如下面的實例對象被確定爲gun,就擁有了gun所擁有的所有屬性:
Arm *arm = [[Arm alloc]init];//動態綁定的實現
arm.name = @"wuqi";
NSLog(@"%@的編號爲 %d\n",arm.name,arm.number);
//wuqi的編號爲 4
arm = gun;
NSLog(@"%@的編號爲 %d\n",arm.name,arm.number);
//ak47的編號爲 1
//(動態綁定)實例對象被確定爲gun,就擁有了gun所擁有的所有屬性,
[arm movToX:70 ToY:70];
//ak47正在移動到70,70
[arm fireToX:80 ToY:80];
//ak47正在開火到80,80
[arm play];
//ak47正在播放搶的聲音!
實例對象被確定爲gun,就擁有了gun所擁有的所有屬性,名字和編號都變成gun的名字和編號,調用的是gun內實現的方法。
3.分類:category
@interface 需要添加方法的類名(分類名)
方法聲明列表
@end
@implementation 需要添加方法的類名(分類名)
方法的具體實現
@end
用於給類添加新的方法;分類只能添加新的方法,而不能添加新的實例變量,如果想要添加新的實例變量,可以使用創建新的子類來添加新的變量。分類可以重載該類中的方法,但大家一般不經常這樣使用。
分類中聲明的所有方法,這是和協議很不相同的一個地方。分類使用需謹慎,因爲使用分類不僅會影響類本身,還會影響到它的所有子類。