OC概述
? Objective-C簡(jiǎn)稱OC济似,OC是C語言的擴(kuò)充柏肪,并且OC是iOS和OS X操作系統(tǒng)的編程語言蝇更。
? 1980年初發(fā)明OC語 -> 1988年NeXT -> 1996年OC成為蘋果主要編程語言
OC語言的特點(diǎn)
? C語言的超集然遏,允許在OC中使用C語言代碼逊谋,編譯器兼容C語言程序扒腕。
? 具備完善的面向?qū)ο筇匦跃畹怼7庋b,繼承瘾腰,多態(tài)皆的。
? 包含一個(gè)運(yùn)行時(shí)系統(tǒng)。
? 類庫(kù)豐富蹋盆。
類和對(duì)象的概念和區(qū)別
類是具有相同特征和行為的事物的抽象
對(duì)象是類的實(shí)例费薄,萬事萬物皆對(duì)象。
類是對(duì)象的類型栖雾。
區(qū)分對(duì)象的黃金法則:當(dāng)我們看到某個(gè)概念的時(shí)候如果每個(gè)人 的大腦中想到的都是同一個(gè)事物的時(shí)候楞抡,此時(shí)就是對(duì)象;反之則是類析藕。
類和對(duì)象的定義
? OC中類的定義分為兩個(gè)部分:接口部分和實(shí)現(xiàn)部分召廷。
? 接口部分:對(duì)外聲明類的特征和行為。(.h文件中)
? 實(shí)現(xiàn)部分:行為的具體實(shí)現(xiàn)账胧。(.m文件中)
? 接口部分標(biāo)志:@interface...@end 竞慢。
? @interface...@end 的作用:聲明類的實(shí)例變量(成員變量)和方法,即特征和行為治泥。
? 接口部分包含的內(nèi)容:類名筹煮、父類名、實(shí)例變量车摄、方法等寺谤。
? 實(shí)現(xiàn)部分標(biāo)志:@implementation...@end仑鸥。
? @implementation...@end 的作用:類行為的具體實(shí)現(xiàn)(方法的實(shí)現(xiàn))。
下面我們來定義一個(gè)描述手機(jī)類
第一步在.h文件中對(duì)外聲明類的特征和屬性
接口部分:
@interface Phone : NSObject
{
@public
NSString *_poneName;
NSString *_phoneColor;
float _phoneSize;
float _phoneMoney;
}
//對(duì)象方法
-(void)sayHi;
-(void)write;
@end
第二步在.m文件中進(jìn)行行為的具體實(shí)現(xiàn)
@implementation Phone
- (void)sayHi{
NSLog(@"正在打電話变屁!");
}
- (void)write{
NSLog(@"正在發(fā)短信Q劭 !");
}
@end
第三部在main.m中初始化一個(gè)對(duì)象
1.導(dǎo)入頭文件
#import "Phone.h"
2在“ main(int argc, const char * argv[]) {“和“ return 0中初始化對(duì)象
Phone * phone =[[Phone alloc] init];
phone->_poneName = @"小米";
phone->_phoneColor = @"粉色";
phone->_phoneSize = 6.50;
phone->_phoneMoney =1699;
NSLog(@"品牌:%@粟关,顏色:%@疮胖,屏幕大小:%1.f闷板,價(jià)格:%2.f",phone->_poneName,phone->_phoneColor, phone->_phoneSize, phone->_phoneMoney);
類和文件
?類的定義過程需要進(jìn)行分文件放置澎灸。文件分為.h(接口文件)和.m(實(shí)現(xiàn)文件)。
?注意:
1.使用類名命名文件遮晚。
2.h文件管理類的接口部分性昭;.m文件管理類的實(shí)現(xiàn)部分。
?只要符合類的接口部分和實(shí)現(xiàn)部分的定義县遣,就可以定義出一個(gè)類糜颠。
?文件中可以定義多個(gè)類,但是文件的名字以類名命名萧求,對(duì)于其他的開發(fā)人員很難發(fā)現(xiàn)文件中含有的其他類其兴。比如:Person文件中定義一個(gè)Dog類就很難發(fā)現(xiàn)。
對(duì)象的創(chuàng)建
? 類是一個(gè)抽象的概念夸政,在實(shí)際開發(fā)中程序的運(yùn)行是通過對(duì)象間的相互協(xié)作來完成元旬。
? 對(duì)象是類的實(shí)例,通過類來創(chuàng)建對(duì)象守问。
? 創(chuàng)建對(duì)象分兩步:
? 分配內(nèi)存空間:根據(jù)類中聲明的實(shí)例變量為對(duì)象在堆區(qū)分配內(nèi)存匀归,并返回首地址。
? 初始化:為對(duì)象的實(shí)例變量設(shè)置初始值酪碘。
分配內(nèi)存空間朋譬,并且將內(nèi)存空間數(shù)據(jù)清零
Teacher *teacher = [Teacher alloc];
初始化
teacher = [teacher init];
兩步是一個(gè)連續(xù)的過程,一般情況下兴垦,合并操作
Teacher *teacher = [[Teacher alloc] init];
開辟空間
+ (instancetype)alloc;
“+”表示方法是類方法徙赢,只能由類調(diào)用。instancetype返回值類型探越,可以用id(任意對(duì)象類型)替代狡赐。
初始化
- (instancetype)init;
“-”對(duì)象方法,對(duì)象調(diào)用钦幔≌硖耄“instancetype”返回值類型。
instancetype和id區(qū)別
? instancetype可以返回和方法所在類相同類型的對(duì)象鲤氢,id只能返回未知類型的對(duì)象搀擂。
? instancetype只能作為返回值和參數(shù)西潘,id還可以用來定義變量。
? instancetype會(huì)告訴編譯器當(dāng)前的類型哨颂,但id對(duì)于編譯器卻是無類型的喷市,調(diào)用任何方法不會(huì)給出錯(cuò)誤提示。
? 對(duì)于init方法威恼,id和instancetype是沒有區(qū)別的品姓。因?yàn)榫幾g器會(huì)把id優(yōu)化成instancetype。當(dāng)明確返回的類型就是當(dāng)前Class時(shí)箫措,使用instancetype能避免id帶來的編譯不出的錯(cuò)誤情況腹备。
下面我們將對(duì) Teacher *teacher = [[Teacher alloc] init]中的指針解釋一下:
? 指針存儲(chǔ)對(duì)象的首地址,代指對(duì)象斤蔓。OC中使用指針代指對(duì)象植酥,進(jìn)行操作。