1.描述什么是MVC
【MVC簡介】
是一種架構(gòu)模式幔妨,它是蘋果非常熱衷的一種架構(gòu)模式
M:model模型保存所有應(yīng)用程序里要使用的數(shù)據(jù)侮穿,比如一款太空大戰(zhàn)游戲,模型要負責保存飛船的大小、飛行速度耕渴、位置信息、裝載了多少只槍等等這些信息邻吞。并且要處理數(shù)據(jù)之間的邏輯比如飛船要打中敵機多少次能把敵機擊落
模型只是負責記錄數(shù)據(jù)组题,跟數(shù)據(jù)的顯示是沒關(guān)系的,數(shù)據(jù)的顯示是控制器跟視圖的任務(wù)
C:controller控制器負責控制視圖如何去顯示模型里要顯示的數(shù)據(jù)它要負責把模型里的數(shù)據(jù)傳輸給視圖(控制器是通過視圖控制器的【生命周期】來控制視圖變化的)
V:view視圖視圖就是視圖控制器的小跟班抱冷,它的任務(wù)就是負責顯示視圖崔列,完全聽命于視圖控制器,視圖控制器讓視圖做什么視圖就做什么
2.列舉常用網(wǎng)絡(luò)協(xié)議的端口號旺遮,例如HTTP默認的是80
FTP文本傳輸協(xié)議20或21
TELNET遠程登錄協(xié)議23
POP3發(fā)郵件協(xié)議110
3赵讯、frame與bounds的區(qū)別?Bounds的大小改變frame改變嗎
答:frame指的是:該view在父view坐標系統(tǒng)中的位置和大小耿眉。(參照點是父親的坐標系統(tǒng))
bounds指的是:該view在本身坐標系統(tǒng)中的位置和大小边翼。(參照點是本身坐標系統(tǒng))
會發(fā)生改變
4、UIViewController的生命周期方法調(diào)用順序
答:-
(void)viewDidLoad跷敬;
- (void)viewDidUnload讯私;
- (void)viewWillAppear:(BOOL)animated;
- (void)viewDidAppear:(BOOL)animated西傀;
- (void)viewWillDisappear:(BOOL)animated斤寇;
- (void)viewDidDisappear:(BOOL)animated;
5拥褂、UITableView的執(zhí)行流程是怎么樣的
答:"numberOfSectionsInTableView:"返回TableView的section數(shù)目
"tableView:titleForHeaderInSection:"section1是否有表頭標題欄
"tableView:numberOfRowsInSection:"設(shè)置section1中行數(shù)
"tableView:heightForRowAtIndexPath:"設(shè)置section1中row1行的高度……row2行的高度……逐行設(shè)置娘锁,直至當前section1屬性設(shè)置完畢
"tableView:titleForHeaderInSection:"section2是否有表頭欄,之后同4-5饺鹃,設(shè)置section2的屬性.同理莫秆,設(shè)置完畢所有的section的相關(guān)屬性
"tableView:cellForRowAtIndexPath:"接下來設(shè)置的是每個section中每row添加的數(shù)據(jù)
這樣整個TableView就設(shè)置完畢了.
6、如何設(shè)計一個可變高度(根據(jù)內(nèi)容自適應(yīng)高度)的UITableViewCell
答:1)創(chuàng)建并添加一個UILabel作為單元格cell的子視圖悔详;
2)在UITableView的委托方法:
(CGFloat)tableView:(UITableView*)tableViewheightForRowAtIndexPath: (NSIndexPath
*) indexPath中計算高度
3)在UITableView的委托方法:
(UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:
(NSIndexPath *) indexPath中計算UILabel的框大小镊屎。
7、UIView的圓角屬性設(shè)置方法
答:利用setCornerRadius:
8.UIVIiewController在現(xiàn)實過程中茄螃,各個方法的調(diào)用順序
init->viewDidLoad->viewDidAppear->viewDidUnload
9.對于語句NSString *obj = [[NSData
alloc]init],obj在編譯時和運行時分別是什么類型的對象缝驳?
答:編譯時為NSString類型,運行時為NSData類型归苍。
10.object-c中創(chuàng)建線程的方法是什么用狱?如果在主線程中執(zhí)行代碼,方法是什么拼弃?如果想延時執(zhí)行代碼夏伊,方法又是什么?
答:a吻氧、線程創(chuàng)建有三種方法:使用NSThread創(chuàng)建(detachNewThreadSelector:toTarget:withObject:)溺忧、使用GCD的dispatch咏连、使用子類化的NSOperation,然后將其加入NSOperationQueue;
b、在主線程執(zhí)行代碼砸狞,方法是performSelectorOnMainThread捻勉,
c、如果想延時執(zhí)行代碼可以用performSelector:withObject:afterDelay:
11.描述一下iOS SDKSDK中如何實現(xiàn)MVC的開發(fā)模式刀森?
答:iOS開發(fā)中使用了很好的分層設(shè)計踱启,數(shù)據(jù)都可以放在自定義類型、NSArray及其子類型研底、NSDictionary及其子類型中埠偿,視圖的顯示都用UIView及其子類來實現(xiàn),控制器在UIViewController的子類中實現(xiàn)榜晦,在控制器的ViewDidLoad冠蒋、ViewWillAppear、ViewDidAppear乾胶、ViewDidDisappear抖剿、ViewWillDisappear等方法中實現(xiàn)數(shù)據(jù)和視圖的交互。
12识窿、MVC設(shè)計模式是如何體現(xiàn)在iOS
Appkai'fa開發(fā)中的斩郎?三者之間有哪些常見消息傳遞方式?
答:iOS開發(fā)中使用了很好的分層設(shè)計喻频,數(shù)據(jù)都可以放在自定義類型缩宜、NSArray及其子類型、NSDictionary及其子類型中甥温,視圖的顯示都用UIView及其子類來實現(xiàn)锻煌,控制器在UIViewController的子類中實現(xiàn),在控制器的ViewDidLoad姻蚓、ViewWillAppear宋梧、ViewDidAppear、ViewDidDisappear狰挡、ViewWillDisappear等方法中實現(xiàn)數(shù)據(jù)和視圖的交互捂龄。三者之間常見消息傳遞方式有:代理、通知中心圆兵、kvc/kvo等跺讯。
13.關(guān)于自定義Cell中枢贿,圖片下載用到的方法?
如果有添加了第三方庫SDWebImage/AFNetWorking殉农,可以使用UIImageView的類別方法setImageWithURL:直接異步加載,如果沒有的話可以使用NSURLConnection發(fā)起request請求局荚,或者使用ASI將下載請求添加到下載隊列中超凳,將圖片下載之后愈污,在回調(diào)方法里,回調(diào)主線程轮傍,設(shè)置圖片暂雹。
14.UITableViewCell怎樣使用更流暢?
首先cell的復用機制節(jié)約了系統(tǒng)資源创夜;其次應(yīng)當注意有些復雜的大數(shù)據(jù)或網(wǎng)絡(luò)數(shù)據(jù)應(yīng)采用異步加載的方式進行加載杭跪,以免cell刷出時發(fā)生卡頓。
15.在UIWebView上點擊回復驰吓,如何使用UITextField進行回復涧尿?
UIWebView有一個stringByEvaluatingJavaScriptFromString方法可以將javascript嵌入頁面中,通過這個方法我們可以在iOS中與UIWebView中的網(wǎng)頁元素交互檬贰。通過JAVAScript獲取點擊時間姑廉,彈出UITextField,輸入字符串后翁涤,可以通過post請求發(fā)送回復桥言。
16.關(guān)于圖文混排是如何排版的?
圖文混排應(yīng)當以圖片為起點葵礼,首先明確圖片的位置号阿,文字可以選擇位于圖片的下方,或者是環(huán)繞效果章咧。環(huán)繞效果可以采用2個以上label或textView來實現(xiàn)倦西;也可以通過AttributeString的屬性設(shè)置,或者CoreText重繪UIVIew赁严,添加文字的方式扰柠,修改文字間的間隔,達到讓出圖片的效果疼约。如果圖文顯示在高度可變的視圖中卤档,如tableView的Cell中,可以計算文字占位Rect程剥,動態(tài)修改視圖或cell的高度劝枣。
17.@property (nonatomic, retain)
IBOutlet UIView * view這個對象需要release嗎,如果需要织鲸,如何做?
其實XIB文件所生成的視圖對象是無法真正釋放的舔腾,因此關(guān)聯(lián)XIB的屬性也可以設(shè)置為assign屬性,而視圖不會釋放搂擦。從這個角度上講稳诚,這個對象不釋放也可以,但是既然用retain做修飾符瀑踢,出于尊重內(nèi)存管理法則扳还,理應(yīng)進行釋放才避,最簡單的方式就是將視圖在dealloc方法中設(shè)為nil,適用于非ARC氨距,但ARC中這樣寫也沒關(guān)系桑逝。
18.兩種傳輸協(xié)議在什么時候使用?
所謂的兩種傳輸協(xié)議俏让,是指網(wǎng)絡(luò)協(xié)議中的傳輸層協(xié)議楞遏,即TCP協(xié)議和UDP協(xié)議。TCP協(xié)議會在收發(fā)數(shù)據(jù)的兩端建立穩(wěn)定可靠首昔,有序的鏈接橱健,傳輸數(shù)據(jù)穩(wěn)定可靠,但系統(tǒng)資源消耗較大沙廉,適合拘荡,數(shù)據(jù)或文件的下載或上傳,Http網(wǎng)絡(luò)協(xié)議就是采用TCP傳輸協(xié)議傳輸數(shù)據(jù)的撬陵。UDP是通俗講得漂流瓶協(xié)議珊皿,發(fā)出協(xié)議的主機就像扔出漂流瓶的魯濱遜一樣,不再負責數(shù)據(jù)的跟蹤和校驗巨税,優(yōu)點是系統(tǒng)資源占用低蟋定,缺陷是沒有在收發(fā)兩端建立穩(wěn)定的傳輸路線,數(shù)據(jù)有丟包草添,損壞或后發(fā)先至等缺陷驶兜,優(yōu)秀的UDP傳輸服務(wù)器,會反復發(fā)送校驗序列远寸,以保證數(shù)據(jù)的正確抄淑。
19.push推送機制
iOS在系統(tǒng)級別有一個推送服務(wù)程序使用5223端口。使用這個端口的協(xié)議源于Jabber后來發(fā)展為XMPP驰后,被用于Gtalk等IM軟件中肆资。所以,iOS的推送灶芝,可以不嚴謹?shù)睦斫鉃椋?/p>
蘋果服務(wù)器朝手機后臺掛的一個IM服務(wù)程序發(fā)送的消息郑原。
然后,系統(tǒng)根據(jù)該IM消息識別告訴哪個Apps具體發(fā)生了什么事夜涕。
然后犯犁,系統(tǒng)分別通知這些Apps。
20.iOS播放音頻的幾種方法?
iPhone OS主要提供以下了幾種播放音頻的方法:
System Sound Services
AVAudioPlayer類
Audio Queue Services
OpenAL
21.代理的作用
代理的目的是改變或傳遞控制鏈女器。允許一個類在某些特定時刻通知到其他類酸役,而不需要獲取到那些類的指針∠埽可以減少框架復雜度簇捍。
另外一點,代理可以理解為java中的回調(diào)監(jiān)聽機制的一種類似俏拱。
22.intretVal=UIApplication(argc,argv,nil,nil):是什么意思
對UIApplication對象進行了初始化暑塑,這個方法除了argc和argv參數(shù)外,另外這個函數(shù)還有2個兩個字符串參數(shù)來識別UIApplication類和UIApplication代理類锅必,在這里默認是2個nil,第一個參數(shù)為nil就默認把UIApplication類作為缺省值進行初始化事格,可以在這里不填nil而是使用自己定義的UIApplication子類。至于第二個參數(shù)nil就設(shè)置為nil就把模板生成的HelloWorldAppdelegate類作為默認值搞隐。
23.保存一個變量到本地驹愚,列舉兩個簡單的方法
1,用NSUserDefaults存儲小量數(shù)據(jù)
2劣纲,直接writeTofF ile
3逢捺,存數(shù)據(jù)庫
4,歸檔
24.如果UIView *
view已經(jīng)實例化癞季,在view僅添加了n個UIButton類的實例劫瞳,這些button不是全局的,并且button已經(jīng)用tag區(qū)分開绷柒,如何快速找出指定的一個button改變他的屬性志于?
button=(UIButton*)[view viewWithTag:tag]
25.當A類 中的某個方法執(zhí)行到某處時,這時想在B類中執(zhí)行某個方法伸刃,如何做颤练?并做簡單說明
用代理執(zhí)行代理方法
說明:在b類中實現(xiàn)協(xié)議方法慈迈,設(shè)置a的代理為b,在指定方法內(nèi)調(diào)用代理的協(xié)議方法
26.oc中加號方法與減號方法的區(qū)別
加號方法是類方法奈应,用類名直接調(diào)用
減號方法為實例方法,需要創(chuàng)建一個實例對象調(diào)用
27.建一個工程用到的最基本的兩個框架是购披?
FoundationUIKit
28钥组,一個UITableview的實例,重新加載數(shù)據(jù)的方法是什么今瀑?
reloadData刷新整個表格和reloadSections:withRowAnimation刷新一組數(shù)據(jù)
29.XML有哪幾種解析方式程梦,他們各有什么優(yōu)點
答:有Sax和Dom兩種解析方式,sax是逐行解析橘荠。dom是一次性全部加載xml文件屿附,然后解析
29.iOS平臺怎么做數(shù)據(jù)持久化
有以下方式做
1、NSUserDefaults
2哥童、Plist
3挺份、數(shù)據(jù)庫
4、文件保存
5贮懈、歸檔與反歸檔
30.intretVal=UIApplication(argc,argv,nil,nil):是什么意思
對UIApplication對象進行了初始化匀泊,這個方法除了argc和argv參數(shù)外优训,另外這個函數(shù)還有2個兩個字符串參數(shù)來識別UIApplication類和UIApplication代理類,在這里默認是2個nil,第一個參數(shù)為nil就默認把UIApplication類作為缺省值進行初始化各聘,可以在這里不填nil而是使用自己定義的UIApplication子類揣非。至于第二個參數(shù)nil就設(shè)置為nil就把模板生成的HelloWorldAppdelegate類作為默認值。
31.iOS平臺怎么做數(shù)據(jù)的持久化?Core Data和SQLite有無必然聯(lián)系躲因?Core Data是一個關(guān)系型數(shù)據(jù)庫嗎早敬?
答:iOS中可以有四種持久化數(shù)據(jù)的方式: 屬性列表、對象歸檔大脉、SQLite3和Core Data
Core data與sqlite還是有聯(lián)系的搞监,core
data是對sqlite的封裝,因為sqlite是c語言的api镰矿,然而有人也需要obj-c的api琐驴,所以有了core data另外,core data不僅僅是把c的api翻譯成oc的api秤标,還提供了一些管理的功能棍矛,使用更加方便
Core
Data不是一個關(guān)系型數(shù)據(jù)庫,也不是關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)抛杨。雖然Core Dta支持SQLite作為一種存儲類型够委,但它不能使用任意的SQLite數(shù)據(jù)庫。Core Data在使用的過程種自己創(chuàng)建這個數(shù)據(jù)庫怖现。Core Data支持對一茁帽、對多的關(guān)系
32.runloop是什么?在主線程中的某個函數(shù)里調(diào)用了異步函數(shù)屈嗤,怎么樣block當前線程潘拨,且還能響應(yīng)timer事件,touch事件等饶号?
RunLoop
RunLoop從字面上看是運行循環(huán)的意思,這一點也不錯,它確實就 是一個循環(huán)的概念,或者準確的說是線程中的循環(huán)铁追。 本文一開始就 提到有些程序是一個圈,這個圈本質(zhì)上就是這里的所謂的RunLoop,就是一個循環(huán),只是這個循環(huán)里加入很多特性。 首先循環(huán)體的開始需要檢測是否有需要處理的事件,如果有則去處理,如果沒有則進入睡眠以節(jié)省CPU時間茫船。 所以重點便是這個需要處理的事件,在RunLoop中,需要處理的事件分兩類,一種是輸入 源,一種是定時器,定時器好理解就是那些需要定時執(zhí)行的操作,
輸入源分三類:performSelector源,基于端口(Mach port)的源,以及自定義的源琅束。編程的時候可以添加自己的源。RunLoop還有一 個觀察者Observer的概念,可以往RunLoop中加入自己的觀察者以 便監(jiān)控著RunLoop的運行過程,CFRunLoop.h中定義了所有觀察者的
類型:1enumCFRunLoopActivity { kCFRunLoopEntry = (1 << 0), kCF
RunLoopBeforeTimers = (1 << 1),kCFRunLoopBeforeSour
ces = (
如果你使用過select系統(tǒng)調(diào)用寫過程序你便可以快速的理解runloop事
件源的概念,本質(zhì)上講事件源的機制和select一樣是一種多路復用IO的實現(xiàn),在一個線程中我們需要做的事情并不單一,如需要處理定時鐘事件,需要處理用戶的觸控事件,需要接受網(wǎng)絡(luò)遠端發(fā)過來的 數(shù)據(jù),將這些需要做的事情統(tǒng)統(tǒng)注 冊到事件源中,每一次循環(huán)的開 始便去檢查這些事件源是否有需要處理的數(shù)據(jù),有的話則去處理算谈。 拿具體的應(yīng)用舉個例子,NSURLConnection網(wǎng)絡(luò)數(shù)據(jù)請求,默認是 異步的方式,其實現(xiàn)原理就是創(chuàng)建之后將其作為事件源加入到當前的RunLoop,而等待網(wǎng)絡(luò)響應(yīng)以及網(wǎng)絡(luò)數(shù)據(jù)接受的過程則在一個新創(chuàng)建的獨立的線程中完成,當這個線程處理到某個階段的時候比如 得到對方的響應(yīng)或者接受完 了網(wǎng)絡(luò)數(shù)據(jù)之后便通知之前的線程去執(zhí)行其相關(guān)的delegate方法涩禀。所以在Cocoa中經(jīng)橙谎郏看到scheduleInRunLoop:forMode:這樣的方法,這個便是將其加入到事件 源中,當檢測到某個事件發(fā)生的時候,相關(guān)的delegate方法便被調(diào)用艾船。對于CoreFoundation這一層而 言,通常的模式是創(chuàng)建輸入源,然后 將輸入源通過CFRunLoopAddSource函數(shù)加入到RunLoop中,相關(guān)事件發(fā)生后,相關(guān)的回調(diào)函數(shù)會被調(diào)用。如CFSocket的使用。 另外RunLoop中還有一個運行模式的概念,每一個運行循環(huán)必然運行在 某個模式下,而模式的存在是為了過濾事件源和觀察者的,只有那 些和當前RunLoop運行模式一致的事件源和觀察者才會被激活屿岂。 每一個線程都有其對應(yīng)的RunLoop,但是默認非主線程的RunLoop是沒有運行的,需要為RunLoop添加至少一個事件源,然后去run它践宴。一般情況下我們是沒有必要去啟用線程的RunLoop的,除非你 在一個單獨的線程中需要長久的檢測某個事件。
33.使用UITableView必須要實現(xiàn)的兩個方法?
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section,-
(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
34.簡述以下在iOS中使用SQLIte
_fmdb= [[FMDatabasealloc]initWithPath:path];
[_fmdbopen];
[_fmdbexecuteUpdate:@"create
table Article(ArticleId integer primary key autoincrement,ArticleTitle
text,ArticleContent text)"];
[_fmdbclose];
35.設(shè)計一個新聞瀏覽需要用到哪些技術(shù)
網(wǎng)絡(luò)下載爷怀,數(shù)據(jù)解析阻肩,表單控件等
36.談?wù)勀銓Χ嗑€程的理解
iOS多線程分為三種NSThread,NSOperation霉撵,GCD,NSThread以線程為導向洪囤,NSOperation以任務(wù)為導向徒坡,GCD是Block模式的NSOperation
36.ViewController的loadView,viewDidLoad瘤缩,viewDidUnload分別是在什么時候調(diào)用的喇完?在自定義ViewController的時候這幾個函數(shù)里面應(yīng)該做做什么工作?
loadView:
每次訪問UIViewController的view(比如controller.view剥啤、self.view)而且view為nil锦溪,loadView方法就會被調(diào)用。
自定義UIViewController的view用的
viewDidLoad:
無論你是通過xib文件還是重寫loadView方法創(chuàng)建UIViewController的view府怯,在view創(chuàng)建完畢后刻诊,最終都會調(diào)用viewDidLoad方法
一般我們會在這里做界面上的初始化操作,比如往view中添加一些子視圖牺丙、從數(shù)據(jù)庫或者網(wǎng)絡(luò)加載模型數(shù)據(jù)裝配到子視圖中则涯。
viewDidUnload:
發(fā)出內(nèi)存警告且view被釋放的時候就會調(diào)用viewDidUnload方法
一般在此釋放資源,主要是釋放界面元素相關(guān)的資源冲簿,將相關(guān)的實例都賦值為nil
37.你用過NSOperationQueue么粟判?如果用過或者了解的話,你為什么要使用NSOperationQueue峦剔,實現(xiàn)了什么档礁?請描述它和GCD的區(qū)別和類似的地方(提示:可以從兩者的實現(xiàn)機制和適用范圍來描述)。
使用NSOperationQueue用來管理子類化的NSOperation對象吝沫,控制其線程并發(fā)數(shù)目呻澜。GCD和NSOperation都可以實現(xiàn)對線程的管理,區(qū)別是NSOperation和NSOperationQueue是多線程的面向?qū)ο蟪橄蟛蚁铡m椖恐惺褂肗SOperation的優(yōu)點是NSOperation是對線程的高度抽象易迹,在項目中使用它,會使項目的程序結(jié)構(gòu)更好平道,子類化NSOperation的設(shè)計思路睹欲,是具有面向?qū)ο蟮膬?yōu)點(復用、封裝),使得實現(xiàn)是多線程支持窘疮,而接口簡單袋哼,建議在復雜項目中使用。
項目中使用GCD的優(yōu)點是GCD本身非常簡單闸衫、易用涛贯,對于不復雜的多線程操作,會節(jié)省代碼量蔚出,而Block參數(shù)的使用弟翘,會是代碼更為易讀,建議在簡單項目中使用骄酗。
38.談?wù)剬wift的看法
Swift作為Apple欽定的objc的繼承者稀余,作為iOS/Mac開發(fā)者的話,是覺得必須和值得學習和使用的∏鞣現(xiàn)在Swift可以和原來的objc或者c系的代碼混用睛琳。因為在很多語法特性上Swift確實和一些腳本非常相似。但是首先需要明確的是踏烙,至少在Apple開發(fā)中师骗,Swift不是以一種腳本語言來運行的,所有的Swift代碼都將被LLVM編譯為native code讨惩,以極高的效率運行辟癌。按照官方今天給出的benchmark數(shù)據(jù),運行時比Python快3.9倍荐捻,比objc快1.4倍左右愿待。我相信官方數(shù)據(jù)肯定是有些水分,但是即使這樣靴患,Swift也給人帶來很多遐想和期待仍侥。Swift和原來的objc一樣,是類型安全的語言鸳君,變量和方法都有明確的返回农渊,并且變量在使用前需要進行初始化。而在語法方面或颊,Swift遷移到了業(yè)界公認的非常先進的語法體系砸紊,其中包含了閉包,多返回囱挑,泛型和大量的函數(shù)式編程的理念醉顽,函數(shù)也終于成為一等公民可以作為變量保存了(雖然具體實現(xiàn)和用法上來看和js那種傳統(tǒng)意義的好像不太一樣)。初步看下來語法上借鑒了很多Ruby的人性化的設(shè)計平挑,但是借助于Apple自己手中強大的LLVM游添,性能上必須要甩開Ruby不止一兩個量級系草。
另一方面,Swift的代碼又是可以Interactive來“解釋”執(zhí)行的唆涝。新的Xcode中加入了所謂的Playground來對開發(fā)者輸入的Swift代碼進行交互式的相應(yīng)找都,開發(fā)者也可是使用swift的命令行工具來交互式地執(zhí)行swift語句。細心的朋友可能注意到了廊酣,我在這里把“解釋”兩個字打上了雙引號能耻。這是因為即使在命令行中,Swift其實也不是被解釋執(zhí)行的亡驰,而是在每個指令后進對從開始以來的swift代碼行了一遍編譯晓猛,然后執(zhí)行的。這樣的做法下依然可以讓人“感到”是在做交互解釋執(zhí)行凡辱,這門語言的編譯速度和優(yōu)化水平戒职,可見一斑。同時Playground還順便記錄了每條語句的執(zhí)行時候的各種情況煞茫,叫做一組timeline帕涌∩惴玻可以使用timeline對代碼的執(zhí)行逐步檢查续徽,省去了斷點debug的時間,也非常方便亲澡。
39.簡述一下IOS中線程同步機制
1:原子操作不同線程如果通過原子操作函數(shù)對同一變量進行操作钦扭,可以保證一個線程的操作不會影響到其他線程內(nèi)對此變量的操作,因為這些操作都是原子式的床绪。因為原子操作只能對內(nèi)置類型進行操作客情,所以原子操作能夠同步的線程只能位于同一個進程的地址空間內(nèi)。2:鎖iOS平臺下的鎖對象為NSLock對象癞己,進入鎖通過調(diào)用lock函數(shù)膀斋,解鎖調(diào)用unlock函數(shù)(因為iOS中大部分的線程同步類都繼承自NSLocking協(xié)議,所以其加鎖/解鎖的操作基本都為lock/unlock函數(shù))痹雅,同一個NSLock對象成功調(diào)用lock函數(shù)后仰担,在其顯式unlock之前任何線程都不能再對此NSLock對象加鎖,以達到互斥訪問的目的绩社。3:事件NSConditon類型提供了wait與signal函數(shù)摔蓝,分別代表了等待事件的操作以及觸發(fā)事件的操作。除了wait函數(shù)愉耙,NSCondition還提供了waitUntilDate函數(shù)贮尉,其功能與NSLock中的lockBeforeDate大致相同,簡要來說就是提供了一個帶超時的wait函數(shù)朴沿。
40.啟動一個線程猜谚,在子線程中如何刷新界面败砂。
可以跳轉(zhuǎn)到主線程中進行界面的刷新,如[selfperformSelectorOnMainThread:@selector(updateUI) withObject:nilwaitUntilDone:YES];
41.簡述開發(fā)中使用過的設(shè)計模式龄毡。
(一)代理模式
應(yīng)用場景:當一個類的某些功能需要由別的類來實現(xiàn)吠卷,但是又不確定具體會是哪個類實現(xiàn)。
優(yōu)勢:解耦合
敏捷原則:開放-封閉原則
實例:tableview的數(shù)據(jù)源delegate沦零,通過和protocol的配合祭隔,完成委托訴求。
列表row個數(shù)delegate
自定義的delegate
(二)觀察者模式
應(yīng)用場景:一般為model層對路操,controller和view進行的通知方式疾渴,不關(guān)心誰去接收,只負責發(fā)布信息屯仗。
優(yōu)勢:解耦合
敏捷原則:接口隔離原則搞坝,開放-封閉原則
實例:Notification通知中心,注冊通知中心魁袜,任何位置可以發(fā)送消息桩撮,注冊觀察者的對象可以接收。
kvo峰弹,鍵值對改變通知的觀察者店量,平時基本沒用過。
(三)MVC模式
應(yīng)用場景:是一中非常古老的設(shè)計模式鞠呈,通過數(shù)據(jù)模型融师,控制器邏輯,視圖展示將應(yīng)用程序進行邏輯劃分蚁吝。
優(yōu)勢:使系統(tǒng)旱爆,層次清晰,職責分明窘茁,易于維護
敏捷原則:對擴展開放-對修改封閉
實例:model-即數(shù)據(jù)模型怀伦,view-視圖展示,controller進行UI展現(xiàn)和數(shù)據(jù)交互的邏輯控制山林。
(四)單例模式
應(yīng)用場景:確保程序運行期某個類房待,只有一份實例,用于進行資源共享控制捌朴。
優(yōu)勢:使用簡單吴攒,延時求值,易于跨模塊
敏捷原則:單一職責原則
實例:[UIApplication sharedApplication]砂蔽。
注意事項:確保使用者只能通過getInstance方法才能獲得洼怔,單例類的唯一實例。
java左驾,C++中使其沒有公有構(gòu)造函數(shù)镣隶,私有化并覆蓋其構(gòu)造函數(shù)极谊。
object c中,重寫allocWithZone方法安岂,保證即使用戶用alloc方法直接創(chuàng)建單例類的實例轻猖,
返回的也只是此單例類的唯一靜態(tài)變量。
(五)策略模式
應(yīng)用場景:定義算法族域那,封裝起來咙边,使他們之間可以相互替換。
優(yōu)勢:使算法的變化獨立于使用算法的用戶
敏捷原則:接口隔離原則次员;多用組合败许,少用繼承;針對接口編程淑蔚,而非實現(xiàn)市殷。
實例:排序算法,NSArray的sortedArrayUsingSelector刹衫;經(jīng)典的鴨子會叫醋寝,會飛案例。
注意事項:1带迟,剝離類中易于變化的行為音羞,通過組合的方式嵌入抽象基類
2,變化的行為抽象基類為邮旷,所有可變變化的父類
3黄选,用戶類的最終實例蝇摸,通過注入行為實例的方式婶肩,設(shè)定易變行為
防止了繼承行為方式,導致無關(guān)行為污染子類貌夕。完成了策略封裝和可替換性律歼。
(六)工廠模式
應(yīng)用場景:工廠方式創(chuàng)建類的實例,多與proxy模式配合啡专,創(chuàng)建可替換代理類险毁。
優(yōu)勢:易于替換,面向抽象編程们童,application只與抽象工廠和易變類的共性抽象類發(fā)生調(diào)用關(guān)系畔况。
敏捷原則:DIP依賴倒置原則
實例:項目部署環(huán)境中依賴多個不同類型的數(shù)據(jù)庫時,需要使用工廠配合proxy完成易用性替換
注意事項:項目初期慧库,軟件結(jié)構(gòu)和需求都沒有穩(wěn)定下來時跷跪,不建議使用此模式,因為其劣勢也很明顯齐板,
增加了代碼的復雜度吵瞻,增加了調(diào)用層次葛菇,增加了內(nèi)存負擔。所以要注意防止模式的濫用橡羞。
42.UIViewController中的viewDidLoad,viewWillAppear,viewDidUnload,dealloc分別是在什么時候調(diào)用眯停?
viewDidLoad:方法
在視圖加載后被調(diào)用:
如果是在代碼中創(chuàng)建的視圖加載器,他將會在loadView方法后被調(diào)用卿泽;
如果是從nib視圖頁面輸出莺债,他將會在視圖設(shè)置好后后被調(diào)用。
重載重寫該方法以進一步定制view
在iPhone OS 3.0及之后的版本中签夭,還應(yīng)該重載重寫viewDidUnload來釋放對view的任何索引
viewDidLoad后調(diào)用數(shù)據(jù)Model
viewWillAppear:方法
Called when the view is about to made visible. Defaultdoes nothing
視圖即將可見時調(diào)用九府。默認情況下不執(zhí)行任何操作viewDidUnload:方法
當系統(tǒng)內(nèi)存吃緊的時候會調(diào)用該方法(注:viewController沒有被dealloc)
內(nèi)存吃緊時,在iPhone OS 3.0之前didReceiveMemoryWarning是釋放無用內(nèi)存的唯一方式覆致,但是OS
3.0及以后viewDidUnload方法是更好的方式
在該方法中將所有IBOutlet(無論是property還是實例變量)置為nil(系統(tǒng)release
view時已經(jīng)將其release掉了)
在該方法中釋放其他與view有關(guān)的對象侄旬、其他在運行時創(chuàng)建(但非系統(tǒng)必須)的對象、在viewDidLoad中被創(chuàng)建的對象煌妈、緩存數(shù)據(jù)等release對象后儡羔,將對象置為nil(IBOutlet只需要將其置為nil,系統(tǒng)release
view時已經(jīng)將其release掉了)
一般認為viewDidUnload是viewDidLoad的鏡像璧诵,因為當view被重新請求時汰蜘,viewDidLoad還會重新被執(zhí)行
viewDidUnload中被release的對象必須是很容易被重新創(chuàng)建的對象(比如在viewDidLoad或其他方法中創(chuàng)建的對象),不要release用戶數(shù)據(jù)或其他很難被重新創(chuàng)建的對象
dealloc:方法
viewDidUnload和dealloc方法沒有關(guān)聯(lián)之宿,dealloc還是繼續(xù)做它該做的事情
43.navigationbar的背景顏色設(shè)置
UINavigationController* nav =[[UINavigationController alloc] init];
self.nav.navigationBar.tintColor =[UIColor blackColor];
44.tableviewcell的那幾個函數(shù)
// Designated initializer.If the cell can be reused, you must pass in areuse identifier.You should use thesame reuse identifier for all cells of the same form.
-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString*)reuseIdentifier
- (void)prepareForReuse;// if the cell is reusable (has a reuse identifier), this is called justbefore the cell is returned from the table view methoddequeueReusableCellWithIdentifier:.Ifyou override, you MUST call super.
- (void)setSelected:(BOOL)selectedanimated:(BOOL)animated;// animate between regular and selected state
-(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated;// animate between regular andhighlighted state
- (void)setEditing:(BOOL)editinganimated:(BOOL)animated;
45.還有動畫
在iOS中動畫實現(xiàn)技術(shù)主要是:Core Animation族操。
Core Animation負責所有的滾動、旋轉(zhuǎn)比被、縮小和放大以及所有的iOS動畫效果色难。其中UIKit類通常都有animated:參數(shù)部分,它可以允許是否使用動畫等缀。
Core Animation主要是使用
我們知道每個UIView都關(guān)聯(lián)到一個CALayer對象枷莉,CALayer是Core Animation中的圖層。
Core Animation主要就是通過修改圖層來改變UI的大小尺迂,位置笤妙,從而實現(xiàn)動畫效果。
可以說噪裕,任何一個應(yīng)用程序都離不開動畫蹲盘!
就連蘋果各個UI控件中的切換操作,都有它內(nèi)在的動畫膳音。
了解一下召衔,關(guān)于動畫的一些知識。
任何知識點严蓖,都會遷出一系列的知識點薄嫡。
[UIViewbeginAnimations:@"dropDownloadLabel"context:UIGraphicsGetCurrentContext()];
[UIView setAnimationDuration: 0.5];
[UIViewsetAnimationBeginsFromCurrentState: NO];
//執(zhí)行的動畫code
[UIView commitAnimations];
就將這段段代碼作為知識的切入點氧急,開始了解吧。
[UIViewbeginAnimations:@"dropDownloadLabel"context:UIGraphicsGetCurrentContext()];
[UIView commitAnimations];
這兩句代碼毫深,標記了一個動畫的開始和結(jié)束吩坝。在中間我們可以寫我們的一些動畫操作!
beginAnimations方法
+ (void)beginAnimations:(NSString*)animationID context:(void *)context
用來哑蔫,表示動畫的開始钉寝。
animationID:作為動畫的標識
context:自定義的一些動畫數(shù)據(jù),這些數(shù)據(jù)將發(fā)送給動畫的代理方法:setAnimationWillStartSelector:方法和setAnimationDidStopSelector:方法闸迷。
這個嵌纲,參數(shù),通常為nil腥沽。我們可以直接設(shè)置為nil逮走。
這里,我們使用UIGraphicsGetCurrentContext()今阳;因為此方法默認也會返回nil师溅。
該方法告訴系統(tǒng),我們將開始動畫盾舌。并且墓臭,在該方法后,我們可以通過setAnimationXXX(一系列方法)來設(shè)置我們進行的動畫的一些參數(shù)妖谴。
完成動畫后窿锉,調(diào)用commitAnimations方法來通知系統(tǒng),動畫結(jié)束膝舅。
至此嗡载,我們知道,就是設(shè)置動畫的一些列參數(shù)的方法即setAnimationXXX方法铸史。
[UIView setAnimationDuration: 0.5];
[UIViewsetAnimationBeginsFromCurrentState: NO];
動畫是可以嵌套的鼻疮。
[UIViewbeginAnimations:@"animation_1"context:UIGraphicsGetCurrentContext()];
// code1
[UIViewbeginAnimations:@"animation_2"context:UIGraphicsGetCurrentContext()];
// code2
[UIView commitAnimations];
[UIView commitAnimations];
如果我們?yōu)閯赢嬙O(shè)置了怯伊,setAnimationWillStartSelector:方法和setAnimationDidStopSelector:方法琳轿。
那么當動畫開始或者停止的時候,動畫的animationID參數(shù)和context參數(shù)耿芹,會傳遞給setAnimationWillStartSelector:方法和setAnimationDidStopSelector:方法崭篡。
悲劇總是要發(fā)生的!
蘋果API在最后的描述中吧秕,給了這么一句話:
Use of this method is discouraged iniOS 4.0 and later. You should use the block-based animation methods to specifyyour animations instead.
可見琉闪,在iOS 4.0后,block語法砸彬,大大增多了颠毙。這種方式斯入,是不建議的,需要我們使用block的方式蛀蜜。
于是刻两,動畫的block方式:
[UIView animateWithDuration:0.3fdelay:0.0f options:UIViewAnimationOptionCurveLinear
animations:^{ //執(zhí)行的動畫code}
completion:^(BOOLfinished){
//完成后執(zhí)行code
}];
在盡量用block來完成動畫,因為說不定啥時候滴某,老的動畫方式磅摹,將被廢除。
到此霎奢,可以告一段落户誓。但是,我想將這簡單的動畫代碼幕侠,一查到底帝美!
commitAnimations方法:
+ (void)commitAnimations
標記動畫結(jié)束。與beginAnimations方法成對使用晤硕。
例如:
[UIView commitAnimations];
一系列的setAnimationXXX方法:
setAnimationDuration方法:
+(void)setAnimationDuration:(NSTimeInterval)duration
設(shè)置動畫持續(xù)時間(秒)
例如:
[UIView setAnimationDuration: 0.5];
setAnimationBeginsFromCurrentState方法
+(void)setAnimationBeginsFromCurrentState:(BOOL)fromCurrentState
設(shè)置動畫開始時的狀態(tài)证舟。
我們構(gòu)想一個場景:一般,我們按下一個按鈕窗骑,將會執(zhí)行動畫一次女责。
當YES時:當上一次動畫正在執(zhí)行中,那么當下一個動畫開始時创译,上一次動畫的當前狀態(tài)將成為下一次動畫的開始狀態(tài)抵知。
當NO時:當上一個動畫正在執(zhí)行中,那么當下一個動畫開始時软族,上一次動畫需要先恢復到完成時的狀態(tài)刷喜,然后在開始執(zhí)行下一次動畫。
setAnimationStartDate方法
+ (void)setAnimationStartDate:(NSDate*)startTime
設(shè)置動畫開始時間立砸。
setAnimationDelay方法
+(void)setAnimationDelay:(NSTimeInterval)delay
設(shè)置畫開始的延遲時間(秒)掖疮。
setAnimationCurve方法
+ (void)setAnimationCurve:(UIViewAnimationCurve)curve
設(shè)置動畫的曲線方式(就是動畫的總體變化的時間曲線:開始快最后慢,開始慢最后快颗祝,最后慢浊闪,均勻線性)。
curve參數(shù)如下:
typedef NS_ENUM(NSInteger,UIViewAnimationCurve) {
UIViewAnimationCurveEaseInOut,// slow at beginning and end
UIViewAnimationCurveEaseIn,// slow at beginning
UIViewAnimationCurveEaseOut,// slow at end
UIViewAnimationCurveLinear
};
setAnimationRepeatCount方法
+(void)setAnimationRepeatCount:(float)repeatCount
設(shè)置動畫重復次數(shù)
setAnimationRepeatAutoreverses方法
+(void)setAnimationRepeatAutoreverses:(BOOL)repeatAutoreverses
設(shè)置動畫是否做一次反向的執(zhí)行螺戳。
如果設(shè)置為YES:動畫將執(zhí)行:動畫初始狀態(tài)》動畫》動畫完成狀態(tài)》動畫》動畫初始狀態(tài)搁宾。
如果設(shè)置為NO:默認值
setAnimationsEnabled方法
+(void)setAnimationsEnabled:(BOOL)enabled
設(shè)置動畫是否可用!
YES:默認值倔幼。
NO:動畫效果被禁用
注意:僅僅是動畫是否可用盖腿,在動畫中被改變的UI對象依然是起作用的。僅僅是動畫效果被禁用了。
areAnimationsEnabled方法
+ (BOOL)areAnimationsEnabled
返回動畫效果是否被禁用翩腐。
46.還有一個按著導航欄顏色變亮的
_myNav.navigationBar.translucent =YES;
_myNav.navigationBar.barStyle =UIBarStyleBlack;
47.還有個版本的問題
一鸟款、配置SVN服務(wù)器
1、創(chuàng)建Svn服務(wù)工作路徑同時新建我們的App工程茂卦,入下圖所示欠雌,SVN_Project是SVN服務(wù)的工作路徑,MyProject是我們的iOS工程
2疙筹,在Mac下有自帶的svn服務(wù)功能(Windows下是沒有的)富俄,直接在終端打開svn的服務(wù)即可,在打開服務(wù)的同時指定svn的工作路徑
(1)啟動svn服務(wù)命令:svnserve -d -r工作路徑:
(2)終端截圖如下:
3而咆、svn服務(wù)啟動后霍比,要創(chuàng)建svn管理文件,管理文件有關(guān)于svn的各種配置
(1)在工作目錄中創(chuàng)建管理文件命令:svnadmin create MySVNProject
(2)管理文件創(chuàng)建成功后暴备,其目錄結(jié)構(gòu)如下:
(3)接下來要配置我們的svn,打開conf文件夾如下:
(4)配置svnserve.conf文件悠瞬,把帶一個#的臨時注釋去掉即可:
(5)在passwd中添加用戶名和密碼
(6)authz中是用戶組的管理
二.把工程導入SVN
1.想把我們的工程導入svn的話,需要用到一個工具svnx涯捻,svnx連接svn服務(wù)器浅妆,后面跟的文件是SVN的管理文件,用戶名和密碼就是在配置文件中添加的用戶名和密碼
2.登陸成功以后,導入我們的iOS工程障癌。
三凌外、在Xcode中check out工程(下面用的時Xcode6.1的測試版本)
1.在Welcome Xcode中選中Check out an existing
Project,入下圖所示:
2.連接svn服務(wù)器(ip后面的仍然是svn管理文件):
3、check out工程
4.在本地打開工程涛浙,在Source Control中進行項目的管理
有自己的產(chǎn)品也有外包
編程:
1康辑、給定字符串的長度,還有換行方式算出高度轿亮。
UIFont *font = [UIFont systemFontOfSize:14];
CGSize size = [text sizeWithFont:fontconstrainedToSize:CGSizeMake(140, 1000)lineBreakMode:UILineBreakModeCharacterWrap];
2.寫一個發(fā)送同步http請求疮薇,并獲得返回結(jié)果的方法。
NSMutableURLRequest *request = [[NSMutableURLRequestalloc] init];
[requestsetURL:[NSURL URLWithString:urlStr]];
[requestsetHTTPMethod:@"GET"];
NSData*returnData = [NSURLConnection sendSynchronousRequest:request
returningResponse:nil error:nil];
[requestrelease];