iOS第一個月學習總結(jié)

1. 書籍《Objective-C編程全解》
[知識點]
2. 電影列表頁 demo
[知識點]
3.工具的使用

<h4 id='2'>面向?qū)ο缶幊痰母拍?lt;/h4>

面向?qū)ο螅和ㄟ^消息協(xié)調(diào)各個對象之間的消息發(fā)送唉韭,使其作為一個整體運行,這就是面向?qū)ο蟮能浖倪\行模式犯犁。(ps:對象都有屬性属愤,并且能夠接收消息。)
用類創(chuàng)建對象的過程叫做實例化酸役,生成的對象叫實例對象(實例)住诸。

<h4 id='3'>類和繼承</h4>

通過擴展或者修改既有類來定義新類的方法叫作繼承。
繼承的好處:代碼重用涣澡;繼承的缺點:父類的改變影響所有的子類贱呐。子類與父類耦合度很高。當子類中需要有自己獨特的行為入桂,不想使用父類的方法吼句,可以把父類的方法覆蓋掉:直接在子類中用一樣的名字寫個方法。在繼承體系中方法調(diào)用的順序:1)在自己類中找事格;2)如果沒有就去父類中找惕艳;3)如果父類中沒有搞隐,就去父類的父類中找……直到找到基類。
OC中远搪,類方法也是可以繼承的(通過子類的類名調(diào)用父類的類方法)劣纲;類方法也是可以重寫的;類方法可以和對象方法重名(+表示類方法谁鳍,-表示對象方法)癞季;子類中不能定義與父類中同名的成員變量。OC是單繼承(一個類只能繼承一個父類)倘潜,并且可以多層繼承绷柒。

<h4 id='4'>對象的類型和動態(tài)綁定</h4>

動態(tài)綁定就是指在程序執(zhí)行時才確定對象的屬性和需要相應(yīng)的消息。
OC中的消息實在運行時才去綁定的涮因。運行時系統(tǒng)首先會確定接收者的類型(動態(tài)類型識別)废睦,然后根據(jù)消息名在類的方法列表里選擇相應(yīng)的方法執(zhí)行,如果沒找到就到父類中繼續(xù)尋找养泡,如果一直找到NSObject也沒找到要調(diào)用的方法嗜湃,就會報告不能識別的錯誤。
OC的靜態(tài)類型檢查是在編譯期完成的澜掩。
1)id類型的變量购披,調(diào)用任何方法都能夠通過編譯。
2)id類型的變量和被定義為特定類的變量之間是可以相互賦值的肩榕。
3)被定義為特定類對象的變量刚陡,調(diào)用類或父類未定義的方法會提示警告。
4)若是靜態(tài)類型的變量株汉,子類類型中實例變量可以賦值給父類類型的實例變量筐乳。
5)若是靜態(tài)類型的變量,父類類型的實例變量不可以賦值給子類類型的實例變量郎逃。
6)若是要判斷到底是哪個類的方法被執(zhí)行了,不要看變量所聲明的類型挺份,而要看實際執(zhí)行時這個變量的類型褒翰。
7)id類型不是NSOject* 類型(id類型和其他類型并沒有繼承關(guān)系)。

<h4 id='5'>內(nèi)存管理</h4>

1)引用計數(shù):是指將資源(可以是對象匀泊、內(nèi)存或磁盤空間等等)的被引用次數(shù)保存起來优训,當被引用次數(shù)變?yōu)榱銜r就將其釋放的過程。使用引用計數(shù)技術(shù)可以實現(xiàn)自動資源管理的目的各聘。同時引用計數(shù)還可以指使用引用計數(shù)技術(shù)回收未使用資源的垃圾回收算法揣非。
當創(chuàng)建一個對象的實例并在堆上申請內(nèi)存時,對象的引用計數(shù)就為1躲因,在其他對象中需要持有這個對象時早敬,就需要把該對象的引用計數(shù)加1忌傻,需要釋放一個對象時,就將該對象的引用計數(shù)減1搞监,直至對象的引用計數(shù)為0水孩,對象的內(nèi)存會被立刻釋放。

  • 自己生成的對象琐驴,自己持有俘种。
  • 非自己生成的對象,自己也能持有绝淡。
  • 不在需要自己持有對象的時候宙刘,釋放。
  • 非自己持有的對象無需釋放牢酵。

2)ARC:ARC通過在編譯期間添加合適的retain/release/autorelease等函數(shù)悬包,來確保對象被正確釋放。編譯器會根據(jù)傳入的變量是局部變量還是引用變量茁帽,返回對象的方法是不是初始化方法等信息來推斷應(yīng)當在何處加入retain/release/autorelease等函數(shù)玉罐。ARC只能管理OC的對象,不能管理通過malloc申請的內(nèi)存(malloc是c語言中的動態(tài)內(nèi)存分配函數(shù))潘拨。使用ARC時應(yīng)該盡量保證對象之間的關(guān)系呈樹形結(jié)構(gòu)吊输。
__strong 是默認使用的標識符。只有還有一個強指針指向某個對象铁追,這個對象就會一直存活季蚂。
__weak 聲明這個引用不會保持被引用對象的存活,如果對象沒有強引用了琅束,弱引用會被置為 nil
__unsafe_unretained 聲明這個引用不會保持被引用對象的存活扭屁,如果對象沒有強引用了,它不會被置為 nil涩禀。如果它引用的對象被回收掉了料滥,該指針就變成了野指針。
__autoreleasing 用于標示使用引用傳值的參數(shù)(id *)艾船,在函數(shù)返回時會被自動釋放掉葵腹。

3)垃圾回收:指的是在程序運行過程中,檢查是否有不再使用的對象屿岂,并自動釋放它們所占用的內(nèi)存践宴,通常被簡稱為GC,內(nèi)存的檢查和回收都是由垃圾收集器完成的(garbage collector)爷怀。( iOS 平臺不支持)阻肩。

<h4 id='6'>Runtime</h4>

Objective-C是動態(tài)語言,它將很多靜態(tài)語言在編譯和鏈接時做的事放到了運行時运授,這個運行時系統(tǒng)就是 Runtime烤惊。Runtime 是一個庫乔煞,這個庫使我們可以在程序運行時創(chuàng)建對象、檢查對象撕氧,修改類和對象的方法瘤缩。
靜態(tài)語言:在編譯的時候會決定調(diào)用哪個函數(shù)。
動態(tài)語言(OC):在運行的時候根據(jù)函數(shù)的名稱找到對應(yīng)的函數(shù)來調(diào)用伦泥。
isa:OC 中剥啤,類和類的實例在本質(zhì)上沒有區(qū)別,都是對象不脯,任何對象都有isa 指針府怯,它指向類或元類。
SEL:SEL(又叫選擇器)是方法的 selector 的指針防楷。方法的 selector 表示運行時方法的名字牺丙。OC在編譯時,會依據(jù)每一個方法的名字复局、參數(shù)冲簿,生成一個唯一的整型標識(Int類型的地址),這個標識就是 SEL亿昏。
IMP:IMP 是一個函數(shù)指針峦剔,指向方法最終實現(xiàn)的首地址。SEL 就是為了查找方法的最終實現(xiàn)IMP角钩。
Method:用于表示類定義中的方法吝沫,它的結(jié)構(gòu)體中包含一個 SEL 和 IMP,相當于在 SEL 和 IMP 之間作了一個映射递礼。
消息機制:任何方法的調(diào)用本質(zhì)就是發(fā)送一個消息惨险。編譯器會將消息表達式[receiver message]轉(zhuǎn)化為一個消息函數(shù) objc_msgSend(receiver, selector)。
Runtime 的使用:獲取屬性列表脊髓,獲取成員變量列表辫愉,獲得方法列表,獲取協(xié)議列表将硝,方法交換恭朗,動態(tài)的添加方法,調(diào)用私有方法袋哼,為分類添加屬性冀墨。

<h4 id='7'>Foundation框架中的類</h4>

Foundation框架包括:根對象類(NSObject)闸衫、表示基本數(shù)據(jù)類型的類(如字符串和字節(jié)數(shù)組)涛贯、存儲其他對象的集合類、表述系統(tǒng)信息和集合的類蔚出。
根對象類(NSObject及NSCopying協(xié)議一起)定義了基本的對象屬性和行為弟翘。
Foundation框架提供了很多基本類型虫腋,包括數(shù)字(NSNumber)和字符串(NSString)。還提供了一些表述其他對象的類稀余,如數(shù)組(NSArray)和字典集合(NSDictionary)類。
Foundation框架提供了訪問核心操作的類,如鎖窟绷、線程和計時器鬼店。

<h4 id='8'>Category</h4>

實現(xiàn)某個類的一部分方法的模塊叫做范疇或類別(category)
category和類一樣,在接口文件中聲明农渊,在類文件中實現(xiàn)患蹂。但是范疇中不能聲明實例變量,只能聲明方法砸紊,聲明的方法既可以是類方法也可以實例方法传于。使用場景:給現(xiàn)有的類添加方法;將一個類的實現(xiàn)拆分成多個獨立的源文件醉顽;聲明私有的方法沼溜。

@interface 類名 (范疇名)
  方法的聲明;
@end
//類名部分為范疇所屬的類的名字或即將添加該范疇的類的名字。類名必須是已經(jīng)存在的類游添,不能為一個不存在的類定義范疇

@implementation 類名 (范疇名)
  方法的定義;
@end
//實現(xiàn)部分除了不可以定義新的實例變量外系草,都和傳統(tǒng)方式的實現(xiàn)文件一樣

extension是在編譯期決定,category由運行期決定唆涝,這就是他們不同的根本之處找都。它決定了他們之間的分工與區(qū)別。extension的生命周期跟隨主類廊酣,用于隱藏私有信息能耻,你必須擁有這個類的實現(xiàn)/源碼,你才可以為它添加extension。category無法添加實例變量晓猛,在運行期間饿幅,對象內(nèi)存布局已經(jīng)確認,這時你無法破壞已經(jīng)存在的內(nèi)存空間戒职,所以無法進行實例變量的添加栗恩。

<h4 id='9'>類簇</h4>

類簇:定義相同接口并提供相同功能的一組類的集合。僅公開接口的抽象類也稱為類簇的公共類洪燥。類簇是Foundation框架廣泛使用的設(shè)計模式磕秤。類簇在公共抽象超類下對多個私有的具體子類進行分組。以這種方式對類進行分組簡化了面向?qū)ο罂蚣艿墓部梢婓w系結(jié)構(gòu)捧韵,而不會降低其功能豐富度亲澡。類簇是基于抽象工廠設(shè)計模式的。

<h4 id='10'>協(xié)議</h4>

對象的主要作用是表示所處理的消息的類型纫版,而表示對象的作用和行為的集合體就稱為協(xié)議床绪。作用如下:

  • 定義一套公用的接口(Public)
      @required:必須實現(xiàn)的方法,默認在@protocol里的方法都要求實現(xiàn)其弊。
      @optional:可選實現(xiàn)的方法(可以全部都不實現(xiàn))
  • 委托代理(Delegate)傳值:
    它本身是一個設(shè)計模式癞己,它的意思是委托別人去做某事。
    比如:兩個類之間的傳值梭伐,類A調(diào)用類B的方法痹雅,類B在執(zhí)行過程中遇到問題通知類A,這時候我們需要用到代理(Delegate)糊识。
    又比如:控制器(Controller)與控制器(Controller)之間的傳值绩社,從C1跳轉(zhuǎn)到C2,再從C2返回到C1時需要通知C1更新UI或者是做其它的事情赂苗,這時候我們就用到了代理(Delegate)傳值愉耙。
  • 聲明若干個方法(不能聲明成員變量)
  • 只要某個類遵守了這個協(xié)議,就擁有了該協(xié)議中的所有方法聲明拌滋,類對象 可直接調(diào)用方法
  • 只要父類遵守了某個協(xié)議朴沿,其子類也跟著遵守
  • 一個類可以遵循多個協(xié)議
  • 協(xié)議可以遵守協(xié)議。一個協(xié)議遵守了另一個協(xié)議败砂,就可以擁有另一份協(xié)議中的方法聲明赌渣。

<h4 id='11'>對象的復(fù)制和存儲</h4>

淺拷貝:只復(fù)制對象的指針(共享變更操作的結(jié)果)
深拷貝:復(fù)制具有新的內(nèi)存空間的對象(獨自管理)
不可變對象:進行copy得到的是淺復(fù)制,進行mutableCopy得到的是深復(fù)制昌犹。
可變對象:無論進行copy還是mutableCopy都是深復(fù)制坚芜。

本地存儲的四種方法:

  1. NSKeyedArchiver歸檔(NSCoding)序列化:將對象打包成二進制文件(類定義或?qū)ο箝g的關(guān)系改變的時候,歸檔的方法也必須改變斜姥,XML或?qū)傩员淼雀咄ㄓ眯缘母袷絹肀4鏀?shù)據(jù)鸿竖,從程序的效率及穩(wěn)定性上會更好)歸檔的逆變換稱為解檔
  2. NSUserDefaults:用來保存應(yīng)用程序設(shè)置和屬性路操、用戶保存的數(shù)據(jù)。
  3. NSFileManager write 的方式直接寫入磁盤:plist文件保存千贯,plist本身就是XML文件,名字后綴為.plist搞坝。plist主要保存的數(shù)據(jù)類型為NSString搔谴、NSNumber、NSData桩撮、NSArray敦第、NSDictionary。
  4. SQLite:采用SQLite數(shù)據(jù)庫來存儲數(shù)據(jù)

<h4 id='12'>Block</h4>

Block本質(zhì)上也是一個OC對象店量,它內(nèi)部也有個isa指針
Block是封裝了函數(shù)調(diào)用以及函數(shù)調(diào)用環(huán)境的OC對象
Block的代碼是內(nèi)聯(lián)的芜果,效率高于函數(shù)調(diào)用
Block對于外部變量默認是只讀屬性
Block被Objective-C看成是對象處理

block-struct.jpg

一個 Block 實例實際上由 6 部分構(gòu)成:
isa 指針,所有對象都有該指針融师,用于實現(xiàn)對象相關(guān)的功能右钾。
flags,用于按 bit 位表示一些 block 的附加信息旱爆,本文后面介紹 block copy 的實現(xiàn)代碼可以看到對該變量的使用舀射。
reserved,保留變量怀伦。
invoke脆烟,函數(shù)指針,指向具體的 block 實現(xiàn)的函數(shù)調(diào)用地址房待。
descriptor邢羔, 表示該 block 的附加描述信息,主要是 size 大小桑孩,以及 copy 和 dispose 函數(shù)的指針拜鹤。
variables,capture 過來的變量流椒,block 能夠訪問它外部的局部變量署惯,就是因為將這些變量(或變量的地址)復(fù)制到了結(jié)構(gòu)體中。

在 Objective-C 語言中镣隶,一共有 3 種類型的 block:
_NSConcreteGlobalBlock 全局的靜態(tài) block极谊,不會訪問任何外部變量。
_NSConcreteStackBlock 保存在棧中的 block安岂,當函數(shù)返回時會被銷毀轻猖。
_NSConcreteMallocBlock 保存在堆中的 block,當引用計數(shù)為 0 時會被銷毀

<h4 id='13'>消息發(fā)送模式</h4>

run loop/ event loop(運行回路/事件循環(huán)):應(yīng)用從操作系統(tǒng)中接受鼠標點擊等事件的消息域那,并將其轉(zhuǎn)到相應(yīng)的例行程序來處理咙边。
應(yīng)用和運行回路的處理流程:運行回路從操作系統(tǒng)(窗口服務(wù)器)中接受事件猜煮,并根據(jù)事件種類和狀態(tài)來調(diào)用相應(yīng)的例行程序,同時忽視那些沒必要處理的事件败许。事件到來隨機王带,<u>當應(yīng)用程序在處理某個消息的時候,新接收到的消息就不能被立即被處理市殷,而是被放入等待隊列中愕撰,如果沒有消息到來</u>,應(yīng)用會進入休眠等待的狀態(tài)醋寝。

delegate:當對象需要根據(jù)用途改變或增加新功能時搞挣,為了執(zhí)行新添加的處理,就需要引用一個特殊的類似于被咨詢者的對象音羞,delegate可以在運行時動態(tài)分配囱桨。(某對象接收到不能處理的消息時讓其他對象代為處理的一種方式)

通知中心:期望取得通知的對象預(yù)先向通知中心注冊期望取得的通知。某對象向通知中心(notification center)發(fā)送請求嗅绰,這稱為發(fā)送(post)通知舍肠,只要注冊過該通知的對象,都會獲得通知中心推送的消息窘面。

反應(yīng)鏈(responder chain)是具有層次結(jié)構(gòu)的GUI組件間自動發(fā)送消息的一種方式貌夕。處理消息的候補組件對象如算珠般串聯(lián)在一起,將消息傳遞給這之間的某個對象時民镜,在發(fā)現(xiàn)可以處理該消息的對象之前啡专,會順次向后面的對象“轉(zhuǎn)交”該消息,這樣的構(gòu)成就稱為反應(yīng)鏈制圈。組件都是UIResponder類的子類们童。窗體之外是NSView的子類,NSView同時也是NSResponder的子類鲸鹦。各窗體中慧库,最初被發(fā)送消息的對象稱為第一反應(yīng)者(first responder)。

<h4 id='14'>異常和錯誤</h4>

異常exception是指必須中斷程序的正常執(zhí)行來處理的特殊狀態(tài)馋嗜。
異常處理機制 exception handling mechanism:當異常發(fā)生時的處理和程序原本應(yīng)該執(zhí)行的處理分開進行的結(jié)構(gòu)齐板。當異常狀況產(chǎn)生時,程序會自動脫離出普通的函數(shù)和方法調(diào)用葛菇,轉(zhuǎn)而執(zhí)行異常處理的過程甘磨。

@try:將可能出現(xiàn)異常的代碼放在@try塊中定義
@catch:所有的一場邏輯都放在@catch塊中進行處理
@finally:最后應(yīng)用@finally塊來進行資源回收,@finally塊中的內(nèi)容是肯定會被執(zhí)行的眯停。因此济舆,一般不要在@finally中使用return、@throw等導(dǎo)致方法終止的語句莺债,一旦@finally塊中使用了return滋觉、@throw語句签夭,就會導(dǎo)致@try以及@catch塊中的return、@throw語句失效椎侠。

@try
{
    //業(yè)務(wù)實現(xiàn)代碼    
}
@catch (異常1 ex)
{
    //異常處理代碼
}
@catch (異常2 ex2)
{
    //異常處理代碼
}
//可能更多的@catch塊
@finally
{
    //資源回收
}

如果執(zhí)行@try塊里的業(yè)務(wù)邏輯代碼出現(xiàn)異常第租,系統(tǒng)將自動生成一個一場對象,該異常對象被提交給系統(tǒng)我纪,這個過程被稱之為拋出(throw)異常慎宾。當運行環(huán)境接收到異常對象時,會依次判斷該異常對象事都是@catch塊后異常類或其子類的實例宣羊,如果是,那么運行話你就能夠調(diào)用該@catch塊來處理該異常這個過程稱之為捕獲(catch)異常汰蜘,如果不是則再次用該異常對象和下一個@catch塊里的異常類進行比較仇冯,如果系統(tǒng)無法找到處理該異常的@catch塊,程序就此退出族操。@finally塊是在@try塊或@catch塊執(zhí)行完畢準備退出時執(zhí)行苛坚,而且是必須執(zhí)行的。

<h4 id='15'>并行編程</h4>

串行(Serial):在固定時間內(nèi)只能執(zhí)行單個任務(wù)色难。例如主線程泼舱,只負責 UI 顯示。
并發(fā)(Concurrent):在固定時間內(nèi)可以執(zhí)行多個任務(wù)枷莉。它和并行(Parallel)的區(qū)別在于娇昙,并發(fā)不會同時執(zhí)行多個任務(wù),而是通過在任務(wù)間不斷切換去完成所有工作笤妙。
同步(Sync):會把當前的任務(wù)加入到隊列中冒掌,除非該任務(wù)執(zhí)行完成,線程才會返回繼續(xù)運行蹲盘,也就是說同步會阻塞線程股毫。任務(wù)在執(zhí)行和結(jié)束一定遵循先后順序,即先執(zhí)行的任務(wù)一定先結(jié)束召衔。
異步(Async):會把當前的任務(wù)加入到隊列中铃诬,但它會立刻返回,無需等任務(wù)執(zhí)行完成苍凛,也就是說異步不會阻塞線程趣席。任務(wù)在執(zhí)行和結(jié)束不遵循先后順序〈己可能先執(zhí)行的任務(wù)先結(jié)束吩坝,也可能后執(zhí)行的任務(wù)先結(jié)束。

并行操作的三種方式:
NSThread
可以最大限度地掌控每一個線程的生命周期哑蔫。但也需要開發(fā)者手動管理所有的線程活動钉寝』∧牛總體使用場景很小,基本是在開發(fā)底層的開源軟件或是測試時使用嵌纲。
GCD
官推俘枫。它將線程管理推給系統(tǒng),用名為Dispatch Queue的隊列逮走;使用時只需定義每個線程需要執(zhí)行的任務(wù)鸠蚪。所有的工作都是先進先出,每個block運作速度極快(納秒級別)师溅。一般為了追求高效處理大量并行數(shù)據(jù)茅信,如異步加載圖片、網(wǎng)絡(luò)請求等墓臭。
Operations
與GCD類似蘸鲸。是Operation Queue隊列實現(xiàn),但并不局限于先進先出的隊列操作窿锉。它提供了多個接口可以實現(xiàn)暫停酌摇、繼續(xù)、終止嗡载、優(yōu)先順序窑多、依賴等復(fù)雜操作,比GCD更加靈活洼滚。Operations應(yīng)用場景較廣埂息,處理速度較快(毫秒級別)。幾乎所有的基本線程操作都可以實現(xiàn)遥巴。

并行編程的問題:
競態(tài)條件
多個線程對共享的數(shù)據(jù)鏡像讀寫耿芹,導(dǎo)致最終的數(shù)據(jù)結(jié)果不確定。
優(yōu)先倒置
低優(yōu)先級的任務(wù)會因為某種原因先于高優(yōu)先級的任務(wù)執(zhí)行挪哄。
死鎖問題
多個線程直接互相等待彼此停止執(zhí)行吧秕,以獲取某種資源,但是沒有一方會提前退出的情況迹炼。

GCD的方法:
dispatch_async
對某個線程進行異步操作砸彬。
dispatch_after
一般用于主線程的延時操作。
dispatch_once
用于確保單例的線程安全斯入。
dispatch_group
一般用于多個任務(wù)同步砂碉。當多個任務(wù)關(guān)聯(lián)到同一個群組(group)后,所以的任務(wù)執(zhí)行完后刻两,在執(zhí)行一個統(tǒng)一的后續(xù)工作增蹭。這里需要注意dispatch_group_wait是一個同步操作,它會阻塞線程磅摹。dispatch_group_notify:當任務(wù)管理組中的任務(wù)都已經(jīng)執(zhí)行完了會通知這個函數(shù)執(zhí)行滋迈。

全局隊列中的優(yōu)先級:
background
用來處理特別耗時的后臺操作霎奢,例如同步、備份饼灿。
utility
用來處理需要一些時間而又不需要立即返回結(jié)果的操作幕侠,特別適用于異步操作,例如下載碍彭、導(dǎo)入數(shù)據(jù)晤硕。
default
user-Initiated
用來處理用戶觸發(fā)的需要立即返回結(jié)果的操作,例如打開點擊的文件庇忌。
user-Interactive
用來處理與用戶交互的操作舞箍。一般用于主線程。如不及時響應(yīng)皆疹,則有可能阻塞主線程的操作疏橄。
unspecified
未確定優(yōu)先級,有系統(tǒng)根據(jù)不同環(huán)境推斷

<h4 id='16'>KVC,KVO</h4>

KVC(Key-value coding)鍵值編碼墙基,就是指iOS的開發(fā)中软族,可以允許開發(fā)者通過Key名直接訪問對象的屬性刷喜,或者給對象的屬性賦值残制。而不需要調(diào)用明確的存取方法。這樣就可以在運行時動態(tài)地訪問和修改對象的屬性掖疮。
KVC的定義都是對NSObject的擴展來實現(xiàn)的初茶,Objective-C中有個顯式的NSKeyValueCoding類別名,所以對于所有繼承了NSObject的類型浊闪,都能使用KVC恼布,下面是KVC最為重要的四個方法:

- (nullable id)valueForKey:(NSString *)key;                          //直接通過Key來取值
- (void)setValue:(nullable id)value forKey:(NSString *)key;          //通過Key來設(shè)值
- (nullable id)valueForKeyPath:(NSString *)keyPath;                  //通過KeyPath來取值
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;  //通過KeyPath來設(shè)值

KVC設(shè)值:
KVC要設(shè)值,那么就要對象中對應(yīng)的key搁宾,KVC在內(nèi)部是按什么樣的順序來尋找key的折汞。當調(diào)用setValue:屬性值 forKey:@”name“的代碼時,底層的執(zhí)行機制如下:
如果沒有找到Set<Key>方法的話盖腿,會按照_key爽待,_iskey,key翩腐,iskey的順序搜索成員并進行賦值操作鸟款。
如果開發(fā)者想讓這個類禁用KVC里,那么重寫+ (BOOL)accessInstanceVariablesDirectly方法讓其返回NO即可茂卦,這樣的話如果KVC沒有找到set:屬性名時何什,會直接用setValue:forUndefinedKey:方法。
KVC取值:
當調(diào)用valueForKey:@”name“的代碼時等龙,KVC對key的搜索方式不同于setValue:屬性值 forKey:@”name“处渣,其搜索方式如下:

  • 首先按get,,is的順序方法查找getter方法伶贰,找到的話會直接調(diào)用。如果是BOOL或者Int等值類型霍比, 會將其包裝成一個NSNumber對象幕袱。
  • 如果上面的getter沒有找到,KVC則會查找countOf,objectInAtIndex或AtIndexes格式的方法悠瞬。如果countOf方法和另外兩個方法中的一個被找到们豌,那么就會返回一個可以響應(yīng)NSArray所有方法的代理集合(它是NSKeyValueArray,是NSArray的子類)浅妆,調(diào)用這個代理集合的方法望迎,或者說給這個代理集合發(fā)送屬于NSArray的方法,就會以countOf,objectInAtIndex或AtIndexes這幾個方法組合的形式調(diào)用凌外。還有一個可選的get:range:方法辩尊。所以你想重新定義KVC的一些功能,你可以添加這些方法康辑,需要注意的是你的方法名要符合KVC的標準命名方法摄欲,包括方法簽名。
  • 如果上面的方法沒有找到疮薇,那么會同時查找countOf胸墙,enumeratorOf,memberOf格式的方法。如果這三個方法都找到按咒,那么就返回一個可以響應(yīng)NSSet所的方法的代理集合迟隅,和上面一樣,給這個代理集合發(fā)NSSet的消息励七,就會以countOf智袭,enumeratorOf,memberOf組合的形式調(diào)用。
  • 如果還沒有找到掠抬,再檢查類方法+ (BOOL)accessInstanceVariablesDirectly,如果返回YES(默認行為)吼野,那么和先前的設(shè)值一樣,會按_,_is,,is的順序搜索成員變量名两波,這里不推薦這么做瞳步,因為這樣直接訪問實例變量破壞了封裝性,使代碼更脆弱雨女。如果重寫了類方法+ (BOOL)accessInstanceVariablesDirectly返回NO的話谚攒,那么會直接調(diào)用valueForUndefinedKey:方法,默認是拋出異常氛堕。

KVO 即 Key-Value Observing馏臭,翻譯成鍵值觀察。它是一種觀察者模式的衍生。其基本思想是括儒,對目標對象的某屬性添加觀察绕沈,當該屬性發(fā)生變化時,通過觸發(fā)觀察者對象實現(xiàn)的KVO接口方法帮寻,來自動的通知觀察者乍狐。
觀察者模式:一個目標對象管理所有依賴于它的觀察者對象,并在它自身的狀態(tài)改變時主動通知觀察者對象固逗。這個主動通知通常是通過調(diào)用各觀察者對象所提供的接口方法來實現(xiàn)的浅蚪。觀察者模式較完美地將目標對象與觀察者對象解耦。
簡單來說KVO可以通過監(jiān)聽key烫罩,來獲得value的變化惜傲,用來在對象之間監(jiān)聽狀態(tài)變化。KVO的定義都是對NSObject的擴展來實現(xiàn)的贝攒,Objective-C中有個顯式的NSKeyValueObserving類別名盗誊,所以對于所有繼承了NSObject的類型,都能使用KVO隘弊。
如果我們已經(jīng)有了包含可供鍵值觀察屬性的類哈踱,那么就可以通過在該類的對象(被觀察對象)上調(diào)用名為 NSKeyValueObserverRegistration 的 category 方法將觀察者對象與被觀察者對象注冊與解除注冊:

- (void)addObserver:(NSObject *)observer 
         forKeyPath:(NSString *)keyPath 
            options:(NSKeyValueObservingOptions)options 
            context:(void *)context;

- (void)removeObserver:(NSObject *)observer 
            forKeyPath:(NSString *)keyPath;
observer:觀察者,也就是KVO通知的訂閱者梨熙。訂閱著必須實現(xiàn) 
observeValueForKeyPath:ofObject:change:context:方法
keyPath:描述將要觀察的屬性开镣,相對于被觀察者。
options:KVO的一些屬性配置串结;有四個選項哑子。
context: 上下文舅列,這個會傳遞到訂閱著的函數(shù)中肌割,用來區(qū)分消息,所以應(yīng)當是不同的帐要。
options所包括的內(nèi)容
NSKeyValueObservingOptionNew:change字典包括改變后的值
NSKeyValueObservingOptionOld:change字典包括改變前的值
NSKeyValueObservingOptionInitial:注冊后立刻觸發(fā)KVO通知
NSKeyValueObservingOptionPrior:值改變前是否也要通知(這個key決定了是否在改變前改變后通知兩次)

<h4 id='21'>AutoLayout</h4>

AutoLayout則是蘋果公司在iOS6推出的一種基于約束的把敞,描述性的布局系統(tǒng)跃捣。1).基于約束:和以往定義frame的位置和尺寸不同拳亿,AutoLayout的位置確定是以所謂相對位置的約束來定義的隆判,比如x坐標為superView的中心告喊,y坐標為屏幕底部上方10像素等
2).描述性: 約束的定義和各個view的關(guān)系使用接近自然語言或者可視化語言的方法來進行描述
3).布局系統(tǒng):即字面意思抛寝,用來負責界面的各個元素的位置弯蚜。
NSLayoutConstraint 約束滿足公式:
item1.attribute = multiplier ? item2.attribute + constant
添加對于兩個同層級view之間的約束關(guān)系惕鼓,添加到他們的父view上
對于兩個不同層級view之間的約束關(guān)系蟆肆,添加到他們最近的共同父view上
對于有層次關(guān)系的兩個view之間的約束關(guān)系期揪,添加到層次較高的父view上

<h4 id='22'>Masonry</h4>
Masonry是一個輕量級的布局框架掉奄,擁有自己的描述語法,采用更優(yōu)雅的鏈式語法封裝自動布局凤薛,簡潔明了姓建,并具有高可讀性诞仓。
Masonry的屬性:

@property (nonatomic, strong, readonly) MASConstraint *left;
@property (nonatomic, strong, readonly) MASConstraint *top;
@property (nonatomic, strong, readonly) MASConstraint *right;
@property (nonatomic, strong, readonly) MASConstraint *bottom;
@property (nonatomic, strong, readonly) MASConstraint *leading;
@property (nonatomic, strong, readonly) MASConstraint *trailing;
@property (nonatomic, strong, readonly) MASConstraint *width;
@property (nonatomic, strong, readonly) MASConstraint *height;
@property (nonatomic, strong, readonly) MASConstraint *centerX;
@property (nonatomic, strong, readonly) MASConstraint *centerY;
@property (nonatomic, strong, readonly) MASConstraint *baseline;

例:

UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);

[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.top.equalTo(superview.mas_top).with.offset(padding.top); //with is an optional semantic filler
    make.left.equalTo(superview.mas_left).with.offset(padding.left);
    make.bottom.equalTo(superview.mas_bottom).with.offset(-padding.bottom);
    make.right.equalTo(superview.mas_right).with.offset(-padding.right);
}];
//也可以寫成
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.edges.equalTo(superview).with.insets(padding);
}];
.equalTo相當于NSLayoutRelationEqual
.lessThanOrEqualTo相當于NSLayoutRelationLessThanOrEqual
.greaterThanOrEqualTo相當于NSLayoutRelationGreaterThanOrEqual
//例
// width> = 200 && width <= 400 
make.width.greaterThanOrEqualTo(@ 200);
make.width.lessThanOrEqualTo(@ 400);

優(yōu)先級:
.priority 允許您指定確切的優(yōu)先級
.priorityHigh相當于UILayoutPriorityDefaultHigh
.priorityMedium是高低之間的一半
.priorityLow相當于UILayoutPriorityDefaultLow

//例
make.left.greaterThanOrEqualTo(label.mas_left).with.priorityLow();
make.top.equalTo(label.mas_top).with.priority(600);

<h4 id='23'>Mantle</h4>

Mantle的目的是簡化Cocoa和Cocoa Touch應(yīng)用的model層
最主要的就是二個類和一個協(xié)議,即:

  • MTLModel類:通常是作為我們的Model的基類速兔,該類提供了一些默認的行為來處理對象的初始化和歸檔操作墅拭,同時可以獲取到對象所有屬性的鍵值集合。
  • MTLJSONAdapter類:用于在MTLModel對象和JSON字典之間進行相互轉(zhuǎn)換涣狗,相當于是一個適配器谍婉。
  • MTLJSONSerializing協(xié)議:需要與JSON字典進行相互轉(zhuǎn)換的MTLModel的子類都需要實現(xiàn)該協(xié)議,以方便MTLJSONApadter對象進行轉(zhuǎn)換镀钓。
    以GHIssue為例屡萤,通常會以以下方式來定義Model:
//Model繼承了通常是MTLModel類,同時實現(xiàn)了MTLJSONSerializing協(xié)議
@interface GHIssue : MTLModel <MTLJSONSerializing>
@property (nonatomic, copy, readonly) NSURL *URL;
@property (nonatomic, copy, readonly) NSURL *HTMLURL;
@property (nonatomic, copy, readonly) NSNumber *number;
@property (nonatomic, assign, readonly) GHIssueState state;
...
@end
//實現(xiàn)MTLJSONSerializing協(xié)議的+JSONKeyPathsByPropertyKey類方法
//將屬性名的鍵值與JSON字典的鍵值做一個映射
//MTLJSONAdapter對象便可以自動進行賦值操作和編碼解碼操作
@implementation GHIssue
...
+ (NSDictionary *)JSONKeyPathsByPropertyKey {
    return @{
        @"URL": @"url",
        @"HTMLURL": @"html_url",
        @"reporterLogin": @"user.login",
        @"assignee": @"assignee",
        @"updatedAt": @"updated_at"
    };
}
...
@end

Model對象的屬性與JSON數(shù)據(jù)之間的映射是通過字典來實現(xiàn)的掸宛。通過這種對應(yīng)關(guān)系死陆,Model對象便可以和JSON數(shù)據(jù)相互轉(zhuǎn)換。需要注意的是返回中字典中的key值在Model對象中必須有對應(yīng)的屬性唧瘾,否則Model對象將無法初始化成功措译。

//Model對象的屬性與JSON數(shù)據(jù)之間的轉(zhuǎn)換
@implementation GHIssue
...
+ (NSValueTransformer *)URLJSONTransformer {
    return [NSValueTransformer valueTransformerForName:MTLURLValueTransformerName];
}
+ (NSValueTransformer *)HTMLURLJSONTransformer {
    return [NSValueTransformer valueTransformerForName:MTLURLValueTransformerName];
}
+ (NSValueTransformer *)stateJSONTransformer {
    return [NSValueTransformer mtl_valueMappingTransformerWithDictionary:@{
        @"open": @(GHIssueStateOpen),
        @"closed": @(GHIssueStateClosed)
    }];
}
...
@end
//通過MTLJSONAdapter類來適配MTLModel對象和JSON數(shù)據(jù)
//根據(jù)JSON字典創(chuàng)建一個GHIssue對象完成
NSError *error = nil;
NSDictionary *JSONDictionary = ...;
GHIssue *issue = [MTLJSONAdapter modelOfClass:GHIssue.class fromJSONDictionary:JSONDictionary error:&error];

//從這個對象中獲取到相應(yīng)的JSON字典    
NSDictionary *JSONDictionary = [MTLJSONAdapter JSONDictionaryFromModel:issue];

<h4 id='24'>UITabBarController</h4>

  • 通過賦予UITabBarController的屬性viewControllers,來配置每個tab切換所對應(yīng)的controller饰序。viewControllers中每個元素的順序決定了在頁面中哪個tab對應(yīng)的view會默認顯示领虹,如果要手動指定一個要顯示的view,通過指定屬性selectedViewController來設(shè)置默認指定的view求豫∷ィ或者使用selectedIndex也可以來指定要默認顯示的view。
  • 每個tabbar的tabbar item是根據(jù)它自身對應(yīng)的controller來進行配置的蝠嘉。如果要讓tabbar item和其相關(guān)的controller進行關(guān)聯(lián)最疆,那么就要創(chuàng)建一個UITabBarItem實例,然后指定給響應(yīng)的controller蚤告。例如:
    firstViewController.tabBarItem = [[UITabBarItem alloc] init]; 若沒有指定特定的tabBarItem努酸,那么當前頁面對應(yīng)的viewcontroller會創(chuàng)建一個默認的沒有圖片的item且item的title為viewcontroller的title內(nèi)容。
  • UITabBarControllerDelegate protocol.任何一個tab切換都會觸發(fā)與delegate發(fā)送消息杜恰。通過delegate可以完成特定tabbar 被選中的時候執(zhí)行額外的方法获诈。這些delegate方法都是可選的。

UITabBarController 本身并不會顯示任何視圖心褐,如果要顯示視圖則必須設(shè)置其 viewControllers 屬性(它默認顯示 viewControllers[0])舔涎。這個屬性是一個數(shù)組,它維護了所有 UITabBarController 的子控制器逗爹。
為了盡可能減少視圖之間的耦合亡嫌,所有的 UITabBarController 的子控制器的相關(guān)標題、圖標等信息均由子控制器自己控制,UITabBarController 僅僅作為一個容器存在昼伴。
UITabBarController 生命周期:
1.把子控制器都添加給 TabBarController 管理匾旭,當程序啟動時它只會加載第一個添加的控制器的view。
2.切換到第二個界面圃郊。先把第一個界面的view移開价涝,再把新的view添加上去,但是第一個view只是被移開沒有被銷毀持舆。
3.重新切換到第一個界面色瘩,第一個的控制器直接 viewWillAppear,不會再執(zhí)行 viewDidLoad 方法逸寓。第二個界面中的 view 移除后并沒有被銷毀(因為它的控制器還存在居兆,有一個強引用引用著它)。
4.UINavigationController 通過棧來管理視圖竹伸,UITabBarController 通過數(shù)組來管理視圖控泥栖。

常用屬性:

viewControllers:設(shè)置 UITabBarController 的子控制器
selectedIndex:屬性可用于設(shè)置當前被選中的為哪個 Viewcontroller
selectedViewController:設(shè)置該屬性可以設(shè)置當前選中的 ViewController
tabBar:設(shè)置 UITabBarController 底部標簽欄背景圖片、背景顏色勋篓、系統(tǒng)圖標顏色等信息
tabBarItem:設(shè)置 UITabBarController 子控制器的相關(guān)標題吧享、圖標等信息
delegate:可以獲取 TabBar 上點擊事件

UITabBarItem?面顯?什么內(nèi)容,由對應(yīng)子控制器的 tabBarItem 屬性來決定譬嚣。

UITabBar上面顯示的每一個Tab都對應(yīng)著一個ViewController钢颂,我們可以通過設(shè)置 Viewcontroller 的 tabBarItem 屬性來改變 Tabbar 上對應(yīng)的tab顯示內(nèi)容。

否則系統(tǒng)將會根據(jù) ViewController 的 title 自動創(chuàng)建一個TabBarItem拜银,該 TabBarItem 只顯示文字殊鞭,沒有圖標。當我們自己創(chuàng)建 UITabBarItem 的時候尼桶,我們可以指定顯示的圖標和對應(yīng)的文字操灿。
UITabBar屬性:

backgroundImage:設(shè)置 TabBar 背景圖片
selectionIndicatorImage:設(shè)置 TabBar 選中 Item 背景圖片
barTintColor:TabBar背景顏色
tintColor:TabBar選重 Item 圖標顏色,只有使用系統(tǒng)默認圖標時才有效
shadowImage:設(shè)置分隔線條
[self.tabBar setBackgroundImage:[UIImageimageNamed:@"TabBar_backGround_01"]];//設(shè)置tabBar背景圖片

[self.tabBar setSelectionIndicatorImage:[UIImage imageNamed:@"TabBar_backGround"]];//設(shè)置tabBar選中item背景圖片

[self.tabBar setBarTintColor:[UIColorblackColor]];//設(shè)置tabBar背景顏色

[self.tabBar setTintColor:[UIColorredColor]];//設(shè)置tabBar選中item圖標顏色疯汁,只有使用系統(tǒng)默認圖標時才有效

UITabBarItem屬性:

title:標題文字
image:圖標圖片
selectedImage:設(shè)置選中時圖標圖片
badgeValue:設(shè)置提醒數(shù)字

<h4 id='25'>UINavigationBar</h4>

UINavigationController 是以棧的方式管理它的視圖控制器的牲尺,視圖控制器的彈入彈出都是入棧卵酪、出棧的過程幌蚊,導(dǎo)航棧就相當于存放 ViewController 的數(shù)組。
1溃卡、NavigationController 以導(dǎo)航棧來存儲 ViewController溢豆。
2、NavigationBar 一直存在于界面上方瘸羡,由 NavigationController 根據(jù) Navigation Stack 中棧頂?shù)腣iewController 的內(nèi)容來管理漩仙。
3、Toolbar 則存在于界面下方且默認為隱藏,同樣由 NavigationController 根據(jù)Navigation Stack中棧頂?shù)?ViewController 的內(nèi)容來管理队他。
4卷仑、UINavigationController的ContentView里始終顯示棧頂控制器的view。
5麸折、NavigationController是一個ViewController容器锡凝,它把其他的ViewController的內(nèi)容嵌套在容器里。 你能看到一個NavigationController的view垢啼,它包含了navigation bar窜锯、toolbar和一個相當于棧頂ViewController的content view。
UINavigationController常用方法

pushViewController
popViewControllerAnimated
popToViewController
popToRootViewControllerAnimated
setViewControllers

UINavigationController常用屬性:

viewControllers:所有處于棧中的控制器
topViewController:位于棧頂?shù)目刂破?visibleViewController:當前可見的VC芭析,可能是topViewController锚扎,也可能是當前topViewController present(modal)出來的VC,總而言之就是可見的VC馁启。
navigationBar:頂部導(dǎo)航欄
navigationItem:設(shè)置導(dǎo)航欄上的按鈕
setToolbarHidden:工具條

導(dǎo)航條驾孔,UINavigationBar除了能定義自身的樣式外,還管理一組UINavigationItem惯疙。
UINavigationBar常用屬性:

barTintColor:設(shè)置導(dǎo)航欄顏色
tintColor:設(shè)置導(dǎo)航欄兩邊按鈕顏色
translucent:navigationBar的透明狀態(tài)助币,默認是半透明的
barStyle:設(shè)置navigationBar的樣式
setBackgroundImage: forBarMetrics:設(shè)置navigationBar的背景圖片
shadowImage:設(shè)置分隔線條

<h4 id='26'>UITableView</h4>

iOS的UITableView顯示單列垂直滾動內(nèi)容。表格中的每一行都包含一段應(yīng)用內(nèi)容螟碎。UITableView管理表的基本外觀眉菱,提供顯示實際內(nèi)容的單元格(對象)。標準單元格配置顯示文本和圖像的簡單組合掉分,但可以定義顯示所需內(nèi)容的自定義單元格俭缓。還可以提供頁眉和頁腳視圖,以便為單元格組提供其他信息酥郭。
UITableView有兩種風格:UITableViewStylePlain和UITableViewStyleGrouped华坦。這兩者操作起來其實并沒有本質(zhì)區(qū)別,只是后者按分組樣式顯示前者按照普通樣式顯示而已不从。

UITableView是利用NSIndexPath類型確定一個UITableViewCell單元格所在的位置的惜姐。NSIndexPath包含兩個成員,一個是section椿息,一個是row歹袁。section代表的是分組號,row代表的是在該分組下的行號(都從0開始編號)寝优。例如section=1条舔,row=2就代表了第2個分組的第3行。

在加載一個UITableView時乏矾,系統(tǒng)會自動調(diào)用其UITableViewDataSource代理方法(數(shù)據(jù)源協(xié)議方法)孟抗,如果UITableView所在的UIViewController沒有實現(xiàn)其數(shù)據(jù)源代理迁杨,那么這個iOS程序就會拋出異常。所以要實現(xiàn)UITableViewDataSource協(xié)議凄硼,具體實現(xiàn)方法詳見Objective-C的協(xié)議铅协。

在UITableViewDataSource中,規(guī)定了一下方法摊沉,用于確定UITableView的格式和內(nèi)容:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
//確定UITableView的分組個數(shù)警医,一般這個方法直接返回分組數(shù)即可。

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
//確定第section個分組的標題文本坯钦,一般通過switch語句來判斷section的值预皇,根據(jù)不同section來返回不同的字符串。

- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section  
//確定第section個分組的說明文本婉刀,一般通過switch語句來判斷section的值吟温,根據(jù)不同section來返回不同的字符串。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
//確定第section個分組包含的UITableViewCell單元格個數(shù)突颊,一般通過switch語句來判斷section的值鲁豪,根據(jù)不同section來返回不同整數(shù)。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
//在每個UITableViewCell單元格被加載的時候都要調(diào)用一次律秃,在其中要實現(xiàn)UITableViewCell的重用爬橡,并且要設(shè)置UITableViewCell的各種屬性,一般利用兩層嵌套的switch語句分別判斷indexPath的section和row棒动。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(nonnull NSIndexPath *)indexPath
//在任何一個UITableViewCell單元格被用戶點按的時候都會調(diào)用糙申,在其中要實現(xiàn)點按不同UITableViewCell的不同行為,包括跳轉(zhuǎn)等船惨,同樣地一般利用兩層嵌套的switch語句分別判斷indexPath的section和row柜裸。

UITableViewCell的重用
在Dynamic Prototypes內(nèi)容模式下,UITableViewCell要求必須進行重用(reuse)粱锐。重用方法

- (UITableViewCell *)tableView:(UITableView *)tableView
           cellForRowAtIndexPath:(NSIndexPath *)indexPath

<h4 id='27'>UIScrollView</h4>

UIScrollView是用來在屏幕上顯示那些在有限區(qū)域內(nèi)放不下的內(nèi)容疙挺。ScrollView應(yīng)該首先有一個窗口,用來顯示內(nèi)容怜浅,其次铐然,還要有內(nèi)容本身。這里的這個顯示窗口就是UIScrollView恶座,這個窗口可以是整個手機屏幕搀暑,也可以只是手機屏幕的一部分區(qū)域(屏幕其他部分可以顯示些別的東西)。

contentSize描述了有多大范圍的內(nèi)容需要使用scrollView的窗口來顯示奥裸,其默認值為CGSizeZero险掀,也就是一個寬和高都是0的范圍。contentSize的范圍是以scrollView的位置為基準的湾宙。

contentOffset: 描述了內(nèi)容視圖相對于scrollView窗口的位置(當然是向上向左的偏移量咯)樟氢。默認值是CGPointZero,也就是(0,0)侠鳄。當視圖被拖動時埠啃,系統(tǒng)會不斷修改該值。也可以通過setContentOffset:animated:方法讓圖片到達某個指定的位置伟恶。

scrollRectToVisible:animated:與setContentOffset:animated:類似碴开,只不過是將scrollView坐標系內(nèi)的一塊指定區(qū)域移到scrollView的窗口中,如果這部分已經(jīng)存在于窗口中博秫,則什么也不做潦牛。

contentInset: 表示scrollView的內(nèi)邊距,也就是內(nèi)容視圖邊緣和scrollView的邊緣的留空距離挡育,默認值是UIEdgeInsetsZero巴碗,也就是沒間距。

回彈機制:bounces alwaysBounceHorizontal alwaysBounceVertical

  • bounces:描述的當scrollview的顯示超過內(nèi)容區(qū)域的邊緣以及返回時即寒,是否有彈性橡淆,默認值為YES。值為YES的時候母赵,意味著到達contentSize所描繪的的邊界的時候逸爵,拖動會產(chǎn)生彈性。值為No的時候凹嘲,拖動到達邊界時师倔,會立即停止。所以周蹭,如果在上面的例子當中溯革,將bounces設(shè)置為NO時,窗口中是不會顯示contentSize范圍外的內(nèi)容的谷醉。
  • alwaysBounceHorizontal:默認值為NO致稀,如果該值設(shè)為YES,并且bounces也設(shè)置為YES俱尼,那么抖单,即使設(shè)置的contentSize比scrollView的size小,那么也是可以拖動的遇八。
  • alwaysBounceVertical:默認值為NO矛绘,如果該值設(shè)為YES,并且bounces也設(shè)置為YES刃永,那么货矮,即使設(shè)置的contentSize比scrollView的size小,那么也是可以拖動的斯够。

狀態(tài)條顯示:
根據(jù)我們的實際需要囚玫,我們可以對狀態(tài)條進行各種設(shè)置喧锦。

  • indicatorStyle: 狀態(tài)條的風格,默認值為UIScrollViewIndicatorStyleDefault抓督。除此之外燃少,還有UIScrollViewIndicatorStyleBlack, UIScrollViewIndicatorStyleWhite兩種其他風格×逶冢可以用來和環(huán)境配色阵具。
  • showsHorizontalScrollIndicator : 當處于跟蹤狀態(tài)(tracking)時是否顯示水平狀態(tài)條,默認值為YES定铜。下一節(jié)說明什么是跟蹤狀態(tài)阳液。
  • showsVerticalScrollIndicator : 當處于跟蹤狀態(tài)(tracking)時是否顯示垂直狀態(tài)條,默認值為YES揣炕。
  • scrollIndicatorInsets : 狀態(tài)條和scrollView邊距的距離(暫時還沒想明白為什么要有這個)帘皿。
  • flashScrollIndicators: 短暫的顯示一下狀態(tài)條,當你將scrollView調(diào)整到最上面時祝沸,需要調(diào)用一下該方法矮烹。

狀態(tài)跟蹤:
之前提到過跟蹤狀態(tài)(tracking)。相關(guān)的屬性有三個:tracking dragging decelerate罩锐,這三個屬性表明了當前視圖的滾動狀態(tài)奉狈。

  • tracking: 只讀,一旦用戶開始觸摸視圖(也許還沒有開始拖動)涩惑,該屬性值為YES
  • dragging: 只讀仁期,當用戶開始拖動(手指已經(jīng)在屏幕上滑動一段距離了),該屬性值為YES
  • decelerate: 只讀竭恬,當用戶松開手指跛蛋,但視圖仍在滾動時,該值返回YES
  • zooming: 只讀痊硕,用戶是否正在進行縮放手勢赊级。
  • zoomBouncing:只讀,當縮放超過最大或者最小范圍的時候岔绸,回彈到最大最小范圍的過程中理逊,該值返回YES。

縮放:
scrollView除了支持拖動之外盒揉,還支持縮放晋被。

  • maximumZoomScale: 最大放大比例,默認值為1刚盈,不得小于minimumZoomScale
  • minimumZoomScale: 最小放大比例羡洛,默認值為1,不得大于maxmumZoomScale
  • bouncesZoom: 描述在縮放超過縮放比例時藕漱,是否bounce欲侮,默認值為YES崭闲。如果值為NO,則達到最大或最小縮放比例時會立即停止縮放锈麸。否則镀脂,產(chǎn)生彈簧效果牺蹄。
  • zoomScale: 當前的縮放比例忘伞。系統(tǒng)會根據(jù)縮放過程調(diào)整此值。
  • setZoomScale:animated:: 程序設(shè)置縮放大小沙兰。
  • zoomToRect:animated: 將內(nèi)容視圖縮放到指定的Rect中氓奈。
  • panGestureRecognizer
  • pinchGestureRecognizer

其他設(shè)置

  • delegate: scrollView的委托對象,該委托對象必須實現(xiàn)UIScrollViewDelegate協(xié)議鼎天,這些方法會在合適的時候被調(diào)用舀奶。
  • scrollEnabled:視圖是否可被拖動,默認值為YES斋射。一旦該值設(shè)置為NO育勺,則scrollView不再接受觸屏事件,會直接傳遞響應(yīng)鏈罗岖。
  • scrollToTop:是否啟動“滾動至頂端”手勢涧至,默認值為YES。當用戶使用了“滾動至頂端”手勢(輕擊狀態(tài)欄)時桑包,系統(tǒng)會要求離狀態(tài)欄最近的scrollView滾動到頂端南蓬,如果scrollToTop設(shè)置為NO,則該scrollView的delegate的scrollViewShouldScrollToTop:方法會返回NO哑了,不會滾動到頂端赘方。否則,則會滾動到頂端弱左。滾動到頂端之后窄陡,會給delegate發(fā)送scrollViewDidScrollToTop:消息。需要注意的是拆火,在iphone上跳夭,如果有多個scrollview的scrollToTop參數(shù)設(shè)置為YES的時候,“滾動至頂端”手勢會失效榜掌。
  • delaysContentTouches:是否推遲觸屏手勢處理优妙,默認值為YES。設(shè)置為YES的時候憎账,系統(tǒng)在確定是否發(fā)生scroll事件之后套硼,才會處理觸屏手勢,否則胞皱,則會立即調(diào)用touchesShouldBegin:withEvent:inContentView:方法邪意。
  • directionalLockEnabled:是否鎖定某個特定方向的滾動九妈,默認值為NO。設(shè)置為YES時雾鬼,一旦用戶向水平或豎直方向拽動時萌朱,另一個方向的滾動則被鎖定了。但是如果首次拽動是斜著的策菜,那么則不會鎖定方向晶疼。
  • keyboardDismissMode: 當拖動發(fā)生時,鍵盤的消失模式又憨,默認值是不消失翠霍。
  • pagingEnabled:是否使用分頁機制,默認值為NO蠢莺。當設(shè)置為YES時寒匙,會按照scrollView的寬度對內(nèi)容視圖進行分頁。
  • decelerationRate: 手指滑動后抬起躏将,頁面的減速速率锄弱。可以使用UIScrollViewDecelerationRateNormal和UIScrollViewDecelerationRateFast常量值來設(shè)置合理的減速速率祸憋。

<h4 id='28'>NSURLConnection</h4>

作用:
1会宪、負責發(fā)送請求,建立客戶端和服務(wù)器的連接發(fā)送數(shù)據(jù)給服務(wù)器
2夺衍、并收集來自服務(wù)器的響應(yīng)數(shù)據(jù)

步驟:
1狈谊、創(chuàng)建一個NSURL對象,設(shè)置請求路徑
2沟沙、傳入NSURL并創(chuàng)建一個NSURLRequest對象河劝,設(shè)置請求頭和請求體
3、使用NSURLConnection發(fā)送請求

NSURL:收納請求的地址
NSURLRequest:一個NSURLRequest對象就代表一個請求矛紫,它包含的信息有一個NSURL對象赎瞎、請求方法、請求頭颊咬、請求體等等
NSMutableURLRequest是NSURLRequest的子類

同步請求例:

-(void)sendSynchronousRequest{
    //1务甥、創(chuàng)建一個URL
    //協(xié)議頭+主機地址+接口名稱+?+參數(shù)1&參數(shù)2&參數(shù)3
    //這里的話是我自己使用.Net開發(fā)的一個本地后臺接口 http://192.168.1.0:8080/login?username=LitterL&pwd=123
    NSURL *url = [NSURL URLWithString:@"http://192.168.1.0:8080/login?username=LitterL&pwd=123"];

    //2、創(chuàng)建請求(Request)對象(默認為GET請求)喳篇;
    NSURLRequest *requst = [[NSURLRequest alloc]initWithURL:url];

    //3敞临、發(fā)送請求
    /*
     第一個參數(shù):請求對象
     第二個參數(shù):響應(yīng)頭
     第三個參數(shù):錯誤信息
     返回值:NSData類型,響應(yīng)體信息
     */
    NSError *error = nil;
    NSURLResponse *response = nil;
    //發(fā)送同步請求(sendSynchronousRequest)
    NSData *data = [NSURLConnection sendSynchronousRequest:requst returningResponse:&response error:&error];
    //如果沒有錯誤就執(zhí)行
    if (!error) {
        //打印的服務(wù)端返回的信息以及錯誤信息
        NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
        NSLog(@"%@",error);
    }
}

異步請求例:

-(void)sendAsynchronousRequest{
        //1、創(chuàng)建一個URL
        NSURL *url = [NSURL URLWithString:@"http://192.168.1.0:8080/login"];

        //2麸澜、創(chuàng)建請求(Request)對象 這里使用的是它的子類NSMutableURLRequest,因為子類才具有設(shè)置方法和設(shè)置請求體的屬性
        NSMutableURLRequest *requst = [[NSMutableURLRequest alloc]initWithURL:url];
        //2.1挺尿、設(shè)置請求方法
        requst.HTTPMethod = @"POST";
        //2.2、設(shè)置請求體,因為傳入的為Data數(shù)據(jù)所有這里需要轉(zhuǎn)換
        requst.HTTPBody = [@"username=LitterL&pwd=123" dataUsingEncoding:NSUTF8StringEncoding];
        //2.3、設(shè)置請求超時時間编矾,如果超過這個時間熟史,請求為失敗
        requst.timeoutInterval = 10;

        //3、發(fā)送請求

        /*
         第一個參數(shù):請求對象
         第二個參數(shù):隊列
         第三個參數(shù):Block回調(diào)函數(shù)
            response:響應(yīng)頭
            data:響應(yīng)體信息
            connectionError:錯誤信息
         */

        //發(fā)送異步請求(sendAsynchronousRequest)
        [NSURLConnection sendAsynchronousRequest:requst 
                                           queue:[[NSOperationQueue alloc]init] 
                               completionHandler:^(NSURLResponse * _Nullable response, 
                                          NSData * _Nullable data, 
                                       NSError * _Nullable connectionError) {
            NSLog(@"----%@",[NSThread currentThread]);

            //解析數(shù)據(jù)
            NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
        }];
    }

<h4 id='29'>NSURLSession</h4>

NSURLSession提供了一個可供通過網(wǎng)絡(luò)下載內(nèi)容的API窄俏,并且具有豐富的代理方法蹂匹。在iOS中,NSURLSession支持在app未運行或掛起時進行后臺下載凹蜈。此外限寞,NSURLSession原生的支持data、file踪区、ftp昆烁、http和https URL方案吊骤,以及用戶首選項中代理和socks網(wǎng)關(guān)缎岗。

  1. Session類型
    會話由創(chuàng)建配置對象時調(diào)用的方法決定“追郏可以分為以下幾類:
  • Shared Session:獲取單例對象传泊。使用全局共享的會話,并且不能調(diào)整cache鸭巴、cookie和證書等眷细;也不能使用代理方法,因此將不能檢測下載進度一類事件鹃祖。
  • Default Session:默認會話配置使用基于磁盤持久緩存溪椎,將憑據(jù)保存在用戶的鑰匙串中,默認將cookie存儲在與NSURLConnection相同的共享cookie存儲中恬口。通過調(diào)用NSURLSessionConfiguration類中的defaultSessionConfiguration方法創(chuàng)建默認會話校读。
  • Ephemeral Session:會把cacehe、cookie和用戶憑據(jù)保存在RAM中而不是用戶磁盤中祖能,只有在你主動保存某個URL的內(nèi)容到某個文件時才會保存數(shù)據(jù)歉秫,因此最大好處是可以保護用戶隱私,適用于無痕瀏覽养铸⊙丬剑可以緩存的數(shù)據(jù)大小取決于剩余RAM大小,當會話銷毀后钞螟,所有臨時數(shù)據(jù)均會清除兔甘。另外,在iOS中鳞滨,應(yīng)用程序掛起時保存在內(nèi)存中的數(shù)據(jù)不會被清除洞焙,但在應(yīng)用程序終止或系統(tǒng)內(nèi)存不足時會被清除。通過調(diào)用NSURLSessionConfiguration類中的ephemeralSessionConfiguration創(chuàng)建Ephmeral Session。
  • Background Session:允許在后臺執(zhí)行HTTP和HTTPS上傳或下載任務(wù)闽晦。backgroundSessionConfigurationWithIdentifier:配置的會話由系統(tǒng)在單獨的進程中控制數(shù)據(jù)傳輸扳碍。在iOS中,backgroundSessionConfigurationWithIdentifier:配置的會話可以使應(yīng)用程序掛起或終止后依然進行傳輸數(shù)據(jù)仙蛉。如果app是由系統(tǒng)終止并重新啟動笋敞,app可以使用相同標志符創(chuàng)建新配置對象和會話,并恢復(fù)到終止時的傳輸狀態(tài)荠瘪;如果用戶從多任務(wù)屏幕中終止app夯巷,系統(tǒng)會取消所有后臺傳輸任務(wù),此外哀墓,系統(tǒng)也不會重新啟動app趁餐,必須由用戶啟動app后傳輸任務(wù)才會繼續(xù)。通過調(diào)用NSURLSessionConfiguration類中的backgroundSessionConfigurationWithIdentifier:創(chuàng)建Background Session篮绰。
    // 創(chuàng)建Shared Session
    NSURLSession *sharedSession = [NSURLSession sharedSession];   // 只能在completionHandler的塊中獲取數(shù)據(jù)
    
    // 創(chuàng)建Default Session
    NSURLSessionConfiguration *defaultSessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultSessionConfiguration delegate:self delegateQueue:nil]; // 在代理方法中獲取數(shù)據(jù)
    
    // 創(chuàng)建Ephemeral Session
    NSURLSessionConfiguration *ephemeralSessionConfiguration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
    NSURLSession *ephemeralSession = [NSURLSession sessionWithConfiguration:ephemeralSessionConfiguration]; // 在completionHandler的塊中獲取數(shù)據(jù)
    
    // 創(chuàng)建Background Session
    NSURLSessionConfiguration *backgroundSessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"identifier"];
    NSURLSession *backgroundSession = [NSURLSession sessionWithConfiguration:backgroundSessionConfiguration];   // 在completionHandler的塊中獲取數(shù)據(jù)
  1. Task類型
    在會話中后雷,創(chuàng)建任務(wù)用于上傳數(shù)據(jù)到服務(wù)器,然后從服務(wù)器取回文件到本地磁盤或NSData對象到內(nèi)存中吠各,NSURLSessionAPI提供三種Task類型臀突。
  • Data Task:發(fā)送和接收NSData類型數(shù)據(jù),一般用于交互式請求贾漏。
  • Upload Task:繼承自Data Task候学,一般以文件格式傳輸數(shù)據(jù)。支持app未運行時上傳數(shù)據(jù)纵散。
  • Download Task:取回的數(shù)據(jù)是文件格式梳码,支持app未運行時上傳收捣、下載枫攀。
    和其他網(wǎng)絡(luò)請求API一樣,NSURLSession也是異步的橄妆,根據(jù)你Session配置的不同硕盹,以下面兩種方式之一返回數(shù)據(jù)符匾。
    從completionHandler的塊中獲取數(shù)據(jù),當傳輸完成或失敗后調(diào)用塊瘩例。
    在代理方法中獲取數(shù)據(jù)啊胶。有多種代理方法可供選擇使用,比上面的方法功能強大些垛贤,例如可以檢測下載進度焰坪。
  1. NSURLSession的使用步驟
    (1)創(chuàng)建會話配置。對于Background Session必須包含一個單獨的標志符聘惦,標志符不能為nil或空字符串某饰,用于在app崩潰、終止或掛起后將會話再次匹配。
    (2)選擇會話配置類型黔漂,創(chuàng)建會話诫尽。
    (3)創(chuàng)建任務(wù)。根據(jù)想要實現(xiàn)的功能選擇Task類型炬守。
    (4)執(zhí)行任務(wù)牧嫉。所有創(chuàng)建的任務(wù)默認都是掛起狀態(tài),必須調(diào)用resume方法任務(wù)才會執(zhí)行减途。

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:@"https://itunes.apple.com/search?term=apple&media=software"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        NSLog(@"%@",json);
    }];
    [dataTask resume];
}

<h4 id='30'>git</h4>

一酣藻、本地管理

1. 提交操作

(1). 配置全局用戶名和郵箱

配置用戶名 : git config --global user.name "liwenqi08"

配置郵箱 : git config --global user.email "liwenqi08@maoyan.com"

獲取全局配置信息 : git config --list

(2). 創(chuàng)建倉庫

cd到你想要創(chuàng)建倉庫的地址,運行 git init 鳍置,根目錄下多了一個.git的文件夾辽剧,本地倉庫就已經(jīng)建好了

(3). 忽略文件

有時候有些文件我們不想每次提交,那么我們可以配置.gitignore税产,并把它放到根目錄怕轿,忽略該文件的效果。eg:在里面添加 .DS_Store砖第,則不會對該文件的修改加入到工作區(qū)中撤卢。有些已經(jīng)跑過的項目,你會發(fā)現(xiàn)你在.gitignore加入 xcuserdata/ 后梧兼,UserInterfaceState.xcuserstate這個文件還是頻繁更新,擾人至極智听,去掉這個文件的具體步驟如下:

到目錄下把這個文件直接干掉羽杰,然后commit這次修改,重啟Xcode就好了到推。

或者使用命令行:

git rm --cached 該文件路徑

git commit -m "Removed stupid file"

(4). 查看倉庫的當前狀態(tài)

git status 查看當前文件狀態(tài)

git diff 查看當前改動

git diff HEAD -- filename 查看該文件工作區(qū)與當前版本庫的差別

(5). 查看之前的所有l(wèi)og

git log 查看詳細改動

git log --pretty=oneline 簡單方式查看版本改動

(6). 從工作區(qū)添加到暫存區(qū)

git add filename.txt 添加單個文件

git add *.txt 添加所有txt文件

git add . 添加所有文件

(7). 丟棄工作區(qū)中的修改

git checkout -- filename 丟棄對應(yīng)文件的修改

git checkout head . 丟棄所有工作區(qū)的修改

(8). 將暫存的修改還原到工作區(qū)

git reset head 或者 git reset head filename

(9). 將暫存區(qū)的改動上傳到倉庫

git commit -m "commitSomething"

(10). 版本回歸

git reset --mixed:此為默認方式考赛,不帶任何參數(shù)的git reset,即時這種方式莉测,它回退到某個版本颜骤,只保留源碼,回退commit和index信息

git reset --soft:回退到某個版本捣卤,只回退了commit的信息忍抽,不會恢復(fù)到index file一級。如果還要提交董朝,直接commit即可

Git reset --hard:徹底回退到某個版本鸠项,本地的源碼也會變?yōu)樯弦粋€版本的內(nèi)容

git reset --hard HEAD^ 回滾到上一個版本

在沒關(guān)閉命令行的前提下,找到上次git log的日志子姜,找到對應(yīng)的版本號祟绊,輸入git reset --hard 最后一條數(shù)據(jù)回來了。已經(jīng)關(guān)了命令行就執(zhí)行 git reflog

2. 分支管理

(1). 創(chuàng)建分支

git checkout -b branchName (相當與: git branch branchName git checkout branchName兩句命令)

git branch branchName 在指定節(jié)點創(chuàng)建分支

(2). 查看當前所有分支以及狀態(tài)

git branch

(3). 合并分支

git merge branchName 用于合并指定分支到當前分支

(4). 刪除分支

git branch -d branchName 刪除指定分支

二、遠程管理

首先登陸github創(chuàng)建一個遠程倉庫牧抽,獲取到遠程倉庫的地址嘉熊。(https://git.oschina.net/yang_shuai/gitTest.git

(2). 克隆遠程倉庫

git clone https://git.oschina.net/yang_shuai/gitTest.git

(2). 查看本地遠程倉庫狀態(tài)

git remote -v

(3). 鏈接遠程倉庫

git remote add origin https://git.oschina.net/yang_shuai/gitTest.git

(4). 清除遠程倉庫

git remote rm origin

(5). 獲取遠程庫數(shù)據(jù)單不合并

git fetch origin

(6). 將本地分支推送到遠程分支并合并

git push origin master:master master為分支名,前面的master為本地分支名扬舒,后面的master為遠程分支名

(7). 獲取并合并遠程分支的兩種方法

第一種: 使用git fetch 獲取到當前最新的遠程分支记舆,然后使用git merge origin/master 進行合并。

第二種:直接使用 git pull origin master:master 獲取并直接合并到對應(yīng)分支呼巴。

針對兩種獲取合并方式泽腮,個人更推崇第一種,首先可以知道隊友都改了些什么衣赶,另外可以準確的進行一對多的合并诊赊。

三、沖突解決
目前有兩種解決沖突的方式府瞄。

第一種:修改當前文件碧磅,也就是說在你編輯的文件中直接修改然后git add . ,git commit -m “mergeok”遵馆,手動保留你想要的修改鲸郊。

第二種:自動解決沖突的工具

四、標簽操作

git tag v1.0.0 (后面可加版本號在固定節(jié)點打上tag)

git tag 查看所有標簽货邓。

git tag -d v1.0.0 刪除名稱為v1.0.0的本地標簽

git push origin :refs/tags/v1.0.0 刪除名稱為v1.0.0的遠程倉庫標簽

<h4 id='31'>vim</h4>

i → Insert 模式秆撮,按 ESC 回到 Normal 模式.
x → 刪當前光標所在的一個字符。
:wq → 存盤 + 退出 (:w 存盤, :q 退出)  
dd → 刪除當前行换况,并把刪除的行存到剪貼板里
p → 粘貼剪貼板
hjkl (強例推薦使用其移動光標职辨,但不必需) →你也可以使用光標鍵 (←↓↑→). 注: j 就像下箭頭。
:help <command> → 顯示相關(guān)命令的幫助戈二。
//各種插入模式
a → 在光標后插入
o → 在當前行后插入一個新行
O → 在當前行前插入一個新行
cw → 替換從光標所在位置后到一個單詞結(jié)尾的字符
//簡單的移動光標
0 → 數(shù)字零舒裤,到行頭
^ → 到本行第一個不是blank字符的位置(所謂blank字符就是空格,tab觉吭,換行腾供,回車等)
$ → 到本行行尾
g_ → 到本行最后一個不是blank字符的位置。
/pattern → 搜索 pattern 的字符串
拷貝/粘貼 (陳皓注:p/P都可以鲜滩,p是表示在當前位置之后伴鳖,P表示在當前位置之前)
P → 粘貼
yy → 拷貝當前行當行于 ddP
Undo/Redo
u → undo
<C-r> → redo
//打開/保存/退出/改變文件(Buffer)
:e <path/to/file> → 打開一個文件
:w → 存盤
:saveas <path/to/file> → 另存為 <path/to/file>
:x, ZZ 或 :wq → 保存并退出 (:x 表示僅在需要時保存绒北,ZZ不需要輸入冒號并回車)
:q! → 退出不保存 :qa! 強行退出所有的正在編輯的文件黎侈,就算別的文件有更改。
:bn 和 :bp → 你可以同時打開很多文件闷游,使用這兩個命令來切換下一個或上一個文件峻汉。

<h4 id='32'>CocoaPods</h4>

CocoaPods使用

<h4 id='33'>Reveal</h4>

Reveal使用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贴汪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子休吠,更是在濱河造成了極大的恐慌扳埂,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘤礁,死亡現(xiàn)場離奇詭異阳懂,居然都是意外死亡,警方通過查閱死者的電腦和手機柜思,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門岩调,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赡盘,你說我怎么就攤上這事号枕。” “怎么了陨享?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵葱淳,是天一觀的道長。 經(jīng)常有香客問我抛姑,道長赞厕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任定硝,我火速辦了婚禮皿桑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘喷斋。我一直安慰自己唁毒,他們只是感情好,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布星爪。 她就那樣靜靜地躺著,像睡著了一般粉私。 火紅的嫁衣襯著肌膚如雪顽腾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天诺核,我揣著相機與錄音抄肖,去河邊找鬼。 笑死窖杀,一個胖子當著我的面吹牛漓摩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播入客,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼管毙,長吁一口氣:“原來是場噩夢啊……” “哼腿椎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起夭咬,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤啃炸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后卓舵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體南用,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年掏湾,在試婚紗的時候發(fā)現(xiàn)自己被綠了裹虫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡融击,死狀恐怖筑公,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情砚嘴,我是刑警寧澤十酣,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站际长,受9級特大地震影響耸采,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜工育,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一虾宇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧如绸,春花似錦嘱朽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扼脐,卻和暖如春岸军,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓦侮。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工艰赞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肚吏。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓方妖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親罚攀。 傳聞我的和親對象是個殘疾皇子党觅,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,113評論 1 32
  • 簡介 TypeScript 是 JavaScript 的一個超集雌澄,主要提供了 類型系統(tǒng) 和對 ES6 的支持,由 ...
    _往后_閱讀 858評論 0 1
  • 正是四月的好時節(jié)仔役,北方的春天勢頭正盛掷伙,小院內(nèi)的圍墻上爬滿了花藤,一樹樹梨花開的十分燦爛又兵,微風拂過任柜,連空氣都變得十分...
    Ur_a7c3閱讀 273評論 0 0
  • 今天是10月4日,也是放假第四天沛厨,爸爸媽媽說今天是中秋節(jié)宙地,我們要吃月餅啦。我很喜歡吃月餅逆皮,你呢宅粥。今年媽媽買的月餅有...
    任曦說日記閱讀 131評論 0 1
  • 小時候讀書覺得甚是苦秽梅!一路被家里的長輩催逼著走過這么多年,為什么小的時候我們不愿讀書剿牺?不喜歡上學企垦?甚至很多人長大了...
    白草摘星辰閱讀 338評論 3 5