OOP面向?qū)ο缶幊?Object-Oriented Programming
什么是對(duì)象究珊?對(duì)象是對(duì)客觀事物的抽象和封裝(特征數(shù)據(jù)+行為方法)
什么是類瓤摧?類是對(duì)對(duì)象的抽象竿裂,是一種抽象的數(shù)據(jù)類型。
對(duì)象是類的實(shí)例姻灶,類是對(duì)象的模版铛绰。
一、function 函數(shù)
void drawShapes(id shapes[], int count){
for(int i=0 ; i<count ; i++){
id shape = shapes[i];
[shape draw];
}
}//drawShapes
- 不在類里面产喉,不能聲明方法捂掰,只能聲明C語言里的函數(shù)。
- oc中[ ]意義:用于通知某個(gè)對(duì)象該去做什么(消息機(jī)制)
第一項(xiàng)是對(duì)象曾沈,其余部分是需要對(duì)象執(zhí)行的操作(即發(fā)送消息/調(diào)用方法)这嚣。
具體過程:對(duì)象是消息的目標(biāo),先查出它屬于哪一個(gè)類塞俱,再找到相應(yīng)函數(shù)執(zhí)行姐帚。
二、 interface接口 -> 類的聲明
- 接口是類為對(duì)象提供的特性描述障涯。
-
基本數(shù)據(jù)類型
NSInteger整型
NSUInteger無符號(hào)整數(shù)
NSString字符串
NSString* 指針類型 賦值str=@“123”
CGFloat 小數(shù) 來自CoreGraphics框架 - 類聲明寫法:
@interface Person:NSObject{ //@interface標(biāo)志罐旗,NSObject表示類的繼承
NSInteger _age; //數(shù)據(jù)成員膳汪,實(shí)例變量
NSString* _name;
}
//聲明類的功能,類給外部提供的功能,不表示是類的全部功能九秀。對(duì)業(yè)務(wù)邏輯進(jìn)行保護(hù)
-(void) setName: (NSString*) name; //-方法聲明 (void)方法返回類型 參數(shù)
-(NSString*) name;
@end //Person
- OC方法可以返回與C函數(shù)相同的類型:標(biāo)準(zhǔn)類型(整型遗嗽、浮點(diǎn)型和字符串)、指針鼓蜒、引用對(duì)象和結(jié)構(gòu)體痹换。
-
中綴符語法技術(shù)
【類聲明語法】 + / - (返回類型) 名字1:(類型1)參數(shù)1 名字2:(類型2)參數(shù)2 …..- +類型方法 [類名 類型方法]
- -實(shí)例方法 [對(duì)象 實(shí)例方法]
-(void)setInitX:(int)n andSetInitY:(int)d;
- 例子中在第二個(gè)參數(shù)前面設(shè)置一個(gè)中綴符(andSetInitY),中綴符也是函數(shù)名的一部分都弹。
-
中綴符解決了方法調(diào)用時(shí)的代碼可讀性問題:
【調(diào)用】[test setInitX:1 andSetInitY:2]; - 若在Java中則會(huì)寫成public void setInit(int n, int d);
Java和OC二種語法比較起來就好像是數(shù)學(xué)中的分配率:a(b+c) = ab+ac - 最后用表格來對(duì)比一下C和OC
比較項(xiàng)目 | C | OC |
---|---|---|
無參數(shù) | int foo(); | -(int)foo; |
int ret= obj->foo(); | int ret = [obj foo]; | |
一個(gè)參數(shù) | int foo(int a); | -(int)foo:(int)a; |
int ret = obj->foo(100); | int ret = [obj foo:100]; | |
兩個(gè)參數(shù) | int foo(int a,int b); | -(int) foo:(int)a :(int)b; |
int ret = obj->foo(10,20); | int ret = [obj foo:10 :20]; | |
帶標(biāo)簽 | int fooAndB(int a, int b); | -(int)foo:(int)a andB:(int)b; |
int ret = obj->fooAndB(10,2); | int ret = [obj foo:10 andB:2]; |
三娇豫、implementation -> 類的實(shí)現(xiàn)
- 實(shí)現(xiàn)是使接口能正常工作的代碼
@implementation Person
-(void) setName: (NSString*) name {
//參數(shù)要重新命名,不能與成員變量同名畅厢,否則會(huì)覆蓋初始變量
_name=name;
}
-(NSString*)name{
return _name;
}
四冯痢、對(duì)象的創(chuàng)建
- 分配內(nèi)存+初始化 (具體在下一篇
構(gòu)造方法中展開介紹)
OC的對(duì)象都是動(dòng)態(tài)分配在堆中,只能通過指針訪問 - 消息機(jī)制 【接受者 消息 (方法)】
【對(duì)象 對(duì)象方法】或详;
【類名 類型方法】系羞;
int main(int argc, const char *argv[])
{
Shape* shape1 = [Shape new ]; //自動(dòng)調(diào)用的方法
Shape* shape2 = [ [Shape alloc] init ]; //與上一行等價(jià),但二者指向不同地址
return (0);
}
- 對(duì)象創(chuàng)建使用結(jié)束后需要釋放內(nèi)存
- ARC (Automatic Reference Counting) 自動(dòng)引用計(jì)數(shù)郭计,釋放沒有指針再指向的內(nèi)存塊
- MRC (Mannul Reference Counting) 手動(dòng)管理,向?qū)ο蟀l(fā)送release消息 [shape release];
五霸琴、getter/setter方法
@interface Person : NSObject{
NSString* _name;
NSInteger _age;
}
//聲明類的功能,類給外部提供的功能
-(void)setName:(NSString*)name; //setter方法聲明
-(NSString*)name; //getter方法聲明
@end
@implementation Person
-(void)setName:(NSString *)name{ // setter方法實(shí)現(xiàn),將參數(shù)name的值賦給成員變量_name
_name=name;
}
-(NSString*)name{ // getter方法的實(shí)現(xiàn)昭伸,獲取當(dāng)前對(duì)象成員變量_name的值
return _name;
}
@end