目錄
類 對象
繼承 多態(tài) 方法
NSSTring NSValue NSNumber
集合
內(nèi)存管理
屬性
設(shè)計(jì)模式 引用傳值
類目 延展 協(xié)議
begain
1
一個(gè)對象永遠(yuǎn)不會保存另外一個(gè)對象(保存指針)
面向?qū)ο缶幊陶Z言的特點(diǎn):封裝,繼承,多態(tài)
NextSTEP = cocoa
@class Hero 1.預(yù)先申明,避免交叉引用 2.代替#import ,不需要 導(dǎo)入頭文件重新編譯
@class #import #include的區(qū)別 ?????????
OC 數(shù)據(jù):typedef類型(NSInteger(= int long),CGFloat(= float,double),NSPoint( = struct _NSPoint)) 和對象類型(NSString(!= char *),NSNumber)
nextStep, cocoa的由來:oc開始火爆的原因和時(shí)間:
面向?qū)ο螅悍庋b(隱藏內(nèi)部實(shí)現(xiàn),穩(wěn)定外部接口,封裝就是定義類,定義屬性,定義方法),繼承(子類可以復(fù)用父類所有方法的申明和實(shí)現(xiàn),非私有的實(shí)例變量以及協(xié)議,繼承具有單根性和傳遞性,繼承就是代碼優(yōu)化公共部分交給父lei),多態(tài)(不同對象對同一消息的不同響應(yīng),子類可以重寫父lei的方法,多態(tài)就是允許方法重名,參數(shù)或返回值可以使父類型傳入或者返回,description,init)
OC 具有靜態(tài)語言的特性,又有動態(tài)語言的效率
動態(tài)類型(id類型):在編譯時(shí)不能識別,只有運(yùn)行時(shí)才可
動態(tài)綁定(@select / SEL):oc中無函數(shù)概念只有消息機(jī)制,跳過編譯,運(yùn)行時(shí)才動態(tài)的添加函數(shù)調(diào)用,在運(yùn)行時(shí)才決定調(diào)用什么方法,需要傳模式參數(shù)進(jìn)去,要實(shí)現(xiàn)他就定義一個(gè)SEL整數(shù)(方法的ID)遍歷綁定一個(gè)方法來引用(函數(shù)調(diào)用是根據(jù)函數(shù)名字符串來查找,速度比根據(jù)整數(shù)查找慢)
動態(tài)加載:動態(tài)的加載資源,
@的作用:關(guān)鍵字起始符
init初始化
dealloc 屬性減一 |release 對象計(jì)數(shù)減一
傳值方式:單例,NSUserdefault,屬性,KVO,KVC,通知(NSNoticationCenter)
類簇(class cluster,抽象工廠類,提供抽象接口,具體實(shí)現(xiàn)由內(nèi)部類實(shí)現(xiàn))類:NSString,NSNumber,NSDictinary,NSArray
----------------------------
類目:系統(tǒng)的類不可以添加屬性,其他可以,但是要自己寫setter getter方法,一般都可添加方法
延展:不可見
協(xié)議:
-----------------------------
私有成員變量:其他類訪問不到
屬性:整個(gè)工程都可見
------------------------------
clang llvm( Low Level Virtual Machine )龍書
Clang 是一個(gè) C++ 編寫、基于 LLVM、發(fā)布于 LLVM BSD 許可證下的 C/C++/Objective C/Objective C++ 編譯器,其目標(biāo)(之一)就是超越 GCC。
設(shè)計(jì)模式:KVO KVC 單例 代理模式
2.OC 與 C 與 C++的不同點(diǎn):
OC:面向?qū)ο?,動態(tài)的封閉語言,單繼承(有protocols和categories),smalltalk學(xué)派(更靈活,允許出錯),c的超集(可兼容C的全部語法)
C++: 面向?qū)ο螅o態(tài)的封閉語言,多繼承,simula 67學(xué)派(更安全,不靈活),兼容C的大部分語法
C :面向過程,開源語言
3.import :防止重復(fù)引用頭文件
4.int main(int argc, const char * argv[] char **env) : 首先是一個(gè)計(jì)算提供的參數(shù)到程序, 第二個(gè)是對字符串?dāng)?shù)組的指針。
argc: 整數(shù),用來統(tǒng)計(jì)你運(yùn)行程序時(shí)送給main函數(shù)的命令行參數(shù)的個(gè)數(shù)
argv[ ]: 字符串?dāng)?shù)組,用來存放指向你的字符串參數(shù)的指針數(shù)組,每一個(gè)元素指向一個(gè)參數(shù)
argv[0] 指向程序運(yùn)行的全路徑名或者程序名字 argv[1] 指向在DOS命令行中執(zhí)行程序名后的第一個(gè)字符串 argv[2] 指向執(zhí)行程序名后的第二個(gè)字符串 ... argv[argc]為NULL
**env:字符串?dāng)?shù)組。env[ ]的每一個(gè)元素都包含ENVVAR=value形式的字符 串。其中ENVVAR為環(huán)境變量,value 為ENVVAR的對應(yīng)值。 argc, argv,env是在main( )函數(shù)之前被賦值的,編譯器生成的可執(zhí)行文件,main( )不是真正的入口點(diǎn),而是一個(gè)標(biāo)準(zhǔn)的函數(shù),這個(gè)函數(shù)名與具體的操作系統(tǒng)有關(guān)。
5.@ 關(guān)鍵字起始符號
6.框架是一組類的集合,而這些類互相關(guān)聯(lián),cocoa Touch是一組框架的集合
7.面向?qū)ο蟮幕卣{(diào)機(jī)制:
委托:單個(gè)委托對象可以接收針對某個(gè)特定對象的全部事件消息,對象只 能向其委托對象發(fā)送一組特定協(xié)議所申明的消息
凡是支持委托的對象,其背后都有一個(gè)相應(yīng)的協(xié)議,申明可以向該委托對象發(fā)送的消息,為其感興趣的事件實(shí)現(xiàn)相應(yīng)的方法;
如果某個(gè)類實(shí)現(xiàn)了某個(gè)協(xié)議中的方法,則該類遵守該協(xié)議
目標(biāo)動作對:當(dāng)某個(gè)特定事件發(fā)生時(shí),發(fā)生的事件的一方會向指定的目標(biāo)對象發(fā)送一個(gè)之前設(shè)定好的動作消息,針對不同事件(請按),需要創(chuàng)建不同的目標(biāo)動作對。
8.協(xié)議不是類,是一組特定的方法,不能為協(xié)議創(chuàng)建實(shí)例,或添加實(shí)例變量,協(xié)議自身不實(shí)現(xiàn)方法,需要由遵循相應(yīng)協(xié)議的類實(shí)現(xiàn)
用于委托的協(xié)議成為委托協(xié)議,不是所有協(xié)議都是委托協(xié)議
delegate 特性:_unsafeunretained(防止retain循環(huán))
9.構(gòu)建階段:編譯源代碼(預(yù)處理,編譯),連接二進(jìn)制文件和庫,拷貝程序資源
預(yù)處理:處理#語句(import / define),預(yù)處理為中間文件.ml文件
編譯:將中間文件轉(zhuǎn)換為機(jī)器碼,不過也保存在中間文件中---編譯時(shí)錯誤,為語法錯誤
連接:設(shè)置鏈接,指向被鏈接的文件(框架是類的集合,其實(shí)現(xiàn)文件已編譯,是目標(biāo)文件,為庫)---連接器錯誤,無法處理鏈接,找不到文件或者
10.getter setter 用于保護(hù)變量不被外界訪問(默認(rèn)為peotected屬性,不能被外界訪問,設(shè)置為public則容易被攻擊,因?yàn)榇蠹叶伎梢栽L問)的時(shí)候,公開這兩個(gè)方法(方法默認(rèn)為public)即可以通過這個(gè)方法訪問成員變量
11.protected private public ????????????? 作用域 當(dāng)前類 同一package 子孫類 其他package
public? √? ? ? √? ? ? ? ? ? ? √? ? ? √
protected √? ? √? ? ? ? ? ? ? √? ? ? ×
friendly? √? ? √? ? ? ? ? ? ? ×? ? ? ×
private? √? ? ? ? ×? ? ? ? ? ? ? ×? ? ? ×
12.oc中調(diào)用方法時(shí),不看指針看對象,稱為虛方法
13.
(1).3種類型集合:數(shù)組NSarray 字典 NSDictionary(無序) 集NSSet(無序,哈希算法,內(nèi)存不連續(xù),只能一次取一個(gè)或者全部取出,不可重復(fù),如有重復(fù)自動清除)
(2).集合中都只能是對象,這個(gè)對象是數(shù)組
(3).集合中不能存放Nil對象,nil是集合結(jié)束符標(biāo)識
(4). ios5 (不可變): 字符串:@"",id:@()? ,NSArray :@[], NADictionary: @{} char[] @encode()
14.內(nèi)存:程序運(yùn)行時(shí)臨時(shí)分配的存儲空間,在程序結(jié)束后釋放
(1).繼承自NSObject的對象才需要進(jìn)行內(nèi)存管理
(2).對象的生命周期:初始化,使用,釋放
(3).@property:
Retain:對對象release舊值,retain新值(適用于OC對象類型)
Assign:直接賦值(默認(rèn),適用于非oc對象類型]
Copy:release舊值,copy新值
(4)Autorelease注意:
1)系統(tǒng)自帶的方法中,如果不包含alloc new copy等,則這些方法返回的對象都是autorelease的,如[NSDate? date];
2)開發(fā)中經(jīng)常會寫一些類方法來快速創(chuàng)建一個(gè)autorelease對象,創(chuàng)建對象時(shí)不要直接使用類名,而是使用self
(5).ARC準(zhǔn)則:無強(qiáng)指針,則釋放,
(6).通過便利構(gòu)造創(chuàng)建的對象不需要進(jìn)行release操作
15.KVC運(yùn)用了一個(gè)isa-swizzling技術(shù)。
isa-swizzling就是類型混合指針機(jī)制。KVC主要通過isa-swizzling,來實(shí)現(xiàn)其內(nèi)部查找定位的。
isa指針,就是is a kind of的意思,指向維護(hù)分發(fā)表的對象的類。該分發(fā)表實(shí)際上包含了指向?qū)崿F(xiàn)類中的方法的指針,和其它數(shù)據(jù)。 KVC在調(diào)用方法setValue的時(shí)候
(1)首先根據(jù)方法名找到運(yùn)行方法的時(shí)候所需要的環(huán)境參數(shù)。
(2)他會從自己isa指針結(jié)合環(huán)境參數(shù),找到具體的方法實(shí)現(xiàn)的接口。
(3)再直接查找得來的具體的方法實(shí)現(xiàn)。
這樣的話前面介紹的KVO實(shí)現(xiàn)就好理解了
當(dāng)一個(gè)對象注冊了一個(gè)觀察者,被觀察對象的isa指針被修改的時(shí)候,isa指針就會指向一個(gè)中間類,而不是真實(shí)的類。
所以isa指針其實(shí)不需要指向?qū)嵗龑ο笳鎸?shí)的類。所以我們的程序最好不要依賴于isa指針。在調(diào)用類的方法的時(shí)候,最好要明確對象實(shí)例的類名。
這樣只有當(dāng)我們調(diào)用KVC去訪問key值的時(shí)候KVO才會起作用。所以肯定確定的是,KVO是基于KVC實(shí)現(xiàn)的。
正則表達(dá)式
1.驗(yàn)證用戶名和密碼:"^[a-zA-Z]\w{5,15}$"
2.驗(yàn)證電話號碼:"^(\d{3,4}-)\d{7,8}$"
3.驗(yàn)證手機(jī)號碼: "^1[3|4|5|7|8][0,9]\d{8}$"
4.驗(yàn)證Email地址:(“^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)$”)
5.只能輸入整數(shù)或者小數(shù):^[0-9]+([.]{0,1}[0-9]+){0,1}$
6.只能輸入漢字:”^[\u4e00-\u9fa5]{0,}$”。
7.匹配雙字節(jié)字符(包括漢字在內(nèi)):[^\x00-\xff](計(jì)算字符串長度,一個(gè)雙字節(jié)字符長度記2 ASCii字符記1)
8.匹配空白行的正則表達(dá)式:\n\s\r(刪除空白行)
9.匹配帳號是否合法(字母開頭,允許5-16字節(jié),允許字母數(shù)字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$(表單驗(yàn)證時(shí)很實(shí)用)
10.\num 匹配num,其中num是一個(gè)正整數(shù)。對所獲取的匹配的引用。例如,“(.)\1”匹配兩個(gè)連續(xù)的相同字符。
x .== 判斷內(nèi)存地址 基本變量 對于一些基本類型 可以使用==來判斷,但對于指針類型,使用==則判斷的是指針保存的內(nèi)容地址是否相等,而不是判斷內(nèi)存地址下的內(nèi)容是否相等(應(yīng)該通過方法來判斷)
y. 靜態(tài)方法返回的對象一般都不需要手動釋放內(nèi)存