關(guān)于Objective-C的入門(mén)學(xué)習(xí)筆記
對(duì)于一門(mén)語(yǔ)言得學(xué)習(xí),個(gè)人覺(jué)得最主要得就是其語(yǔ)法格式和那些關(guān)鍵字。
因?yàn)閷?duì)于基本現(xiàn)在大多數(shù)得語(yǔ)言,每種語(yǔ)言都是一種符合人思維得方式來(lái)與計(jì)算機(jī)交流。
因此,其實(shí)每種語(yǔ)言中定義或是封裝好得基礎(chǔ)類和類庫(kù),其實(shí)都是很相似得。
比如 int,double幾種基本類型,String,數(shù)組,集合以及字典數(shù)據(jù)類型。
因此你在編程時(shí)比如你想以字符串形式和計(jì)算機(jī)交流,那你很容易就能想到在C中可以使用String這個(gè)類,在java中也是Stirng
。ó(dāng)然,前提是你至少有一種同抽象級(jí)別得語(yǔ)言基礎(chǔ)),那OC呢,也有這樣一個(gè)類吧,不過(guò)是某種原因加了個(gè)前綴。
那么對(duì)于類中定義函數(shù)得使用,可能不同語(yǔ)言就有所不同了,首先是函數(shù)名(這個(gè)其實(shí)基本不擔(dān)心,現(xiàn)在得ide工具提示太強(qiáng)悍了,真不行你可以文檔),
其次就是函數(shù)得調(diào)用格式,我這簡(jiǎn)單理解為語(yǔ)法格式得一種。
一、語(yǔ)法概覽
1.首先一個(gè)類的組成
這個(gè)知道C的基本沒(méi)什么說(shuō)的 .h和.m文件。一個(gè)是頭文件,一個(gè)是實(shí)體文件。
OC中一般說(shuō)是申明文件和實(shí)現(xiàn)文件
簡(jiǎn)單來(lái)說(shuō),h文件就是整體對(duì)一個(gè)類得描述,m文件是對(duì)h文件中申明描述得實(shí)現(xiàn)
復(fù)制代碼 代碼如下:
//
// NonoAppDelegate.h
// MultiViews
//
// Created by Nono on 12-4-19.
// Copyright (c) 2012年 NonoWithLilith. All rights reserved.
//
#import
@interface NonoAppDelegate : UIResponder
{
UITabBarController *tabBarController;
UIWindow *window;
}
@property (retain, nonatomic)IBOutlet UIWindow *window;
@property (retain, nonatomic)IBOutlet UITabBarController *tabBarController;
@end
2.來(lái)看頭文件得格式和申明
#import這個(gè)關(guān)鍵字沒(méi)啥說(shuō)的,java中叫導(dǎo)入。就是引入你當(dāng)前類所要用到得依賴庫(kù)和類。
@interface 申明開(kāi)頭關(guān)鍵字。 后面緊跟的是定義額類名 :后面的是繼承得類 UIResponder ,< xxxxxxxxx>有點(diǎn)類似于java中得接口,當(dāng)然 OC中有個(gè)
更加準(zhǔn)確得定義就叫協(xié)議 ,<>放協(xié)議類。 整個(gè)申明最后都以@end結(jié)束。
{ }里面就是常說(shuō)得申明成員變量。
@property 屬性,我暫時(shí)理解為也有點(diǎn)成員變量的意思。 這個(gè)屬性更多是和后面得m文件中的的synthesize關(guān)鍵字有密切聯(lián)系。
。╮etain ,nonatomic)屬性的一些參數(shù)。這個(gè)具體可以去看文檔,估計(jì)C語(yǔ)言額同學(xué)應(yīng)該不陌生,我不是很明確每個(gè)參數(shù)比較適合得場(chǎng)合。
IBOutlet 關(guān)鍵字,這個(gè)是和nib文件息息相關(guān)得,只要在nib文件中需要關(guān)聯(lián)的對(duì)象,用這個(gè)修飾(比如我nib文件中有個(gè)window控件,要和代碼中這個(gè)對(duì)象聯(lián)系起來(lái)
,那么就用這個(gè)關(guān)鍵字申明),申明完后會(huì)看到這段代碼最左端有個(gè)空心圓圈,當(dāng)你和nib文件中控件關(guān)聯(lián)后,就實(shí)心圓圈了。
復(fù)制代碼 代碼如下:
//
// NonoAppDelegate.m
// MultiViews
//
// Created by Nono on 12-4-19.
// Copyright (c) 2012年 NonoWithLilith. All rights reserved.
//
#import "NonoAppDelegate.h"
@implementation NonoAppDelegate
@synthesize window;
@synthesize tabBarController;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
// self.window.backgroundColor = [UIColor whiteColor];
self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];
return YES;
}
@end
3.實(shí)現(xiàn)文件
implmentationxxx @end。這個(gè)不用說(shuō)了吧。
@synthesize 這個(gè)關(guān)鍵字有點(diǎn)意思。這個(gè)關(guān)鍵字得表示法后,編譯器就自動(dòng)隱式生成一個(gè)setter和getter,OC上得說(shuō)法來(lái)說(shuō)就是自動(dòng)實(shí)現(xiàn)一個(gè)
存取方式。然后我們知道,oc語(yǔ)言這個(gè)習(xí)慣方式,一個(gè)方法和屬性在使用前都必須有個(gè)申明,就是 h和m文件這個(gè)構(gòu)造啦。那對(duì)于h頭文件中property
我們是不是可以理解,這是對(duì)編譯器得一個(gè)申明,我將在實(shí)現(xiàn)文件中實(shí)現(xiàn)這個(gè)對(duì)象得存取方法,而在m實(shí)現(xiàn)時(shí)只不過(guò)我們一個(gè)關(guān)鍵字后讓編譯器去做了這個(gè)事。
4.例子最后說(shuō)下OC中對(duì)象得方法得調(diào)用
比如在java中我要調(diào)用 a對(duì)象的functionA()方法,直接用得點(diǎn)表示法 a.functionA();
在OC中有點(diǎn)奇特表示成 [a functionA],如果方法呀傳參數(shù),那么緊跟著 functionA :obj
二、關(guān)鍵字
1.NS前綴。OC得大部分類都有這個(gè)前綴。要理解緣由,可以去看OC得歷史。
2.Bool 這個(gè)數(shù)據(jù)類型有點(diǎn)改動(dòng),在常見(jiàn)得語(yǔ)言中都是true和false,OC是YES和NO。
3.@protocol關(guān)鍵字,這個(gè)是申明協(xié)議類時(shí),和@end連用,看字面意識(shí)就知道了。
對(duì)于協(xié)議我們上面提到,有點(diǎn)類似于java中得接口,當(dāng)眾所周知,接口中申明得方法必須全部實(shí)現(xiàn)。java中當(dāng)然對(duì)這樣一個(gè)強(qiáng)自行手段有引申出
抽象abstract這個(gè)類來(lái)對(duì)這種強(qiáng)制手段一個(gè)緩和,OC中則直接在協(xié)議類中申明了這一點(diǎn),對(duì)于有些方法不需要強(qiáng)制實(shí)現(xiàn),可選得,用了optional。
這個(gè)你可以具體隨意跳入喲個(gè)協(xié)議類看就好了,相信在以后更多代碼接觸后會(huì)有個(gè)更深得理解。
4.對(duì)于剛接觸oc語(yǔ)言得人可能有個(gè)小疑惑得類型 (id),這個(gè)可以理解為java語(yǔ)言中得泛型。
三、OOP思想
面向?qū)ο筮@個(gè)概念性東西大家應(yīng)該都有。
什么繼承,封裝,多態(tài)這些就跟背單詞一樣。但是,簡(jiǎn)單的還是需要用大白話能說(shuō)出來(lái)的。
先說(shuō)封裝:封裝我覺(jué)得其實(shí)是oop思想最原始的一個(gè)基礎(chǔ)。封裝的引入后,才能衍生出對(duì)象這一概念。我們把一個(gè)物體和它擁有的屬性和更能包裝起來(lái),是一個(gè)抽離然后融合的過(guò)程。
繼承:繼承從字面句很好了解,兒子繼承父親。一個(gè)物體派生出一個(gè)新的物體。當(dāng)然,繼承后的很多特性,你可以背書(shū)去。
多態(tài):多態(tài)其實(shí)更好解釋了,聽(tīng)字面,多種形態(tài)?一個(gè)事物的多種實(shí)現(xiàn)(當(dāng)然,這個(gè)可能很直觀很字面,但是從嚴(yán)謹(jǐn)性上來(lái)說(shuō)是錯(cuò)誤的)因?yàn)橐粋(gè)物體的多種實(shí)現(xiàn),怎么
看怎么聽(tīng)都是像繼承啊,比如我有個(gè)魚(yú)類,那么我可以派生一個(gè)鯊魚(yú)類和一個(gè)鯨魚(yú)類,那對(duì)于這個(gè)做法來(lái)說(shuō),感覺(jué)是繼承啊。其實(shí)他們的本質(zhì)思想都是差不多的,
只是側(cè)重點(diǎn)的不同。繼承更像表達(dá)一個(gè)物體派生一個(gè)新物體,多態(tài)則是一個(gè)物體派生出多個(gè)物體對(duì)改物體的不同實(shí)現(xiàn),這個(gè)實(shí)現(xiàn)最直接的方式就是對(duì)超類中方法的不同的覆寫(xiě)和實(shí)現(xiàn)。比如魚(yú)類,有個(gè)eat()方法,派生的鯊魚(yú)類,我們都知道鯊魚(yú)吃肉,那么我們可以實(shí)現(xiàn)鯊魚(yú)的eat方法是吃肉的,藍(lán)鯨我們算他雜食吧,那么藍(lán)鯨的eat方法則是實(shí)現(xiàn)雜食吃法。此時(shí)你就可以站在一個(gè)全面的角度簡(jiǎn)單的看到多態(tài)這個(gè)概念了。
對(duì)于深入理解OOP這個(gè)思想定義,其實(shí)就類似于看你對(duì)待事物抽象的高度。
四、新事物的或者說(shuō)一個(gè)新類產(chǎn)生的集中方式
1.最原始得一種,就是我們自己抽象定義除一個(gè)類。比如定義最原始的類,在java和OC中都存在這樣一個(gè)原始類Object。
2.繼承而來(lái)派生出一個(gè)新類。這個(gè)很好理解。比如從人類Human衍生出男人類 Man,
3.還有一種是我們比較少明確意識(shí)到,但是其實(shí)是很常用到方法:復(fù)合,既用幾個(gè)不同的類來(lái)復(fù)合成一個(gè)新類。最常用就以書(shū)上例子解釋 ,Car 汽車類,
簡(jiǎn)單我們可以用Engine引擎和Tires輪子來(lái)構(gòu)造成最簡(jiǎn)單的Car模型。
五、OC中類別和非正式協(xié)議概念
1.category,類別應(yīng)該算是OC獨(dú)有的一個(gè)術(shù)語(yǔ),書(shū)上給類別的定義是:一種為現(xiàn)有類添加新方法的一種方式。
其實(shí)這個(gè)方式怎么聽(tīng)怎么像創(chuàng)建子類就可以做到的概念。
是的,為一個(gè)類做擴(kuò)展,我們最常想到的方法就是為其創(chuàng)建一個(gè)子類,然后添加你需要擴(kuò)展的新方法等。
但是在OC中有時(shí)這樣并不方便,書(shū)上舉例了一個(gè)NSString的例子。原話是這樣的:
。
當(dāng)希望為新有類添加新的行為時(shí),我們通常會(huì)創(chuàng)建子類。
但是有時(shí)子類并不方便。例如,你可能會(huì)希望為NSString類新增一些新行為,但是你知道,NSString實(shí)際上只是一個(gè)類簇的前臺(tái)表示,因而無(wú)法
為這樣的類創(chuàng)建子類。省略1000字。
********/
好了,從上面我們基本知道,創(chuàng)建子類這個(gè)方法是有局限性的對(duì)吧。上面引入一個(gè)概念叫類簇。
字面意思(一簇鮮花,就是許多朵花扎成一束呈現(xiàn)出來(lái),里面的具體其實(shí)我們是不知道的。)
類簇其實(shí)也算是個(gè)不大不小的概念。集體可以看官方文檔 http://www.apple.com.cn/developer/mac/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/chapter_3_section_9.html
鄙人也是新接觸這玩意兒,里面有這么一句話:
/*****
類簇將一些私有的、具體的子類組合在一個(gè)公共的、抽象的超類下面。
。
我不知道是不是可以理解。類簇包含的成分是帶有私有性質(zhì)的,但我們都知道,繼承后的子類是不能訪問(wèn)父類的私有成員的(這個(gè)應(yīng)該沒(méi)錯(cuò)吧?)
那么我們?cè)谛聞?chuàng)建的子類添加的新方法就無(wú)權(quán)限訪問(wèn)那些東西咯。
好吧,以上是個(gè)人理解,這東西也是聽(tīng)拗口的,具體詳情可以參考更多官方文檔。
那么,好了,我們大體上知道OC引入類別這個(gè)機(jī)制的原因了。配合上OC動(dòng)態(tài)運(yùn)行時(shí)的分配機(jī)制,你可以為現(xiàn)有類添加新的`方法,嘿,這
聽(tīng)起來(lái)很酷。〞(shū)上原話)
類別創(chuàng)建:
復(fù)制代碼 代碼如下:
@interface NSString(NumberConvenience)
-(NSNumber *)lengthAsNumber;
@end//NumberConvenience
聲明有兩個(gè)特點(diǎn):
(1)現(xiàn)有的類位于@interface關(guān)鍵字之后,其后是位于圓括號(hào)中的類別名稱。類別名稱是NumberConvenience,而且該類別將向NSString類中添加方法。換句話說(shuō):“我們向NSString類中添加一個(gè)名稱為NumberConvenience的類別。”同名類別有唯一性,但是可以添加任意多的不同名類別。
(2)可以執(zhí)行希望向其添加類別的類以及類別的名稱,還可以列出添加的方法
不可以添加新的實(shí)例變量,類別生命中沒(méi)有實(shí)例變量部分。
類別的實(shí)現(xiàn)基本和一般類的實(shí)現(xiàn)一樣。
非正式協(xié)議和委托:非正式協(xié)議概念其實(shí)就是類別的另一種表達(dá)方式“這里有一些你可能希望實(shí)現(xiàn)的方法,你可以使用他們更好的完成工作”。
這個(gè)意思是,這些是可選的。比如我門(mén)要一個(gè)更好的方法,我們就會(huì)申明一個(gè)這樣的類別去實(shí)現(xiàn)。然后你在后期可以直接使用這些更好的方法。
這么看,總覺(jué)得類別這玩意兒有點(diǎn)像協(xié)議的可選協(xié)議。
可選協(xié)議只不過(guò)是有先見(jiàn)之明,類別是后期補(bǔ)救。共同一點(diǎn)時(shí),對(duì)于方法實(shí)現(xiàn)都是可選的?蛇x協(xié)議有關(guān)鍵optionnal申明了,類別則你像高效方法你就申明,
不想就算了。
之后是委托,算OC中一個(gè)很重量級(jí)的概念。據(jù)說(shuō)深入后會(huì)發(fā)現(xiàn)很多東西,主要鄙人目前還只接觸幾天,對(duì)于它在oc中整體的設(shè)計(jì)模式理論還是不太了解。
只是在寫(xiě)例子代碼時(shí),怎么看怎么覺(jué)得就如java中的監(jiān)聽(tīng)和回調(diào)?赡芤玫睦斫猓沁是要更多的接觸代碼才能會(huì)有個(gè)深刻的理解。
六、內(nèi)存管理的改變
只所以說(shuō)內(nèi)存管理的改變,是以前一直說(shuō)c和c++成員的在工作中最需要注意的問(wèn)題就是內(nèi)存管理。
在接觸ios5.1前,網(wǎng)上看了大部分資料,內(nèi)存管理都有很重要的戲份。
只是,當(dāng)我學(xué)習(xí)時(shí),發(fā)現(xiàn),這塊被淡化了。
現(xiàn)在版本的新特性引入了ARC機(jī)制。感覺(jué)完全變的和java一樣了。
在創(chuàng)建項(xiàng)目選者ARC選項(xiàng)后,你會(huì)發(fā)現(xiàn)在代碼中你根本不用手動(dòng)去釋放內(nèi)存了。release什么都被劃掉了 = =。
【關(guān)于Objective-C的入門(mén)學(xué)習(xí)筆記】相關(guān)文章:
關(guān)于Javascript 入門(mén)基礎(chǔ)學(xué)習(xí)11-22
Oracle的入門(mén)學(xué)習(xí)技巧10-19
德語(yǔ)入門(mén)學(xué)習(xí)技巧11-08
韓語(yǔ)學(xué)習(xí)入門(mén)方法11-07
XHTML入門(mén)學(xué)習(xí)教程11-20
學(xué)習(xí)街舞的入門(mén)小竅門(mén)10-04