Objective-C在C語言的基礎(chǔ)上引入了object-oriented(面向?qū)ο?的概念。其class(類)與object(對象)就是面向?qū)ο笏枷氲捏w現(xiàn)。
1. 那什么是類什么是對象呢?
對象是對某一事物的抽象,而類是對對象的抽象,類是一種抽象的數(shù)據(jù)類型。通過實(shí)例化類得到對象,通過這個對象訪問它的屬性和行為。
通俗的來講,比如:
"人"是一個類,它具有的屬性:性別,年齡,身高等,具有的行為:吃飯、睡覺等,我們創(chuàng)建了這個類相當(dāng)于創(chuàng)建了“人”的模板,通過這個模板就可創(chuàng)造出無數(shù)個具有這種特征(屬性和行為)的“人”的對象,這種方式我們稱為實(shí)例化。
2. Objective-C如何創(chuàng)建類:
2.1 創(chuàng)建接口頭文件(在此內(nèi)定義的方法和屬性供外部訪問)
//Human.h
@interface Human : NSObject
@property (copy)NSString* name;
@property (copy)NSString* gender;
@property int age;
-(void)eat; // - 代表實(shí)例方法,只能通過對象訪問
-(void)sleep:(int)hour;
+(bool)marryToA:(Human *)a ToB:(Human *)b; // + 代表類方法,通過類訪問。如同java的靜態(tài)方法
@end
定義接口:@interface 類名:父類,":"代表繼承(后面會詳細(xì)說明)父類,如果沒有指定的父類,就繼承NSObject,NSObject是所有類的基類。
定義屬性:@property 類型 屬性名;
定義方法:
-(返回值)方法名;
-(void)eat;
-(返回值)方法名:(參數(shù)類型)參數(shù)名;
-(void)sleep:(int)hour;
+(返回值)方法名:(參數(shù)類型)參數(shù)名 對外參數(shù)名:(參數(shù)類型)參數(shù)名;
+(bool)marryToA:(Human *)a ToB:(Human *)b;
"-" : 代表實(shí)例方法,只能通過對象訪問
"+": 代表類方法,通過類訪問。如同java的靜態(tài)方法,(如果一個方法不需要訪問任何實(shí)例屬性及實(shí)例方法的話,都可聲明為類方法。類在單個進(jìn)程運(yùn)行時只會被加載一次,也就是說會為這個方法在堆中分配一次內(nèi)存空間,但如果這個方法是屬性方法,每一次實(shí)例化對象都需要為這個方法分配一次內(nèi)存空間。)
2.2 創(chuàng)建實(shí)現(xiàn)類文件,實(shí)現(xiàn)接口定義的方法的具體行為。
//Human.m
@implementation Human
-(void)eat{
NSLog(@"%@ 吃飯",self.name);
}
-(void)sleep:(int)hour{
NSLog(@"%@ 休息 %d 小時",self.name, hour);
}
+(bool)marryToA:(Human *)a ToB:(Human *)b{
if (![a.gender isEqualToString:b.gender]) {
NSLog(@"異性可以結(jié)婚");
return YES;
}
NSLog(@"同性不可以結(jié)婚");
return NO;
}
@end
{}:括號中 我們稱為方法體,將方法要做的事情寫在方法體中。
self:代表當(dāng)前實(shí)例化的對象,通過它在類內(nèi)中訪問屬性及方法。
[self eat]; //通過self訪問方法
2.3 外部訪問,實(shí)例化對象:
Human* tim = [[Human alloc] init]; //實(shí)例化對象
tim.name = @"Tim"; //對象引用給name屬性賦值
tim.age = 23;
[tim eat]; //調(diào)用eat方法
[tim sleep:3]; //調(diào)用sleep方法并給參數(shù)傳值
[[Human alloc] init]:首先OC是通過發(fā)送消息的機(jī)制調(diào)用方法的,在這里很明顯alloc是Human的一個類方法,并且是從NSObject當(dāng)中繼承過來的。這個方法的目的就是要求系統(tǒng)分配內(nèi)存空間并返回已分配內(nèi)存地址的引用對象,再調(diào)用這個對象的init方法將已分配的內(nèi)存中的數(shù)據(jù)清空(置0或null)。