一、oc介紹
1轻猖、簡介
oc是一個成熟的谓罗,面向?qū)ο蟮恼Z言
oc是基于c之上的,擴展的c
oc是從Smalltalk【1】得到對象的方法及語法崎苗。所有的非面向?qū)ο蟮牟僮鳎òㄔ甲兞浚A(yù)處理舀寓,表達式胆数,函數(shù)聲明和函數(shù)調(diào)用)的語法和c語言相同,而面向?qū)ο蟮奶匦缘恼Z法是Smalltalk的消息機制互墓。
2必尼、調(diào)試器
調(diào)試時編程的最有創(chuàng)造性和治理挑戰(zhàn)的方面之一,他也是最費力的方面之一篡撵。由于調(diào)試是一個困難但卻關(guān)鍵的任務(wù)判莉,所以重要的是要學(xué)習(xí)調(diào)試的技巧。這些技巧中最重要的是讓計算機向您展示它在做什么育谬,這是debugging的關(guān)鍵券盅。
NSLog打印函數(shù):
? ? 例:NSLog(@"The current date and time is:%@",[NSDate date]);
例:
(1) int intValue = -100; ? ?NSInteger intValue2 = -999;
NSLog(@"int:%d,%d",intValue,intValue2);//int -100 -999
注:NSInteger is int type, not class!是基本數(shù)據(jù)類型的typedef,不是類膛檀。平臺不同锰镀,NSIntger對于的類型也不同】校跨平臺泳炉,可移植性
(2)unsigned int uintValue = 100; unsigned int uintValue2 = -100;
NSLog(@"unsigned int : %u %u",uintValue,uintValue2);//unsigned int:100 4294967196
(3)char aChar = 'G'; ?char bChar = 0x61; ?unichar aUnichar = Ox4f60;//unichar,兩個字節(jié)
NSLog(@"char:%c %c,unichar:%C",aChar,bChar,aUnichar);//char:G a, unichar:你);
(4)const unichar pUnichar[] = {L'你',L'好',0x0000};
NSLog(@"C string(unichar):%S",pUnichar);//
【1】Smalltalk和許多程序設(shè)計語言不同,它不僅僅是一門語言僵缺。它是一種面向?qū)ο蟮某绦蛟O(shè)計語言胡桃;一種程序設(shè)計環(huán)境;一個應(yīng)用開發(fā)環(huán)境(ADE)
3磕潮、C的擴展
在Objective-C中只要看到@符號翠胰,都可以把它看成是C語言的擴展
? ? Foundation框架處理的是用戶界面之下的層中的特性,例如數(shù)據(jù)結(jié)構(gòu)和通信機制自脯。 ? ? ? ? ? ? Foundation框架的頭文件占用了近1MB的磁盤存儲空間之景,包含一萬四千多行代碼,涵蓋一百多個文件膏潮。使用#import<Foundation/Foundation.h>包含主頭文件锻狗,就能夠獲得整個集合。也許你認為辛苦地讀取每個文件的全部文本會耗去編譯器很多時間,但是Xcode非常聰明:他會使用預(yù)編譯頭文件(一種經(jīng)過壓縮的轻纪、摘要形式的頭文件)油额,在通過#import導(dǎo)入這種文件時,加載速度會非晨讨悖快潦嘶。
? ? ?Cocoa對其所有函數(shù)、常量和類型名稱都添加了‘NS’前綴崇众。這個前綴告訴你函數(shù)來自Cocoa而不是其他工具包掂僵。【NS前綴->NeXTSoftware】顷歌。
3.1布爾類型
Object-C的BOOL類型比C語言的bool類型早誕生十多年锰蓬。這兩種布爾類型可以在同一個程 序中共存,但在編寫Cocoa代碼時要使用BOOL眯漩。(說明:oc中的BOOL實際上是一種對帶符號的字符類型的定義芹扭,它使用8位存儲空間。YES定義為1赦抖,而NO定義為0冯勉。oc并不將BOOL作為僅能保存YES或NO值的真正的布爾類型來處理。編譯器獎BOOL認做8位二進制數(shù)摹芙,YES和NO值只是一種約定。這引發(fā)一個小問題:如果不小心將一個長于1字節(jié)的整型值(例如short或int值)賦給一個BOOL變量宛瞄,那么只有低位數(shù)字節(jié)會用作BOOL值浮禾。假設(shè)該地位字節(jié)剛好為0【例如8960,寫成十六進制為0x2300】份汗,BOOL值將會是0盈电,即NO值。
二杯活、面向?qū)ο缶幊袒A(chǔ)知識(OOP面向?qū)ο缶幊?Object-Oriented Programming)
1匆帚、類
oc定義了一個根類:NSObject,每一個新的類旁钧,應(yīng)該是一個NSObject類的子類吸重。它提供了一個系統(tǒng)運行時的大量方法。也就是說歪今,每一個對象的類型都是NSObject嚎幸,每一個指針指向?qū)ο蟮闹羔樁伎梢员宦暶鳛镹SObject*。事實上寄猩,我們可以使用id這個類型來代替嫉晶。這就是一個生命對象或指針的簡單方法,并且支持動態(tài)類型檢查來代替靜態(tài)類型檢查。
(1) 方法聲明:
mType (returnType) name1:(type1)param1 name2:(type2)param2...
方法需要參數(shù)時替废,方法名后要有冒號箍铭;冒號前面是標簽,冒號后面是參數(shù)類型和參數(shù)名
+類方法(C++靜態(tài)成員函數(shù))椎镣,用類名調(diào)用诈火;
-實例方法(C++非靜態(tài)成員函數(shù)),用對象名調(diào)用
static int sum = 5衣陶;//靜態(tài)全局變量
注:OC不支持靜態(tài)成員變量柄瑰,通過靜態(tài)全局變量來實現(xiàn)靜態(tài)成員變量功能
(2)類的實現(xiàn)
2、
@interface部分剪况,它用于定義類的公共接口教沾。
@implemention部分,使對象真正起作用的代碼位于@implementation部分中
注:Objective-C中不存在真正的私有方法译断,也無法把某個方法標示為私有方法授翻,從而禁止其他代碼調(diào)用它。這是Objective-C動態(tài)本質(zhì)的副作用孙咪。
實例化對象時堪唐,需要分配內(nèi)存,然后這些內(nèi)存被初始化并保存一些有用的默認值翎蹈,這些值不同于你在獲得新分配的內(nèi)存時得到的隨機值淮菠。內(nèi)存分配和初始化完成后,就創(chuàng)建了一個新的對象實例荤堪。
三合陵、繼承
說明:不要直接更改由繼承得到的實例變量的值。一定要使用方法來更改他們澄阳。
? ? 某些語言(例如C++)具有多繼承特性拥知,在這種情況下,一個類可以直接沖兩個或多個類繼承而來碎赢。但Objective-C不支持多繼承低剔,如果你嘗試在Objective-C中使用多繼承(多繼承的形式可能類似于以下語句),編譯器將不能識別他們:@interface Circle:NSObject,PrintableObject;你可以通過OC的其他特性獲取多繼承的優(yōu)點肮塞,例如分類和協(xié)議襟齿。
? ? 因為繼承在子類和超類之間建立了一種"is a"(是一個)關(guān)系,所以NSObject的實例變量稱為isa峦嗤。使用更具體種類的對象代替一般類型蕊唐,這種能力稱為多態(tài)性。
? ? 每個方法調(diào)用都獲得了一個名為self的隱藏參數(shù)烁设,它是一個指向接收消息的對象的指針替梨。方法實用self參數(shù)查找它們要使用的實例變量钓试。
? ? OC提供某種方式來重寫方法,并且仍然調(diào)用超類的實現(xiàn)方式副瀑。當需要超類實現(xiàn)自身的功能弓熏,同時在前面貨后面執(zhí)行某些額外的工作時,這種機制非常有用糠睡。為了調(diào)用繼承方法的實現(xiàn)挽鞠,需要使用super作為方法調(diào)用的目標。
super既不是參數(shù)也不是實例變量狈孔,而是由OC編譯器提供的某種神奇功能信认。向super發(fā)送消息時,實際上是在請求OC向該類的超類發(fā)消息均抽。如果超類中沒有定義該消息嫁赏,OC將按照通常的方式在繼承鏈中繼續(xù)查找對應(yīng)的消息。
四油挥、復(fù)合
1潦蝇、什么是復(fù)合
? ? 編程中的復(fù)合就好像音樂中的作曲一樣:將多個組件組合在一起配合使用,從而得到完整的作品深寥。創(chuàng)作樂曲時攘乒,作曲人可能會選擇低音管聲部組成交響樂的二聲部。在OC中惋鹅,復(fù)合是通過包含作為實例變量的對象指針實現(xiàn)的则酝。嚴格地講,只有對象間的組合才能叫復(fù)合闰集。
2堤魁、存取方法
? ? 存取方法是用來讀取或改變對象特定屬性的方法。存取方法:setter方法返十,getter方法
? ? 說明:get這個詞在Cocoa中有著特殊的含義。如果get出現(xiàn)在cocoa的方法名稱中椭微,就意味著這個方法會通過你當做參數(shù)傳入的指針來返回數(shù)值洞坑。例如,NSData(cocoa中的類蝇率,創(chuàng)建可存儲任意字節(jié)序列的對象)中又一個getBytes:方法迟杂,它的參數(shù)就是用來存儲字節(jié)的內(nèi)存緩沖區(qū)的地址。
? ? 復(fù)合建立的是“has a”的(有一個)關(guān)系本慕。
五排拷、源文件組織
@class創(chuàng)建了一個前向引用。就是在告訴編譯器:“相信我锅尘,以后你會知道這個類到底是什么监氢,但是現(xiàn)在布蔗,你只需要知道這些±烁”如果有循環(huán)依賴關(guān)系纵揍,@class也很有用。即A類使用B類议街,B類也使用A類泽谨。如果試圖通過#import語句讓這兩個類互相引用,那么最后就會出現(xiàn)編譯錯誤特漩。但是如果在A.h中使用@class B吧雹,在B.h中使用@class A,那么這兩個類就可以相互引用了涂身。
? ? 如果它們是繼承自其他類而不是通過指針指向其他類雄卷,則不能在頭文件中使用@class語句。