1.線(xiàn)程和進(jìn)程的區(qū)別宝剖。
????????進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位洁闰,線(xiàn)程是進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位万细,是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位扑眉。線(xiàn)程基本不擁有系統(tǒng)資源,擁有自己的椑党空間腰素,它與同屬一個(gè)進(jìn)程的其他線(xiàn)程共享進(jìn)程所擁有的全部資源。一個(gè)線(xiàn)程可以創(chuàng)建和撤銷(xiāo)另一個(gè)線(xiàn)程雪营。同一個(gè)進(jìn)程中的多個(gè)線(xiàn)程之間可以并發(fā)執(zhí)行耸弄。
????????進(jìn)程和線(xiàn)程的主要差別在于他們是不同的操作系統(tǒng)資源管理方式。進(jìn)程有獨(dú)立的地址空間卓缰,一個(gè)進(jìn)程崩潰后计呈,在保護(hù)模式下不會(huì)對(duì)其他進(jìn)程產(chǎn)生影響,線(xiàn)程知識(shí)一個(gè)進(jìn)程中的不同執(zhí)行路徑,有自己的堆棧和局部變量,但線(xiàn)程之間沒(méi)有單獨(dú)的地址空間迈套,一個(gè)線(xiàn)程死掉就等于整個(gè)進(jìn)程死掉踩身,所以多進(jìn)程的程序要比多線(xiàn)程的程序健壯,但在進(jìn)程切換時(shí)怀挠,耗費(fèi)資源較大,效率要差一些。
一個(gè)程序至少有一個(gè)進(jìn)程善镰,一個(gè)進(jìn)程至少有一個(gè)線(xiàn)程。
線(xiàn)程的劃分尺度小于進(jìn)程年枕,使得多線(xiàn)程程序的并發(fā)性高炫欺,多個(gè)線(xiàn)程共享內(nèi)存,極大提到了程序的運(yùn)行效率熏兄。
線(xiàn)程不能獨(dú)立執(zhí)行品洛,必須已存在應(yīng)用程序中,由應(yīng)用程序提供多個(gè)線(xiàn)程執(zhí)行控制摩桶。
進(jìn)程是資源分配的基本單位桥状,線(xiàn)程是調(diào)度的基本單位,因?yàn)榫€(xiàn)程小硝清,調(diào)度開(kāi)銷(xiāo)就小辅斟,所以效率高。
多線(xiàn)程的意義在于一個(gè)應(yīng)用程序中芦拿,有多個(gè)執(zhí)行部分可以同時(shí)之星士飒。但操作系統(tǒng)并沒(méi)有將多個(gè)線(xiàn)程看做多個(gè)獨(dú)立的應(yīng)用
線(xiàn)程執(zhí)行開(kāi)銷(xiāo)小查邢,但不利于資源的管理和保護(hù)
2.定義一個(gè)NSString類(lèi)型屬性時(shí),為什么用copy不用strong?
這個(gè)NSString類(lèi)型屬性是一個(gè)指針变汪,定義成copy侠坎,操作是拷貝一份等同的對(duì)象,這個(gè)指針指向新生成的拷貝對(duì)象裙盾。當(dāng)使用copy時(shí)实胸,這個(gè)拷貝的對(duì)象無(wú)論是拷貝自NSString還是NSMutableString結(jié)果都是不可變的NSString。而如果用Strong番官,則指向一個(gè)字符串對(duì)象庐完,若指向的是一個(gè)NSMutableString,則當(dāng)指向的對(duì)象改變時(shí)徘熔,屬性值也會(huì)發(fā)生相應(yīng)改變门躯,導(dǎo)致錯(cuò)誤,因?yàn)槭且粋€(gè)不可變字符串
3.應(yīng)用多線(xiàn)程的時(shí)候會(huì)出現(xiàn)什么問(wèn)題酷师,應(yīng)如何避免問(wèn)題的發(fā)生?
多線(xiàn)程容易導(dǎo)致資源爭(zhēng)搶?zhuān)l(fā)生死鎖現(xiàn)象.死鎖通常是一個(gè)線(xiàn)程鎖定了一個(gè)資源A讶凉,而又想去鎖定資源B;在另一個(gè)線(xiàn)程中山孔,鎖定了資源B懂讯,而又想去鎖定資源A以完成自身的操作,兩個(gè)線(xiàn)程都想得到對(duì)方的資源台颠,而不愿釋放自己的資源褐望,造成兩個(gè)線(xiàn)程都在相互等待,造成了無(wú)法執(zhí)行的情況串前。?
避免死鎖的一個(gè)通用的經(jīng)驗(yàn)法則是:當(dāng)幾個(gè)線(xiàn)程都要訪(fǎng)問(wèn)共享資源A瘫里、B、C時(shí)荡碾,保證使每個(gè)線(xiàn)程都按照同樣的順序去訪(fǎng)問(wèn)它們谨读,比如都先訪(fǎng)問(wèn)A,在訪(fǎng)問(wèn)B和C
采用GCD中的柵欄方法玩荠,用并行隊(duì)列去裝載事件并異步去執(zhí)行漆腌。
4.應(yīng)用循環(huán)是怎么產(chǎn)生的,如何解決引用循環(huán)阶冈。
兩個(gè)類(lèi)中有屬性分別為彼此的實(shí)例,這樣就會(huì)引發(fā)循環(huán)應(yīng)用塑径。?
使用block女坑、NSTimer時(shí)也很容易導(dǎo)致循環(huán)應(yīng)用.設(shè)置一個(gè)應(yīng)用為弱引用既可以解決強(qiáng)應(yīng)用循環(huán)。
5.NSTimer使用中的注意事項(xiàng)
在類(lèi)中定義定時(shí)器并把目標(biāo)對(duì)象設(shè)置為self時(shí)统舀,所以NSTimer實(shí)例會(huì)保存此實(shí)例匆骗,但定時(shí)器是用在類(lèi)中用實(shí)例變量存放的劳景,所以此實(shí)例也保留了定時(shí)器,這就造就了循環(huán)應(yīng)用碉就。除非調(diào)用invalidate方法并把定時(shí)器設(shè)置為nil盟广,或者系統(tǒng)回收實(shí)例,才能打破循環(huán)應(yīng)用瓮钥,如果無(wú)法確保stop一定被調(diào)用筋量,就極易造成內(nèi)存泄露。
使用block可以防止NSTimer導(dǎo)致的內(nèi)存泄露.
在NSTimer分類(lèi)中定義方法碉熄,讓NSTimer的target為NSTimer實(shí)例本身桨武,然后block從類(lèi)實(shí)例中copy一份,在NSTimer中定義方法去執(zhí)行拷貝的block锈津。在uerInfo中去放block的拷貝呀酸。
6.App都有哪些運(yùn)行狀態(tài)?
狀態(tài):未運(yùn)行琼梆,未激活性誉,激活,后臺(tái)茎杂,掛起错览。
未運(yùn)行:程序未啟動(dòng)?
未激活:程序在前臺(tái)運(yùn)行,不過(guò)沒(méi)有接受到事件蛉顽。?
激活:程序在前臺(tái)運(yùn)行且受到了事件蝗砾。?
后臺(tái):程序在后臺(tái)而且能執(zhí)行代碼,大多程序進(jìn)入這個(gè)狀態(tài)后會(huì)在這個(gè)狀態(tài)停留一會(huì)携冤,時(shí)間到之后會(huì)進(jìn)入掛起狀態(tài)悼粮。?
掛起:程序在后臺(tái)不能執(zhí)行代碼。系統(tǒng)會(huì)自動(dòng)把程序變成這個(gè)狀態(tài)而且不會(huì)發(fā)出通知曾棕。當(dāng)掛起時(shí)扣猫,程序還是停留在內(nèi)存中,系統(tǒng)內(nèi)存低時(shí)翘地,系統(tǒng)就把掛起的程序清除掉申尤。
各個(gè)程序運(yùn)行狀態(tài)時(shí)代理的回調(diào):
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
? ? ? 告訴代理進(jìn)程啟動(dòng)但還沒(méi)進(jìn)入狀態(tài)保存
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
? ? 告訴代理啟動(dòng)基本完成程序準(zhǔn)備開(kāi)始運(yùn)行
- (void)applicationWillResignActive:(UIApplication *)application
? ? 當(dāng)應(yīng)用程序?qū)⒁敕腔顒?dòng)狀態(tài)執(zhí)行,在此期間衙耕,應(yīng)用程序不接收消息或事件昧穿,比如來(lái)電話(huà)了
- (void)applicationDidBecomeActive:(UIApplication *)application
? ? 當(dāng)應(yīng)用程序入活動(dòng)狀態(tài)執(zhí)行,這個(gè)剛好跟上面那個(gè)方法相反
- (void)applicationDidEnterBackground:(UIApplication *)application
? ? 當(dāng)程序被推送到后臺(tái)的時(shí)候調(diào)用橙喘。所以要設(shè)置后臺(tái)繼續(xù)運(yùn)行时鸵,則在這個(gè)函數(shù)里面設(shè)置即可
- (void)applicationWillEnterForeground:(UIApplication *)application
? ? 當(dāng)程序從后臺(tái)將要重新回到前臺(tái)時(shí)候調(diào)用,這個(gè)剛好跟上面的那個(gè)方法相反。
- (void)applicationWillTerminate:(UIApplication *)application
? ? 當(dāng)程序?qū)⒁顺鍪潜徽{(diào)用饰潜,通常是用來(lái)保存數(shù)據(jù)和一些退出前的清理工作初坠。這個(gè)需要要設(shè)置UIApplicationExitsOnSuspend的鍵值。
- (void)applicationDidFinishLaunching:(UIApplication*)application
? ? 當(dāng)程序載入后執(zhí)行
7.棧彭雾、堆碟刺、靜態(tài)區(qū)域的區(qū)別
OC中,非對(duì)象的變量都存在棧中薯酝,對(duì)象都存在堆中半沽,靜態(tài)區(qū)域的內(nèi)存在程序編譯的時(shí)候就已經(jīng)分配好,這塊內(nèi)存在程序的整個(gè)運(yùn)行期間都存在蜜托,主要存放靜態(tài)數(shù)據(jù)抄囚、全局?jǐn)?shù)據(jù)和常量。
棧區(qū):在執(zhí)行函數(shù)時(shí)橄务,函數(shù)內(nèi)局部變量的存儲(chǔ)單元都可以在棧上創(chuàng)建幔托,函數(shù)執(zhí)行結(jié)束時(shí)這些存儲(chǔ)單元自動(dòng)被釋放。棧內(nèi)存效率高蜂挪,內(nèi)存容量有限重挑。
堆區(qū):OC對(duì)象存儲(chǔ)于堆中,當(dāng)對(duì)象的應(yīng)用計(jì)數(shù)為0時(shí)自動(dòng)釋放該對(duì)象棠涮。
8.子視圖超出父視圖的部分能看到么谬哀?超出的部分有什么影響?
子視圖超出父視圖的部分能看到严肪。但是超出的部分不能響應(yīng)事件
想讓超出的部分響應(yīng)事件史煎,就該寫(xiě)父視圖的hitTest方法。判斷觸碰區(qū)域是否在子視圖內(nèi)驳糯,如果在子視圖內(nèi)篇梭,則返回子視圖。讓子視圖去響應(yīng)事件酝枢。
9.respond鏈?zhǔn)侨绾雾憫?yīng)的恬偷,響應(yīng)順序是怎樣的?
在iOS系統(tǒng)中帘睦,能夠響應(yīng)并處理事件的對(duì)象稱(chēng)之為responder object, UIResponder是所有responder對(duì)象的基類(lèi)袍患,在UIResponder類(lèi)中定義了處理各種事件,包括觸摸事件(Touch Event)竣付、運(yùn)動(dòng)事件(Motion Event)和遠(yuǎn)程控制事件(Remote-Control Events)的編程接口诡延,
UIApplication, UIViewController,UIView和所有繼承自UIView的UIKit類(lèi)(包括UIWindow,繼承自UIView)都直接或間接的繼承自UIResponder,所以它們的實(shí)例都是responder object對(duì)象,都實(shí)現(xiàn)了上述4個(gè)方法。UIResponder中的默認(rèn)實(shí)現(xiàn)是什么都不做古胆,但UIKit中UIResponder的直接子類(lèi)(UIView,UIViewController…)的默認(rèn)實(shí)現(xiàn)是將事件沿著responder chain繼續(xù)向上傳遞到下一個(gè)responder,即nextResponder孕暇。所以在定制UIView子類(lèi)的上述事件處理方法時(shí),如果需要將事件傳遞給next responder,可以直接調(diào)用super的對(duì)應(yīng)事件處理方法赤兴,super的對(duì)應(yīng)方法將事件傳遞給next responder,即使用[super touchesBegan:touches withEvent:event];不建議直接向nextResponder發(fā)送消息妖滔,這樣可能會(huì)漏掉父類(lèi)對(duì)這一事件的其他處理。?
[self.nextResponder touchesBegan:touches withEvent:event];?
另外,在定制UIView子類(lèi)的事件處理方法時(shí)桶良,如果其中一個(gè)方法沒(méi)有調(diào)用super的對(duì)應(yīng)方法座舍,則其他方法也需要重寫(xiě),不使用super的方法,否則事件處理流程會(huì)很混亂陨帆。
responder chain是一系列連接的responder對(duì)象曲秉,通過(guò)responder對(duì)象可以將處理事件的責(zé)任傳遞給下一個(gè),更高級(jí)的對(duì)象,即當(dāng)前responder對(duì)象的nextResponder疲牵。?
iOS中responder chain的結(jié)構(gòu)為:
第一響應(yīng)者是第一個(gè)接收事件的View對(duì)象承二,我們?cè)赬code的Interface Builder畫(huà)視圖時(shí),可以看到視圖結(jié)構(gòu)中就有First Responder纲爸。這里的First Responder就是UIApplication了亥鸠。另外,我們可以控制一個(gè)View讓其成為First Responder识啦,通過(guò)實(shí)現(xiàn) canBecomeFirstResponder方法并返回YES可以使當(dāng)前View成為第一響應(yīng)者负蚊,或者調(diào)用View的becomeFirstResponder方法也可以,例如當(dāng)UITextField調(diào)用該方法時(shí)會(huì)彈出鍵盤(pán)進(jìn)行輸入颓哮,此時(shí)輸入框控件就是第一響應(yīng)者家妆。
iOS系統(tǒng)在處理事件時(shí),通過(guò)UIApplication對(duì)象和每個(gè)UIWindow對(duì)象的sendEvent:方法將事件分發(fā)給具體處理此事件的responder對(duì)象(對(duì)于觸摸事件為hit-test view,其他事件為first responder),當(dāng)具體處理此事件的responder不處理此事件時(shí),可以通過(guò)responder chain交給上一級(jí)處理冕茅。?
如果hit-test view或first responder不處理此事件伤极,則將事件傳遞給其nextResponder處理,若有UIViewController對(duì)象則傳遞給UIViewController姨伤,傳遞給其superView哨坪。?
如果view的viewController也不處理事件,則viewController將事件傳遞給其管理view的superView姜挺。?
視圖層級(jí)結(jié)構(gòu)的頂級(jí)為UIWindow對(duì)象齿税,如果window仍不處理此事件,傳遞給UIApplication.?
若UIApplication對(duì)象不處理此事件炊豪,則事件被丟棄凌箕。
小結(jié)下,使用響應(yīng)鏈词渤,能夠讓一條鏈上的多個(gè)對(duì)象對(duì)同一事件做出響應(yīng)牵舱。每一個(gè)應(yīng)用有一個(gè)響應(yīng)者鏈,我們的視圖結(jié)構(gòu)是一個(gè)N叉樹(shù)(一個(gè)視圖可以有多個(gè)子視圖缺虐,一個(gè)子視圖同一時(shí)刻只有一個(gè)父視圖)芜壁,而每一個(gè)繼承自UIResponder的對(duì)象都可以在這個(gè)N叉樹(shù)中成為一個(gè)節(jié)點(diǎn)。當(dāng)葉節(jié)點(diǎn)成為最高響應(yīng)者的時(shí)候,從這個(gè)葉節(jié)點(diǎn)開(kāi)始往其父節(jié)點(diǎn)開(kāi)始追溯出一條鏈慧妄,那么對(duì)于這一個(gè)葉節(jié)點(diǎn)來(lái)講顷牌,這一條鏈就是當(dāng)前的響應(yīng)者鏈。響應(yīng)者鏈將系統(tǒng)捕獲到的UIEvent與UITouch從葉節(jié)點(diǎn)層層向上分發(fā)塞淹,期間可以選擇停止分發(fā)窟蓝,也可以繼續(xù)向上分發(fā)。一句話(huà)就是事件的傳遞過(guò)程饱普。
10.GCD中柵欄機(jī)制
柵欄函數(shù) 只能用在調(diào)度并發(fā)隊(duì)列中运挫,不能使用在全局并發(fā)隊(duì)列中.?
1.實(shí)現(xiàn)高效率的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)和文件訪(fǎng)問(wèn)?
2.避免數(shù)據(jù)競(jìng)爭(zhēng)
dispatch_barrier_async函數(shù)會(huì)等待追加到并行隊(duì)列上的并行執(zhí)行的處理全部結(jié)束之后,再將制定的處理追加到該并行隊(duì)列中套耕。然后在由dispatch_barrier_async函數(shù)追加的處理執(zhí)行完畢后谁帕,并行隊(duì)列才恢復(fù)為一般的動(dòng)作,追加到該并行隊(duì)列的處理又開(kāi)始執(zhí)行冯袍。
11.Notification響應(yīng)順序匈挖?
NSNotification使用的是同步操作。即如果你在程序中的A位置post了一個(gè)NSNotification颠猴,在B位置注冊(cè)了一個(gè)observer关划,通知發(fā)出后,必須等到B位置的通知回調(diào)執(zhí)行完以后才能返回到A處繼續(xù)往下執(zhí)行翘瓮。如果想讓NSNotification的post處和observer處異步執(zhí)行贮折,可以通過(guò)NSNotificationQueue實(shí)現(xiàn)。
在多線(xiàn)程應(yīng)用中资盅,Notification在哪個(gè)線(xiàn)程中post调榄,就在哪個(gè)線(xiàn)程中被轉(zhuǎn)發(fā),而不一定是在注冊(cè)觀(guān)察者的那個(gè)線(xiàn)程中呵扛。 Notification的發(fā)送與接收處理都是在同一個(gè)線(xiàn)程中每庆。
對(duì)于同一個(gè)通知,如果注冊(cè)了多個(gè)觀(guān)察者今穿,則這多個(gè)觀(guān)察者的執(zhí)行順序和他們的注冊(cè)順序是保持一致的缤灵。?
這里講到了“重定向”,就是我們?cè)贜otification所在的默認(rèn)線(xiàn)程中捕獲這些分發(fā)的通知蓝晒,然后將其重定向到指定的線(xiàn)程中腮出。
為了順應(yīng)語(yǔ)法的變化,apple 從 ios4 之后提供了帶有 block 的 NSNotification芝薇。
一種重定向的實(shí)現(xiàn)思路是自定義一個(gè)通知隊(duì)列(注意胚嘲,不是NSNotificationQueue對(duì)象,而是一個(gè)數(shù)組)洛二,讓這個(gè)隊(duì)列去維護(hù)那些我們需要重定向的Notification馋劈。我們?nèi)匀皇窍衿匠R粯尤プ?cè)一個(gè)通知的觀(guān)察者攻锰,當(dāng)Notification來(lái)了時(shí),先看看post這個(gè)Notification的線(xiàn)程是不是我們所期望的線(xiàn)程妓雾,如果不是娶吞,則將這個(gè)Notification存儲(chǔ)到我們的隊(duì)列中,并發(fā)送一個(gè)信號(hào)(signal)到期望的線(xiàn)程中君珠,來(lái)告訴這個(gè)線(xiàn)程需要處理一個(gè)Notification寝志。指定的線(xiàn)程在收到信號(hào)后,將Notification從隊(duì)列中移除策添,并進(jìn)行處理。
當(dāng)我們注冊(cè)一個(gè)觀(guān)察者時(shí)毫缆,通知中心會(huì)持有觀(guān)察者的一個(gè)弱引用唯竹,來(lái)確保觀(guān)察者是可用的。主線(xiàn)程調(diào)用dealloc操作會(huì)讓Observer對(duì)象的引用計(jì)數(shù)減為0苦丁,這時(shí)對(duì)象會(huì)被釋放掉浸颓。后臺(tái)線(xiàn)程發(fā)送一個(gè)通知,如果此時(shí)Observer還未被釋放旺拉,則會(huì)用其轉(zhuǎn)出消息产上,并執(zhí)行回調(diào)方法。而如果在回調(diào)執(zhí)行的過(guò)程中對(duì)象被釋放了蛾狗,就會(huì)出現(xiàn)上面的問(wèn)題晋涣。
12.利用AutoLayout讓可變長(zhǎng)度標(biāo)簽居中
// ViewController.swift
import UIKit
import SnapKit
class ViewController: UIViewController
{
? ? override func viewDidLoad() {
? ? ? ? super.viewDidLoad()
? ? ? ? let leftLabel = UILabel()
? ? ? ? leftLabel.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "addText:"))
? ? ? ? leftLabel.userInteractionEnabled = true
? ? ? ? view.addSubview(leftLabel)
? ? ? ? leftLabel.numberOfLines = 0
? ? ? ? leftLabel.text = "All the world's a stage, and all the men and women merely players: they have their exits and their entrances; and one man in his time plays many parts, his acts being seven ages."
? ? ? ? leftLabel.snp_makeConstraints { (make) -> Void in
? ? ? ? ? ? make.top.equalTo(40)
? ? ? ? ? ? make.left.equalTo(self.view)
? ? ? ? ? ? make.right.equalTo(self.view.snp_centerX)
? ? ? ? }
? ? ? ? let rightLabel = UILabel()
? ? ? ? rightLabel.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "addText:"))
? ? ? ? rightLabel.userInteractionEnabled = true
? ? ? ? view.addSubview(rightLabel)
? ? ? ? rightLabel.numberOfLines = 0
? ? ? ? rightLabel.text = "There is a tide in the affairs of men, Which taken at the flood, leads on to fortune. Omitted, all the voyage of their life is bound in shallows and in miseries. On such a full sea are we now afloat. And we must take the current when it serves, or lose our ventures."
? ? ? ? rightLabel.snp_makeConstraints { (make) -> Void in
? ? ? ? ? ? make.top.equalTo(40)
? ? ? ? ? ? make.right.equalTo(self.view)
? ? ? ? ? ? make.left.equalTo(self.view.snp_centerX)
? ? ? ? }
? ? ? ? let bottomView = UIView()
? ? ? ? view.addSubview(bottomView)
? ? ? ? bottomView.backgroundColor = UIColor.redColor()
? ? ? ? bottomView.snp_makeConstraints { (make) -> Void in
? ? ? ? ? ? make.height.equalTo(20)
? ? ? ? ? ? make.left.right.equalTo(self.view)
? ? ? ? ? ? make.top.greaterThanOrEqualTo(leftLabel.snp_bottom)
? ? ? ? ? ? make.top.greaterThanOrEqualTo(rightLabel.snp_bottom)
? ? ? ? }
? ? }
? ? @objc func addText(recognizer: UIGestureRecognizer) {
? ? ? ? if let label = recognizer.view as? UILabel {
? ? ? ? ? ? label.text = label.text! + " I like cheese."
? ? ? ? }
? ? }
}
讓視圖的底部和可變高度的Label底部重合。讓視圖在手機(jī)中居中沉桌,視圖的頂部與可變高度Label保持40個(gè)點(diǎn)的高度差谢鹊。
http://stackoverflow.com/questions/30141870/ios-autolayout-dynamic-uilabel-height
http://www.android100.org/html/201507/06/162126.html
13.Core Data、SQLite是如何使用的留凭?
Core Data是一個(gè)功能強(qiáng)大的層佃扼,位于SQLite數(shù)據(jù)庫(kù)之上,它避免了SQL的復(fù)雜性蔼夜,能讓我們以更自然的方式與數(shù)據(jù)庫(kù)進(jìn)行交互兼耀。Core Data將數(shù)據(jù)庫(kù)行轉(zhuǎn)換為OC對(duì)象(托管對(duì)象)來(lái)實(shí)現(xiàn),這樣無(wú)需任何SQL知識(shí)就能操作他們求冷。?
Core Data能將應(yīng)用程序中的對(duì)象直接保存到數(shù)據(jù)庫(kù)中瘤运,無(wú)需進(jìn)行復(fù)雜的查詢(xún),也無(wú)需確保對(duì)象的屬性名和數(shù)據(jù)庫(kù)字段名對(duì)應(yīng)遵倦,這一切都由Core Data完成尽超。
(CoreData)http://blog.csdn.net/ryantang03/article/details/7794226
(SQLite)http://blog.csdn.net/totogo2010/article/details/7702207
14.歸檔是如何使用的?
“歸檔”是指用某種格式來(lái)保存一個(gè)或多個(gè)對(duì)象梧躺,以便以后還原這些對(duì)象的過(guò)程颁独。?
只要在類(lèi)中實(shí)現(xiàn)的每個(gè)屬性都是標(biāo)量(如int或flloat)或都是符合NSCoding協(xié)議的某個(gè)類(lèi)的實(shí)例掂之,就可以對(duì)你的對(duì)象進(jìn)行完整歸檔咆爽。?
http://blog.csdn.net/backapace/article/details/15812145
15.對(duì)Http的理解,socket編程的套路
HTTP協(xié)議是基于TCP連接的秃诵,是應(yīng)用層協(xié)議,主要解決如何包裝數(shù)據(jù)塞琼。Socket是對(duì)TCP/IP協(xié)議的封裝菠净,Socket本身并不是協(xié)議,而是一個(gè)調(diào)用接口(API)彪杉,通過(guò)Socket毅往,我們才能使用TCP/IP協(xié)議。?
HTTP連接:短連接派近,客戶(hù)端向服務(wù)器發(fā)送一次請(qǐng)求攀唯,服務(wù)器響應(yīng)后連接斷開(kāi),節(jié)省資源渴丸。服務(wù)器不能主動(dòng)給客戶(hù)端響應(yīng)(除非采用HTTP長(zhǎng)連接技術(shù))侯嘀,iPhone主要使用類(lèi)NSURLConnection。?
Socket連接:長(zhǎng)連接谱轨,客戶(hù)端跟服務(wù)器端直接使用Socket進(jìn)行連接戒幔,沒(méi)有規(guī)定連接后斷開(kāi),因此客戶(hù)端和服務(wù)器段保持連接通道土童,雙方可以主動(dòng)發(fā)送數(shù)據(jù)诗茎,一般多用于游戲.Socket默認(rèn)連接超時(shí)時(shí)間是30秒,默認(rèn)大小是8K(理解為一個(gè)數(shù)據(jù)包大心壬取)错沃。
http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html?
http://blog.csdn.net/hguisu/article/details/7444092
16.NSUserDefault使用的時(shí)候需要注意什么?
NSUserDefaults非常好用雀瓢,并不需要用戶(hù)在程序中設(shè)置NSUserDefaults的全局變量枢析,需要在哪里使NSUserDefaults的數(shù)據(jù),那么就在哪里創(chuàng)建一個(gè)NSUserDefaults對(duì)象刃麸,然后進(jìn)行讀或者寫(xiě)操作醒叁。
針對(duì)同一個(gè)關(guān)鍵字對(duì)應(yīng)的對(duì)象或者數(shù)據(jù),可以對(duì)它進(jìn)行重寫(xiě)泊业,重寫(xiě)之后關(guān)鍵字就對(duì)應(yīng)新的對(duì)象或者數(shù)據(jù)把沼,舊的對(duì)象或者數(shù)據(jù)會(huì)被自動(dòng)清理。
注意一點(diǎn):只能存儲(chǔ)基本對(duì)象吁伺,如果是自定義的對(duì)象饮睬,需要轉(zhuǎn)換成nsdata存儲(chǔ)進(jìn)去才可以?
iPhone中在本地存儲(chǔ)數(shù)據(jù)簡(jiǎn)單的說(shuō)有三種方式:數(shù)據(jù)庫(kù)、NSUserDefaults和文件篮奄。
NSUserDefaults用于存儲(chǔ)數(shù)據(jù)量小的數(shù)據(jù)捆愁,例如用戶(hù)配置割去。并不是所有的東西都能往里放的,只支持:NSString, NSNumber, NSDate, NSArray, NSDictionary昼丑,
如果把一個(gè)自定義的類(lèi)存到一個(gè)NSArray里呻逆,然后再存到NSUserDefaults里也是不能成功的。
17.ARC的底層實(shí)現(xiàn)機(jī)制
18.滑動(dòng)TableView視圖的時(shí)候NSTimer會(huì)不會(huì)工作菩帝?
1.默認(rèn)情況下NSTimer不能在后臺(tái)正常工作:?
2.滑動(dòng)UI時(shí)NSTimer不能工作:
這其實(shí)就是runloop的mode在做怪咖城。?
runloop可以理解為cocoa下的一種消息循環(huán)機(jī)制,用來(lái)處理各種消息事件呼奢,我們?cè)陂_(kāi)發(fā) 的時(shí)候并不需要手動(dòng)去創(chuàng)建一個(gè)runloop宜雀,因?yàn)榭蚣転槲覀儎?chuàng)建了一個(gè)默認(rèn)的runloop,通過(guò)[NSRunloop currentRunloop]我們可以得到一個(gè)當(dāng)前線(xiàn)程下面對(duì)應(yīng)的runloop對(duì)象,不過(guò)我們需要注意的是不同的runloop之間消息的通知方式控妻。
接著上面的話(huà)題州袒,在開(kāi)啟一個(gè)NSTimer實(shí)質(zhì)上是在當(dāng)前的runloop中注冊(cè)了一個(gè)新的事件源,而當(dāng)scrollView滾動(dòng)的時(shí)候弓候,當(dāng)前的 MainRunLoop是處于UITrackingRunLoopMode的模式下,在這個(gè)模式下他匪,是不會(huì)處理NSDefaultRunLoopMode 的消息(因?yàn)镽unLoop Mode不一樣)菇存,要想在scrollView滾動(dòng)的同時(shí)也接受其它runloop的消息,我們需要改變兩者之間的runloopmode.
1 [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];?
簡(jiǎn)單的說(shuō)就是NSTimer不會(huì)開(kāi)啟新的進(jìn)程邦蜜,只是在Runloop里注冊(cè)了一下依鸥,Runloop每次loop時(shí)都會(huì)檢測(cè)這個(gè)timer,看是否可 以觸發(fā)悼沈。當(dāng)Runloop在A(yíng) mode贱迟,而timer注冊(cè)在B mode時(shí)就無(wú)法去檢測(cè)這個(gè)timer,所以需要把NSTimer也注冊(cè)到A mode絮供,這樣就可以被檢測(cè)到衣吠。
19.繪制圖形
- (void)drawRect:(CGRect)rect
{
? ? // Drawing code
? ? // 1.獲得圖形上下文
? ? CGContextRef ctx = UIGraphicsGetCurrentContext();
? ? // 2.拼接圖形(路徑)
? ? // 設(shè)置線(xiàn)段寬度
? ? CGContextSetLineWidth(ctx, 10);
? ? // 設(shè)置線(xiàn)段頭尾部的樣式
? ? CGContextSetLineCap(ctx, kCGLineCapRound);
? ? // 設(shè)置線(xiàn)段轉(zhuǎn)折點(diǎn)的樣式
? ? CGContextSetLineJoin(ctx, kCGLineJoinRound);
? ? /**? 第1根線(xiàn)段? **/
? ? // 設(shè)置顏色
? ? CGContextSetRGBStrokeColor(ctx, 1, 0, 0, 1);
? ? // 設(shè)置一個(gè)起點(diǎn)
? ? CGContextMoveToPoint(ctx, 10, 10);
? ? // 添加一條線(xiàn)段到(100, 100)
? ? CGContextAddLineToPoint(ctx, 100, 100);
? ? // 渲染一次
? ? CGContextStrokePath(ctx);
? ? /**? 第2根線(xiàn)段? **/
? ? // 設(shè)置顏色
? ? CGContextSetRGBStrokeColor(ctx, 0, 0, 1, 1);
? ? // 設(shè)置一個(gè)起點(diǎn)
? ? CGContextMoveToPoint(ctx, 200, 190);
? ? // 添加一條線(xiàn)段到(150, 40)
? ? CGContextAddLineToPoint(ctx, 150, 40);
? ? CGContextAddLineToPoint(ctx, 120, 60);
? ? // 3.渲染顯示到view上面
? ? CGContextStrokePath(ctx);
}
20.構(gòu)建緩存時(shí)選用NSCache而非NSDictionary
當(dāng)系統(tǒng)資源將要耗盡時(shí),NSCache可以自動(dòng)刪減緩存壤靶。如果采用普通的字典缚俏,那么就要自己編寫(xiě)掛鉤,在系統(tǒng)發(fā)出"低內(nèi)存"通知時(shí)手工刪減緩存贮乳,NSCache會(huì)先行刪減"最久未使用的"對(duì)象忧换。
NSCache并不會(huì)"拷貝"鍵,而是會(huì)"保留"它向拆。此行為用NSDictionary也可以實(shí)現(xiàn)亚茬,但是需要編寫(xiě)比較復(fù)雜的代碼。NSCache對(duì)象不拷貝鍵的原因在于:很多時(shí)候浓恳,鍵都是由不支持拷貝操作的對(duì)象來(lái)充當(dāng)?shù)纳卜臁R虼送氚担琋SCache對(duì)象不會(huì)自動(dòng)拷貝鍵,所以說(shuō)赞草,在鍵不支持拷貝操作的情況下讹堤,該類(lèi)用起來(lái)比字典更方便。
NSCache是線(xiàn)程安全的厨疙,NSDictionary不是洲守。在開(kāi)發(fā)者自己不編寫(xiě)加鎖代碼的前提下,多個(gè)線(xiàn)程便可以同時(shí)訪(fǎng)問(wèn)NSCache沾凄。對(duì)緩存來(lái)說(shuō)梗醇,線(xiàn)程安全通常很重要,因?yàn)殚_(kāi)發(fā)者可能要在某個(gè)線(xiàn)程中讀取數(shù)據(jù)撒蟀,此時(shí)如果發(fā)現(xiàn)緩存里找不到指定的鍵叙谨,那么就要下載該鍵所對(duì)應(yīng)的數(shù)據(jù)了。
如果緩存使用得當(dāng)保屯,那么應(yīng)用程序的響應(yīng)速度就能提高手负。只有那種"重新計(jì)算起來(lái)很費(fèi)事的"數(shù)據(jù),才值得放入緩存姑尺,比如那些需要從網(wǎng)絡(luò)獲取或從磁盤(pán)讀取的數(shù)據(jù)竟终。
21.介紹項(xiàng)目。項(xiàng)目用了什么第三方框架切蟋?AFNetWorking用的什么版本统捶?它是基于什么的?有沒(méi)有讀過(guò)第三方框架源碼柄粹?
SVProgressHub?
AFNetWorking?
SDWebImage
AFNetWorking 2.0?
AFNetWorking是基于NSURLConnection和NSURLSession的基礎(chǔ)上進(jìn)行封裝的喘鸟,邏輯簡(jiǎn)單清楚,設(shè)計(jì)思路很好驻右。AFNetWorking利用的是異步加載數(shù)據(jù)的方式什黑,而且是代理的方式。
http://www.reibang.com/p/358dc280fb33
22.談?wù)凴untime
today?
運(yùn)行期組件
23.談?wù)凴unloop旺入,Runloop是怎樣持續(xù)監(jiān)聽(tīng)事件從而實(shí)現(xiàn)線(xiàn)程倍以洌活?如果線(xiàn)程啟用Runloop茵瘾,它會(huì)一直占用CPU嗎礼华?
http://www.reibang.com/p/10121d699c32
Run Loop是一讓線(xiàn)程能隨時(shí)處理事件但不退出的機(jī)制。RunLoop 實(shí)際上是一個(gè)對(duì)象拗秘,這個(gè)對(duì)象管理了其需要處理的事件和消息圣絮,并提供了一個(gè)入口函數(shù)來(lái)執(zhí)行Event Loop 的邏輯。線(xiàn)程執(zhí)行了這個(gè)函數(shù)后雕旨,就會(huì)一直處于這個(gè)函數(shù)內(nèi)部 “接受消息->等待->處理” 的循環(huán)中扮匠,直到這個(gè)循環(huán)結(jié)束(比如傳入 quit 的消息)捧请,函數(shù)返回。讓線(xiàn)程在沒(méi)有處理消息時(shí)休眠以避免資源占用棒搜、在有消息到來(lái)時(shí)立刻被喚醒疹蛉。
OSX/iOS 系統(tǒng)中,提供了兩個(gè)這樣的對(duì)象:NSRunLoop 和 CFRunLoopRef力麸。CFRunLoopRef 是在 CoreFoundation 框架內(nèi)的可款,它提供了純 C 函數(shù)的 API,所有這些 API 都是線(xiàn)程安全的克蚂。NSRunLoop 是基于 CFRunLoopRef 的封裝闺鲸,提供了面向?qū)ο蟮?API,但是這些 API 不是線(xiàn)程安全的埃叭。?
線(xiàn)程和 RunLoop 之間是一一對(duì)應(yīng)的摸恍,其關(guān)系是保存在一個(gè)全局的 Dictionary 里。線(xiàn)程剛創(chuàng)建時(shí)并沒(méi)有 RunLoop赤屋,如果你不主動(dòng)獲取立镶,那它一直都不會(huì)有。RunLoop 的創(chuàng)建是發(fā)生在第一次獲取時(shí)类早,RunLoop 的銷(xiāo)毀是發(fā)生在線(xiàn)程結(jié)束時(shí)谜慌。你只能在一個(gè)線(xiàn)程的內(nèi)部獲取其 RunLoop(主線(xiàn)程除外)。
Run Loop的四個(gè)作用:?
(1)使程序一直運(yùn)行接受用戶(hù)輸入?
(2)決定程序在何時(shí)應(yīng)該處理哪些Event?
(3)調(diào)用解耦?
(4)節(jié)省CPU時(shí)間
主線(xiàn)程的run loop默認(rèn)是啟動(dòng)的莺奔。iOS的應(yīng)用程序里面,程序啟動(dòng)后會(huì)有一個(gè)如下的main() 函數(shù):
http://blog.csdn.net/potato512/article/details/51455728
28.說(shuō)說(shuō)對(duì)臨界區(qū)的理解变泄。臨界資源有什么特點(diǎn)令哟?為什么會(huì)發(fā)生死鎖?死鎖怎么預(yù)防妨蛹?發(fā)生了死鎖怎么辦屏富?
today?
http://www.cnblogs.com/Jessy/p/3540724.html
29.上線(xiàn)APP的crash收集
1.找到開(kāi)發(fā)者賬號(hào)進(jìn)入iTunes connect?
2.進(jìn)入app分析,查看app查看情況蛙卤,app下載量狠半,app崩潰情況?
3.去查看app的崩潰的分布版本和手機(jī)系統(tǒng)版本?
4.打開(kāi)xcode下載崩潰日志,product-Archive-crashes 查看響應(yīng)版本的崩潰日志颤难。?
5.點(diǎn)擊對(duì)應(yīng)的崩潰日志神年,后面會(huì)出現(xiàn)一個(gè)箭頭,點(diǎn)擊箭頭就會(huì)進(jìn)入到xcode中對(duì)應(yīng)的代碼行
30.動(dòng)畫(huà)掉幀行嗤,CADisPlayLink已日, Core graphics
嘗試使用KMCGeigerCounter檢測(cè)動(dòng)畫(huà)掉幀問(wèn)題(指示器)
CADisplayLink是一個(gè)能讓我們以和屏幕刷新率相同的頻率將內(nèi)容畫(huà)到屏幕上的定時(shí)器。我們?cè)趹?yīng)用中創(chuàng)建一個(gè)新的 CADisplayLink 對(duì)象栅屏,把它添加到一個(gè)runloop中飘千,并給它提供一個(gè) target 和selector 在屏幕刷新的時(shí)候調(diào)用堂鲜。另外CADisplayLink 不能被繼承。?
frameInterval屬性是可讀可寫(xiě)的NSInteger型值护奈,標(biāo)識(shí)間隔多少幀調(diào)用一次selector 方法缔莲,默認(rèn)值是1,即每幀都調(diào)用一次霉旗。如果每幀都調(diào)用一次的話(huà)痴奏,對(duì)于iOS設(shè)備來(lái)說(shuō)那刷新頻率就是60HZ也就是每秒60次,如果將 frameInterval 設(shè)為2 那么就會(huì)兩幀調(diào)用一次奖慌,也就是變成了每秒刷新30次抛虫。?
我們通過(guò)pause屬性開(kāi)控制CADisplayLink的運(yùn)行。當(dāng)我們想結(jié)束一個(gè)CADisplayLink的時(shí)候简僧,應(yīng)該調(diào)用-(void)invalidate?
從runloop中刪除并刪除之前綁定的 target跟selector?
另外CADisplayLink 不能被繼承建椰。
iOS設(shè)備的屏幕刷新頻率是固定的,CADisplayLink在正常情況下會(huì)在每次刷新結(jié)束都被調(diào)用岛马,精確度相當(dāng)高棉姐。?
NSTimer的精確度就顯得低了點(diǎn),比如NSTimer的觸發(fā)時(shí)間到的時(shí)候啦逆,runloop如果在阻塞狀態(tài)伞矩,觸發(fā)時(shí)間就會(huì)推遲到下一個(gè)runloop周期。并且 NSTimer新增了tolerance屬性夏志,讓用戶(hù)可以設(shè)置可以容忍的觸發(fā)的時(shí)間的延遲范圍乃坤。?
CADisplayLink使用場(chǎng)合相對(duì)專(zhuān)一,適合做UI的不停重繪沟蔑,比如自定義動(dòng)畫(huà)引擎或者視頻播放的渲染湿诊。NSTimer的使用范圍要廣泛的多,各種需要單次或者循環(huán)定時(shí)處理的任務(wù)都可以使用瘦材。在UI相關(guān)的動(dòng)畫(huà)或者顯示內(nèi)容使用 CADisplayLink比起用NSTimer的好處就是我們不需要在格外關(guān)心屏幕的刷新頻率了厅须,因?yàn)樗旧砭褪歉聊凰⑿峦降摹?/p>
注意?
通常來(lái)講:iOS設(shè)備的刷新頻率事60HZ也就是每秒60次。那么每一次刷新的時(shí)間就是1/60秒 大概16.7毫秒食棕。當(dāng)我們的frameInterval值為1的時(shí)候我們需要保證的是 CADisplayLink調(diào)用的`target`的函數(shù)計(jì)算時(shí)間不應(yīng)該大于 16.7否則就會(huì)出現(xiàn)嚴(yán)重的丟幀現(xiàn)象朗和。?
在mac應(yīng)用中我們使用的不是CADisplayLink而是 CVDisplayLink它是基于C接口的用起來(lái)配置有些麻煩但是用起來(lái)還是很簡(jiǎn)單的。
使用ARC是否會(huì)出現(xiàn)野指針簿晓,為什么眶拉?
定義block的時(shí)候,是將block內(nèi)存分配在堆上的抢蚀。當(dāng)在函數(shù)作用范圍外的 時(shí)候block的內(nèi)存會(huì)被回收釋放镀层,就會(huì)生成野指針,這時(shí)候去調(diào)用block,就crash.
如何讓對(duì)異步方法進(jìn)行二次封裝讓其同步執(zhí)行
可以用dispatch_group_async, dispatch_group_notify
為什么這么去定義單例?
為什么使用GCD去創(chuàng)建單例唱逢,GCD中的dispatch_once函數(shù)只調(diào)用一次吴侦,多線(xiàn)程中若有兩個(gè)線(xiàn)程先后去執(zhí)行到dispatch_once這個(gè)地方,則先執(zhí)行到的會(huì)去調(diào)用坞古,后執(zhí)行的就不會(huì)調(diào)用了备韧。
為什么要讓對(duì)象指針static, 多線(xiàn)程情況下痪枫,因?yàn)閐ispatch_once只執(zhí)行一次织堂,除了第一個(gè)執(zhí)行的,之后的線(xiàn)程都不執(zhí)行奶陈,直接返回對(duì)象指針易阳,若此時(shí)指針是臨時(shí)變量,則會(huì)導(dǎo)致返回一個(gè)空指針吃粒,若為static則返回的永遠(yuǎn)是同一個(gè)又第一個(gè)執(zhí)行的生成的對(duì)象潦俺。
PNG和JPEG的區(qū)別
PNG格式可以保存為透明背景的圖片,JPEG不可以徐勃。
PNG格式圖片具有高保真性事示、透明性、文件體積小等特性僻肖。
JPEG有損壓縮肖爵。
31.如何給按鈕畫(huà)邊框
32.Socket和Http的區(qū)別,和TCP的區(qū)別臀脏。
Socket套接字
套接字(socket)是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元劝堪。它是網(wǎng)絡(luò)通信過(guò)程中端點(diǎn)的抽象表示,包含進(jìn)行網(wǎng)絡(luò)通信必須的五種信息:連接使用的協(xié)議揉稚,本地主機(jī)的IP地址幅聘,本地進(jìn)程的協(xié)議端口,遠(yuǎn)地主機(jī)的IP地址窃植,遠(yuǎn)地進(jìn)程的協(xié)議端口。
應(yīng)用層通過(guò)傳輸層進(jìn)行數(shù)據(jù)通信時(shí)荐糜,TCP會(huì)遇到同時(shí)為多個(gè)應(yīng)用程序進(jìn)程提供并發(fā)服務(wù)的問(wèn)題巷怜。多個(gè)TCP連接或多個(gè)應(yīng)用程序進(jìn)程可能需要通過(guò)同一個(gè) TCP協(xié) 議端口傳輸數(shù)據(jù)。為了區(qū)別不同的應(yīng)用程序進(jìn)程和連接暴氏,許多計(jì)算機(jī)操作系統(tǒng)為應(yīng)用程序與TCP/IP協(xié)議交互提供了套接字(Socket)接口延塑。應(yīng)用層可以 和傳輸層通過(guò)Socket接口,區(qū)分來(lái)自不同應(yīng)用程序進(jìn)程或網(wǎng)絡(luò)連接的通信答渔,實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務(wù)关带。
套接字之間的連接過(guò)程分為三個(gè)步驟:服務(wù)器監(jiān)聽(tīng),客戶(hù)端請(qǐng)求,連接確認(rèn)宋雏。?
服務(wù)器監(jiān)聽(tīng):服務(wù)器端套接字并不定位具體的客戶(hù)端套接字芜飘,而是處于等待連接的狀態(tài),實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài)磨总,等待客戶(hù)端的連接請(qǐng)求嗦明。
客戶(hù)端請(qǐng)求:指客戶(hù)端的套接字提出連接請(qǐng)求,要連接的目標(biāo)是服務(wù)器端的套接字蚪燕。為此娶牌,客戶(hù)端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號(hào)馆纳,然后就向服務(wù)器端套接字提出連接請(qǐng)求诗良。
連接確認(rèn):當(dāng)服務(wù)器端套接字監(jiān)聽(tīng)到或者說(shuō)接收到客戶(hù)端套接字的連接請(qǐng)求時(shí),就響應(yīng)客戶(hù)端套接字的請(qǐng)求鲁驶,建立一個(gè)新的線(xiàn)程鉴裹,把服務(wù)器端套接字的描述發(fā)給客戶(hù)端,一旦客戶(hù)端確認(rèn)了此描述灵嫌,雙方就正式建立連接壹罚。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽(tīng)狀態(tài),繼續(xù)接收其他客戶(hù)端套接字的連接請(qǐng)求寿羞。
4猖凛、SOCKET連接與TCP連接?
創(chuàng)建Socket連接時(shí),可以指定使用的傳輸層協(xié)議绪穆,Socket可以支持不同的傳輸層協(xié)議(TCP或UDP)辨泳,當(dāng)使用TCP協(xié)議進(jìn)行連接時(shí),該Socket連接就是一個(gè)TCP連接玖院。?
若雙方建立的是HTTP連接菠红,則服務(wù)器需要等到客戶(hù)端發(fā)送一次請(qǐng)求后才能將數(shù)據(jù)傳回給客戶(hù)端,因此难菌,客戶(hù)端定時(shí)向服務(wù)器端發(fā)送連接請(qǐng)求试溯,不僅可以 保持在線(xiàn),同時(shí)也是在“詢(xún)問(wèn)”服務(wù)器是否有新的數(shù)據(jù)郊酒,如果有就將數(shù)據(jù)傳給客戶(hù)端遇绞。
TPC/IP協(xié)議是傳輸層協(xié)議,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸燎窘,而HTTP是應(yīng)用層協(xié)議摹闽,主要解決如何包裝數(shù)據(jù)。關(guān)于TCP/IP和HTTP協(xié)議的關(guān)系褐健,網(wǎng)絡(luò)有一段比較容易理解的介紹:“我們?cè)趥鬏敂?shù)據(jù)時(shí)付鹿,可以只使用(傳輸層)TCP/IP協(xié)議,但是那樣的話(huà),如果沒(méi)有應(yīng)用層舵匾,便無(wú)法識(shí)別數(shù)據(jù)內(nèi)容俊抵,如果想要使傳輸?shù)臄?shù)據(jù)有意義,則必須使用到應(yīng)用層協(xié)議纽匙,應(yīng)用層協(xié)議有很多儒洛,比如HTTP肄梨、FTP、TELNET等,也可以自己定義應(yīng)用層協(xié)議耘成。WEB使用HTTP協(xié)議作應(yīng)用層協(xié)議赵刑,以封裝HTTP 文本信息耕驰,然后使用TCP/IP做傳輸層協(xié)議將它發(fā)到網(wǎng)絡(luò)上痰驱。”
形象的理解:?
把IP想像成一種高速公路晕翠,IP負(fù)責(zé)在通信雙方地點(diǎn)間規(guī)劃線(xiàn)路喷舀,它允許其它協(xié)議在上面行駛并找到到其它電腦的出口。TCP和UDP是高速公路上的“卡車(chē)”淋肾,TCP負(fù)責(zé)車(chē)輛管理硫麻,發(fā)出多少車(chē)輛,車(chē)輛丟失后重新發(fā)車(chē)樊卓,路途中車(chē)輛太多減少發(fā)車(chē)量之類(lèi)的拿愧,它們攜帶的貨物就是像HTTP,文件傳輸協(xié)議FTP這樣的協(xié)議碌尔,HTTP負(fù)責(zé)把數(shù)據(jù)信息包裝起來(lái)浇辜,Socket就像兩個(gè)通信雙方的地點(diǎn),創(chuàng)建Socket就像打開(kāi)通信端口唾戚,打開(kāi)車(chē)庫(kù)的大門(mén)柳洋。
HTTP請(qǐng)求報(bào)文:一個(gè)HTTP請(qǐng)求報(bào)文由請(qǐng)求行、請(qǐng)求頭部叹坦、空行和請(qǐng)求數(shù)據(jù)4部分組成熊镣。?
HTTP響應(yīng)報(bào)文:由三部分組成:狀態(tài)行、消息報(bào)頭募书、響應(yīng)正文轧钓。
1、HTTP協(xié)議的幾個(gè)重要概念?
1.連接(Connection):一個(gè)傳輸層的實(shí)際環(huán)流锐膜,它是建立在兩個(gè)相互通訊的應(yīng)用程序之間。?
2.消息(Message):HTTP通訊的基本單位弛房,包括一個(gè)結(jié)構(gòu)化的八元組序列并通過(guò)連接傳輸道盏。?
3.請(qǐng)求(Request):一個(gè)從客戶(hù)端到服務(wù)器的請(qǐng)求信息包括應(yīng)用于資源的方法、資源的標(biāo)識(shí)符和協(xié)議的版本號(hào)?
4.響應(yīng)(Response):一個(gè)從服務(wù)器返回的信息包括HTTP協(xié)議的版本號(hào)、請(qǐng)求的狀態(tài)(例如“成功”或“沒(méi)找到”)和文檔的MIME類(lèi)型荷逞。?
5.資源(Resource):由URI標(biāo)識(shí)的網(wǎng)絡(luò)數(shù)據(jù)對(duì)象或服務(wù)媒咳。?
6.實(shí)體(Entity):數(shù)據(jù)資源或來(lái)自服務(wù)資源的回映的一種特殊表示方法,它可能被包圍在一個(gè)請(qǐng)求或響應(yīng)信息中种远。一個(gè)實(shí)體包括實(shí)體頭信息和實(shí)體的本身內(nèi)容涩澡。?
7.客戶(hù)機(jī)(Client):一個(gè)為發(fā)送請(qǐng)求目的而建立連接的應(yīng)用程序。?
8.用戶(hù)代理(Useragent):初始化一個(gè)請(qǐng)求的客戶(hù)機(jī)坠敷。它們是瀏覽器妙同、編輯器或其它用戶(hù)工具。?
9.服務(wù)器(Server):一個(gè)接受連接并對(duì)請(qǐng)求返回信息的應(yīng)用程序膝迎。?
10.源服務(wù)器(Originserver):是一個(gè)給定資源可以在其上駐留或被創(chuàng)建的服務(wù)器粥帚。?
11.代理(Proxy):一個(gè)中間程序,它可以充當(dāng)一個(gè)服務(wù)器限次,也可以充當(dāng)一個(gè)客戶(hù)機(jī)芒涡,為其它客戶(hù)機(jī)建立請(qǐng)求。請(qǐng)求是通過(guò)可能的翻譯在內(nèi)部或經(jīng)過(guò)傳遞到其它的服務(wù)器中卖漫。一個(gè)代理在發(fā)送請(qǐng)求信息之前费尽,必須解釋并且如果可能重寫(xiě)它。?
代理經(jīng)常作為通過(guò)防火墻的客戶(hù)機(jī)端的門(mén)戶(hù)羊始,代理還可以作為一個(gè)幫助應(yīng)用來(lái)通過(guò)協(xié)議處理沒(méi)有被用戶(hù)代理完成的請(qǐng)求旱幼。?
12.網(wǎng)關(guān)(Gateway):一個(gè)作為其它服務(wù)器中間媒介的服務(wù)器。與代理不同的是店枣,網(wǎng)關(guān)接受請(qǐng)求就好象對(duì)被請(qǐng)求的資源來(lái)說(shuō)它就是源服務(wù)器速警;發(fā)出請(qǐng)求的客戶(hù)機(jī)并沒(méi)有意識(shí)到它在同網(wǎng)關(guān)打交道。?
網(wǎng)關(guān)經(jīng)常作為通過(guò)防火墻的服務(wù)器端的門(mén)戶(hù)鸯两,網(wǎng)關(guān)還可以作為一個(gè)協(xié)議翻譯器以便存取那些存儲(chǔ)在非HTTP系統(tǒng)中的資源闷旧。?
13.通道(Tunnel):是作為兩個(gè)連接中繼的中介程序。一旦激活钧唐,通道便被認(rèn)為不屬于HTTP通訊忙灼,盡管通道可能是被一個(gè)HTTP請(qǐng)求初始化的。當(dāng)被中繼的連接兩端關(guān)閉時(shí)钝侠,通道便消失该园。當(dāng)一個(gè)門(mén)戶(hù)(Portal)必須存在或中介(Intermediary)不能解釋中繼的通訊時(shí)通道被經(jīng)常使用。?
14.緩存(Cache):反應(yīng)信息的局域存儲(chǔ)帅韧。
客戶(hù)端可以通過(guò)客戶(hù)機(jī)或者用戶(hù)代理與服務(wù)器相互發(fā)送消息的形式建立連接(客戶(hù)端請(qǐng)求報(bào)文里初,服務(wù)器響應(yīng)報(bào)文),請(qǐng)求報(bào)文里包含請(qǐng)求的資源定位符忽舟,請(qǐng)求的方法双妨,響應(yīng)報(bào)文里包含資源的實(shí)體淮阐,當(dāng)服務(wù)器返回響應(yīng)報(bào)文后連接斷開(kāi)。這是一個(gè)簡(jiǎn)單HTTP連接的過(guò)程刁品。
HTTP
http://www.cnblogs.com/renyuan/archive/2013/01/19/2867720.html
33. OC對(duì)象模型
對(duì)象是OC中基本構(gòu)造單元 (building block)泣特,用于存儲(chǔ)和傳遞數(shù)據(jù)。類(lèi)和對(duì)象的最終實(shí)現(xiàn)都是一種數(shù)據(jù)結(jié)構(gòu)?
一個(gè)完整的類(lèi)應(yīng)該包括類(lèi)方法挑随、實(shí)例方法和成員變量(實(shí)例變量), 每個(gè)對(duì)象都包括一個(gè)isa(is a class)指針指向類(lèi)對(duì)象(運(yùn)行時(shí)方法發(fā)送給對(duì)象消息状您,才確定類(lèi)別并調(diào)用相應(yīng)的方法實(shí)現(xiàn)),類(lèi)對(duì)象結(jié)構(gòu)中記載了類(lèi)的所有信息兜挨。?
類(lèi)對(duì)象的isa指向元類(lèi)對(duì)象(meta class)膏孟,類(lèi)對(duì)象中的方法列表是實(shí)例方法(-, instance methods)暑劝, 元類(lèi)對(duì)象中的方法列表是類(lèi)方法(+骆莹, class methods)
34.HTTPS和HTTP的區(qū)別
1、HTTPS是加密傳輸協(xié)議担猛,HTTP是明文傳輸協(xié)議;?
2幕垦、HTTPS需要用到SSL證書(shū),而HTTP不用;?
3傅联、HTTPS比HTTP更加安全先改,對(duì)搜索引擎更友好,利于SEO蒸走;?
4仇奶、HTTPS標(biāo)準(zhǔn)端口443,HTTP標(biāo)準(zhǔn)端口80;?
5比驻、HTTPS基于傳輸層该溯,HTTP基于應(yīng)用層;?
6、HTTPS在瀏覽器顯示綠色安全鎖别惦,HTTP沒(méi)有顯示;
http://blog.devtang.com/2013/10/15/objective-c-object-model/
35.使用atomic一定是線(xiàn)程安全的嗎狈茉?
1.具備atomic特質(zhì)的獲取方法會(huì)通過(guò)鎖定機(jī)制來(lái)確保其操作的原子性。?
2.不加鎖的話(huà)掸掸,一個(gè)線(xiàn)程正在改寫(xiě)某屬性值的時(shí)候氯庆,另外一個(gè)線(xiàn)程也許會(huì)突然闖入,把尚未修改好的屬性值讀取出來(lái)扰付。?
3.聲明為atomic堤撵,但如果一個(gè)線(xiàn)程在連續(xù)多次讀取某個(gè)屬性值的過(guò)程中有別的線(xiàn)程在同時(shí)改寫(xiě)該值,也還是會(huì)讀取到不同的屬性值羽莺。
A線(xiàn)程結(jié)束完寫(xiě)操作后实昨,B線(xiàn)程進(jìn)行寫(xiě)操作,之后A線(xiàn)程進(jìn)行讀操作的時(shí)候讀取的是B線(xiàn)程的值盐固,破壞了線(xiàn)程安全荒给。
4.atomic需要同步鎖族跛,開(kāi)銷(xiāo)大。
線(xiàn)程安全就是多線(xiàn)程訪(fǎng)問(wèn)時(shí)锐墙,采用了加鎖機(jī)制,當(dāng)一個(gè)線(xiàn)程訪(fǎng)問(wèn)該類(lèi)的某個(gè)數(shù)據(jù)時(shí)长酗,進(jìn)行保護(hù)溪北,其他線(xiàn)程不能進(jìn)行訪(fǎng)問(wèn)直到該線(xiàn)程讀取完,其他線(xiàn)程才可使用夺脾。不會(huì)出現(xiàn)數(shù)據(jù)不一致或者數(shù)據(jù)污染之拨。 線(xiàn)程不安全就是不提供數(shù)據(jù)訪(fǎng)問(wèn)保護(hù),有可能出現(xiàn)多個(gè)線(xiàn)程先后更改數(shù)據(jù)造成所得到的數(shù)據(jù)是臟數(shù)據(jù)
36.__block在arc和非arc下含義一樣嗎咧叭?
一般在block中修改變量都需要事先加block進(jìn)行修飾蚀乔。?
在非arc中,block修飾的變量的引用計(jì)算是不變的菲茬。?
在arc中吉挣,會(huì)引用到,并且計(jì)算+1婉弹;
37.什么是method swizzling?
38.如何高性能的給UIImageView加個(gè)圓角睬魂?
我覺(jué)得應(yīng)該是使用Quartz2D直接繪制圖片,得把這個(gè)看看。?
步驟:?
a镀赌、創(chuàng)建目標(biāo)大小(cropWidth氯哮,cropHeight)的畫(huà)布。
b商佛、使用UIImage的drawInRect方法進(jìn)行繪制的時(shí)候喉钢,指定rect為(-x,-y良姆,width肠虽,height)。
c歇盼、從畫(huà)布中得到裁剪后的圖像舔痕。?
```?
- (UIImage*)cropImageWithRect:(CGRect)cropRect?
{?
CGRect drawRect = CGRectMake(-cropRect.origin.x , -cropRect.origin.y, self.size.width * self.scale, self.size.height * self.scale);
UIGraphicsBeginImageContext(cropRect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextClearRect(context, CGRectMake(0, 0, cropRect.size.width, cropRect.size.height));
[self drawInRect:drawRect];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
```?
39.UIView和CALayer是什么關(guān)系?
UIView 是 CALayer 的CALayerDelegate?
1.首先UIView可以響應(yīng)事件豹缀,Layer不可以.?
UIView伯复、和所有從UIView派生出來(lái)的UIKit類(lèi)(包括UIWindow)都直接或間接地繼承自UIResponder類(lèi)。
2.View和CALayer的Frame映射及View如何創(chuàng)建CALayer.?
一個(gè) Layer 的 frame 是由它的 anchorPoint,position,bounds,和 transform 共同決定的邢笙,而一個(gè) View 的 frame 只是簡(jiǎn)單的返回 Layer的 frame啸如,同樣 View 的 center和 bounds 也是返回 Layer 的一些屬性。
3.UIView主要是對(duì)顯示內(nèi)容的管理而 CALayer 主要側(cè)重顯示內(nèi)容的繪制氮惯。?
4.在做 iOS 動(dòng)畫(huà)的時(shí)候叮雳,修改非 RootLayer的屬性(譬如位置想暗、背景色等)會(huì)默認(rèn)產(chǎn)生隱式動(dòng)畫(huà),而修改UIView則不會(huì)帘不。
40.使用drawRect有什么影響说莫?
rawRect會(huì)利用CPU生成offscreen bitmap,從而減輕GPU的繪制壓力寞焙,用這種方式最UI可以將動(dòng)畫(huà)流暢性?xún)?yōu)化到極致储狭,但缺點(diǎn)是繪制api復(fù)雜,offscreen cache增加內(nèi)存開(kāi)銷(xiāo)捣郊。UI動(dòng)畫(huà)流暢性的優(yōu)化主要平衡CPU和GPU的工作壓力辽狈。
drawRect方法依賴(lài)Core Graphics框架來(lái)進(jìn)行自定義的繪制,但這種方法主要的缺點(diǎn)就是它處理touch事件的方式:每次按鈕被點(diǎn)擊后呛牲,都會(huì)用setNeddsDisplay進(jìn)行強(qiáng)制重繪刮萌;而且不止一次,每次單點(diǎn)事件觸發(fā)兩次執(zhí)行娘扩。這樣的話(huà)從性能的角度來(lái)說(shuō)着茸,對(duì)CPU和內(nèi)存來(lái)說(shuō)都是欠佳的。特別是如果在我們的界面上有多個(gè)這樣的UIButton實(shí)例畜侦。
41.設(shè)計(jì)簡(jiǎn)單的圖片內(nèi)存緩存器(移除策略要說(shuō))
常見(jiàn)的有FIFO,LRU,LRU-2,2Q等等元扔。由于NSCache的緩存策略不透明,一些app開(kāi)發(fā)者會(huì)選擇自己做一套cache機(jī)制旋膳,其實(shí)并不難澎语。
42.用過(guò)coreData或者sqlite嗎?讀寫(xiě)是分線(xiàn)程的嗎验懊?遇到過(guò)死鎖沒(méi)擅羞?如何解決
43.二叉搜索樹(shù)?search的時(shí)間復(fù)雜度是多少?
44.loadView是干嘛用的义图?
當(dāng)你訪(fǎng)問(wèn)一個(gè)ViewController的view屬性時(shí)减俏,如果此時(shí)view的值是nil,那么碱工,ViewController就會(huì)自動(dòng)調(diào)用loadView這個(gè)方法娃承。這個(gè)方法就會(huì)加載或者創(chuàng)建一個(gè)view對(duì)象,賦值給view屬性怕篷。?
loadView默認(rèn)做的事情是:如果此ViewController存在一個(gè)對(duì)應(yīng)的nib文件历筝,那么就加載這個(gè)nib。否則廊谓,就創(chuàng)建一個(gè)UIView對(duì)象梳猪。
如果你用Interface Builder來(lái)創(chuàng)建界面,那么不應(yīng)該重載這個(gè)方法蒸痹。
如果你想自己創(chuàng)建view對(duì)象春弥,那么可以重載這個(gè)方法呛哟。此時(shí)你需要自己給view屬性賦值。你自定義的方法不應(yīng)該調(diào)用super匿沛。如果你需要對(duì)view做一些其他的定制操作扫责,在viewDidLoad里面去做。
如果你想自己控制view對(duì)象的創(chuàng)建逃呼,例如創(chuàng)建一個(gè)特殊尺寸的view公给,那么可以重載這個(gè)方法,自己創(chuàng)建一個(gè)UIView對(duì)象蜘渣,然后指定 self.view = myView; 但這種情況也沒(méi)有必要調(diào)用super,因?yàn)榉凑阋膊恍枰趕uper方法里面創(chuàng)建的view對(duì)象肺然。
45.viewWillLayoutSubView是蔫缸?
layoutSubviews在以下情況下會(huì)被調(diào)用:
1、init初始化不會(huì)觸發(fā)layoutSubviews
但是是用initWithFrame 進(jìn)行初始化時(shí)际起,當(dāng)rect的值不為CGRectZero時(shí),也會(huì)觸發(fā)
2拾碌、addSubview會(huì)觸發(fā)layoutSubviews
3、設(shè)置view的Frame會(huì)觸發(fā)layoutSubviews街望,當(dāng)然前提是frame的值設(shè)置前后發(fā)生了變化
4校翔、滾動(dòng)一個(gè)UIScrollView會(huì)觸發(fā)layoutSubviews
5、旋轉(zhuǎn)Screen會(huì)觸發(fā)父UIView上的layoutSubviews事件
6灾前、改變一個(gè)UIView大小的時(shí)候也會(huì)觸發(fā)父UIView上的layoutSubviews事件
46.如何讓自己的類(lèi)用 copy 修飾符防症?如何重寫(xiě)帶 copy 關(guān)鍵字的 setter?
遵循NSCopying協(xié)議并實(shí)現(xiàn)方法copyWithZone就可以讓自己的類(lèi)用copy修飾符
- (void)setName:(NSString *)name {
? ? _name = [name copy];
}
如果是只讀屬性哎甲,可以在初始化init函數(shù)里完成name copy操作
47.@protocol 和 category 中如何使用 @property
建立關(guān)聯(lián)引用蔫敲。?
http://www.reibang.com/p/3cbab68fb856
48.runtime 如何實(shí)現(xiàn) weak 屬性
weak 此特質(zhì)表明該屬性定義了一種“非擁有關(guān)系” (nonowning relationship)。為這種屬性設(shè)置新值時(shí)炭玫,設(shè)置方法既不保留新值奈嘿,也不釋放舊值。此特質(zhì)同assign類(lèi)似吞加, 然而在屬性所指的對(duì)象遭到摧毀時(shí)裙犹,屬性值也會(huì)清空(nil out)。?
那么runtime如何實(shí)現(xiàn)weak變量的自動(dòng)置nil衔憨??
runtime 對(duì)注冊(cè)的類(lèi)叶圃, 會(huì)進(jìn)行布局,對(duì)于 weak 對(duì)象會(huì)放入一個(gè) hash 表中巫财。 用 weak 指向的對(duì)象內(nèi)存地址作為 key盗似,當(dāng)此對(duì)象的引用計(jì)數(shù)為0的時(shí)候會(huì) dealloc,假如 weak 指向的對(duì)象內(nèi)存地址是a平项,那么就會(huì)以a為鍵赫舒, 在這個(gè) weak 表中搜索悍及,找到所有以a為鍵的 weak 對(duì)象,從而設(shè)置為 nil接癌。
49.@property 的本質(zhì)是什么心赶?ivar、getter缺猛、setter 是如何生成并添加到這個(gè)類(lèi)中的
包含特性的成員變量缨叫。?
@property = ivar + getter + setter
Ivar可以理解為類(lèi)中的一個(gè)變量,主要作用是用來(lái)保存數(shù)據(jù)的荔燎。
“屬性” (property)作為 Objective-C 的一項(xiàng)特性耻姥,主要的作用就在于封裝對(duì)象中的數(shù)據(jù)。 Objective-C 對(duì)象通常會(huì)把其所需要的數(shù)據(jù)保存為各種實(shí)例變量有咨。實(shí)例變量一般通過(guò)“存取方法”(access method)來(lái)訪(fǎng)問(wèn)琐簇。
完成屬性定義后,編譯器會(huì)自動(dòng)編寫(xiě)訪(fǎng)問(wèn)這些屬性所需的方法座享,此過(guò)程叫做"自動(dòng)合成"婉商。這個(gè)過(guò)程是由編譯器在編譯期執(zhí)行,除了生成方法代碼getter渣叛、setter之外丈秩,編譯器還要自動(dòng)向類(lèi)中添加適當(dāng)類(lèi)型的實(shí)例變量,并且在屬性名前面加下劃線(xiàn)淳衙,以此作為實(shí)例變量的名字蘑秽。
49.1@synthesize和@dynamic分別有什么作用?
1)@property有兩個(gè)對(duì)應(yīng)的詞箫攀,一個(gè)是@synthesize筷狼,一個(gè)是@dynamic。如果@synthesize和@dynamic都沒(méi)寫(xiě)匠童,那么默認(rèn)的就是@syntheszie var = _var;?
2)@synthesize的語(yǔ)義是如果你沒(méi)有手動(dòng)實(shí)現(xiàn)setter方法和getter方法埂材,那么編譯器會(huì)自動(dòng)為你加上這兩個(gè)方法。?
3)@dynamic告訴編譯器:屬性的setter與getter方法由用戶(hù)自己實(shí)現(xiàn)汤求,不自動(dòng)生成俏险。(當(dāng)然對(duì)于readonly的屬性只需提供getter即可)。假如一個(gè)屬性被聲明為@dynamic var扬绪,然后你沒(méi)有提供@setter方法和@getter方法竖独,編譯的時(shí)候沒(méi)問(wèn)題,但是當(dāng)程序運(yùn)行到instance.var = someVar挤牛,由于缺setter方法會(huì)導(dǎo)致程序崩潰莹痢;或者當(dāng)運(yùn)行到 someVar = var時(shí),由于缺getter方法同樣會(huì)導(dǎo)致崩潰。編譯時(shí)沒(méi)問(wèn)題竞膳,運(yùn)行時(shí)才執(zhí)行相應(yīng)的方法航瞭,這就是所謂的動(dòng)態(tài)綁定。
50.ARC下坦辟,不顯式指定任何屬性關(guān)鍵字時(shí)刊侯,默認(rèn)的關(guān)鍵字都有哪些?
對(duì)應(yīng)基本數(shù)據(jù)類(lèi)型默認(rèn)關(guān)鍵字是?
atomic,readwrite,assign?
對(duì)于普通的OC對(duì)象?
atomic,readwrite,strong
51.@synthesize合成實(shí)例變量的規(guī)則是什么锉走?假如property名為foo滨彻,存在一個(gè)名為_(kāi)foo的實(shí)例變量,那么還會(huì)自動(dòng)合成新變量么挪蹭?
實(shí)例變量 = 成員變量 = ivar?
總結(jié)下@synthesize合成實(shí)例變量的規(guī)則亭饵,有以下幾點(diǎn):?
1)如果指定了成員變量的名稱(chēng),會(huì)生成一個(gè)指定的名稱(chēng)的成員變量,?
2)如果這個(gè)成員已經(jīng)存在了就不再生成了.?
3)如果是 @synthesize foo; 還會(huì)生成一個(gè)名稱(chēng)為foo的成員變量,也就是說(shuō):如果沒(méi)有指定成員變量的名稱(chēng)會(huì)自動(dòng)生成一個(gè)屬性同名的成員變量梁厉。?
4)如果是 @synthesize foo = _foo; 就不會(huì)生成成員變量了.
假如property名為foo冬骚,存在一個(gè)名為_(kāi)foo的實(shí)例變量,那么還會(huì)自動(dòng)合成新變量么懂算? 不會(huì)。
52.在有了自動(dòng)合成屬性實(shí)例變量之后庇麦,@synthesize還有哪些使用場(chǎng)景计技?
53.什么時(shí)候會(huì)報(bào)unrecognized selector的異常?
objc在向一個(gè)對(duì)象發(fā)送消息時(shí)山橄,runtime庫(kù)會(huì)根據(jù)對(duì)象的isa指針找到該對(duì)象實(shí)際所屬的類(lèi)垮媒,然后在該類(lèi)中的方法列表以及其父類(lèi)方法列表中尋找方法運(yùn)行,如果航棱,在最頂層的父類(lèi)中依然找不到相應(yīng)的方法時(shí)睡雇,程序在運(yùn)行時(shí)會(huì)掛掉并拋出異常unrecognized selector sent to XXX 。但是在這之前饮醇,objc的運(yùn)行時(shí)會(huì)給出三次拯救程序崩潰的機(jī)會(huì):
53.1objc中向一個(gè)nil對(duì)象發(fā)送消息將會(huì)發(fā)生什么它抱?
在Objective-C中向nil發(fā)送消息是完全有效的——只是在運(yùn)行時(shí)不會(huì)有任何作用:?
如果一個(gè)方法返回值是一個(gè)對(duì)象,那么發(fā)送給nil的消息將返回0(nil)朴艰。例如:?
Person * motherInlaw = [[aPerson spouse] mother];?
如果spouse對(duì)象為nil观蓄,那么發(fā)送給nil的消息mother也將返回nil。
1)如果方法返回值為指針類(lèi)型淹办,其指針大小為小于或者等于sizeof(void*)档插,float债查,double,long double 或者long long的整型標(biāo)量亲茅,發(fā)送給nil的消息將返回0。?
2)如果方法返回值為結(jié)構(gòu)體,發(fā)送給nil的消息將返回0。結(jié)構(gòu)體中各個(gè)字段的值將都是0克锣。?
3)如果方法的返回值不是上述提到的幾種情況茵肃,那么發(fā)送給nil的消息的返回值將是未定義的。?
objc是動(dòng)態(tài)語(yǔ)言娶耍,每個(gè)方法在運(yùn)行時(shí)會(huì)被動(dòng)態(tài)轉(zhuǎn)為消息發(fā)送免姿,即:objc_msgSend(receiver, selector)。
objc在向一個(gè)對(duì)象發(fā)送消息時(shí)榕酒,runtime庫(kù)會(huì)根據(jù)對(duì)象的isa指針找到該對(duì)象實(shí)際所屬的類(lèi)胚膊,然后在該類(lèi)中的方法列表以及其父類(lèi)方法列表中尋找方法運(yùn)行,然后在發(fā)送消息的時(shí)候想鹰,objc_msgSend方法不會(huì)返回值紊婉,所謂的返回內(nèi)容都是具體調(diào)用時(shí)執(zhí)行的。 那么辑舷,回到本題喻犁,如果向一個(gè)nil對(duì)象發(fā)送消息,首先在尋找對(duì)象的isa指針時(shí)就是0地址返回了何缓,所以不會(huì)出現(xiàn)任何錯(cuò)誤肢础。
54.一個(gè)objc對(duì)象的isa的指針指向什么?有什么作用碌廓?
指向他的類(lèi)對(duì)象,從而可以找到對(duì)象上的方法
每個(gè)Objective-C對(duì)象都有一個(gè)隱藏的數(shù)據(jù)結(jié)構(gòu)传轰,這個(gè)數(shù)據(jù)結(jié)構(gòu)是Objective-C對(duì)象的第一個(gè)成員變量,它就是isa指針谷婆。這個(gè)指針指向哪呢慨蛙?它指向一個(gè)類(lèi)對(duì)象(class object 記住它是個(gè)對(duì)象,是占用內(nèi)存空間的一個(gè)變量纪挎,這個(gè)對(duì)象在編譯的時(shí)候編譯器就生成了期贫,專(zhuān)門(mén)來(lái)描述某個(gè)類(lèi)的定義),這個(gè)類(lèi)對(duì)象包含了Objective-C對(duì)象的一些信息(為了區(qū)分兩個(gè)對(duì)象异袄,我把前面提到的對(duì)象叫Objective-C對(duì)象)通砍,包括Objective-C對(duì)象的方法調(diào)度表,實(shí)現(xiàn)了什么協(xié)議等等烤蜕。這個(gè)包含信息就是Objective-C動(dòng)態(tài)能力的根源了
代碼輸出
@implementation Son : Father
- (id)init
{
? ? self = [super init];
? ? if (self) {
? ? ? ? NSLog(@"%@", NSStringFromClass([self class]));
? ? ? ? NSLog(@"%@", NSStringFromClass([super class]));
? ? }
? ? return self;
}
@end
代碼輸出都是son埠帕, 因?yàn)閟elf class和super class都是以這個(gè)son實(shí)例為參數(shù),去調(diào)用自己的class方法或father的class方法玖绿,結(jié)果他們都沒(méi)實(shí)現(xiàn)敛瓷,都調(diào)用的是NSObject的class方法,參數(shù)是同一個(gè)son斑匪,故結(jié)果都輸出son
兩個(gè)很大整數(shù)做乘法
分治法呐籽。?
兩個(gè)大整數(shù)用字符串保存锋勺,輸出結(jié)果用字符串保存。?
采用乘法的交叉相乘原理狡蝶。
什么時(shí)候用HTTP庶橱, 什么時(shí)候用TCP
HTTP:超文本傳輸協(xié)議。當(dāng)需要傳輸一些超文本的時(shí)候贪惹,用HTTP?
HTTP是制定出來(lái)的苏章,方便傳輸一些超文本的協(xié)議。
TCP:控制傳輸方式的協(xié)議奏瞬。保證數(shù)據(jù)傳輸可靠性的一個(gè)方式枫绅。可在其基礎(chǔ)上定制協(xié)議以實(shí)現(xiàn)多種文件的傳輸硼端。
在block之外有一個(gè)NSMutableArray并淋, 不采用__block修飾符可以改變其值么。
可以珍昨。為什么呢县耽,因?yàn)槲覀冎皇菍?duì)截獲的變量進(jìn)行了操作,而沒(méi)有進(jìn)行賦值镣典,所以對(duì)于截獲變量兔毙,可以進(jìn)行操作而不可以進(jìn)行賦值。?
我們引用的是指針兄春,當(dāng)只是操作并不會(huì)改變指針的指向澎剥,賦值的話(huà)就會(huì)引發(fā)指針指向的改變。block禁止的是指針指向的改變
使用get_current_queue會(huì)導(dǎo)致死鎖么神郊?為什么?
55.一個(gè)objc對(duì)象如何進(jìn)行內(nèi)存布局趾唱?(考慮有父類(lèi)的情況)
所有父類(lèi)的成員變量和自己的成員變量都會(huì)存放在該對(duì)象所對(duì)應(yīng)的存儲(chǔ)空間中.?
每一個(gè)對(duì)象內(nèi)部都有一個(gè)isa指針,指向他的類(lèi)對(duì)象,類(lèi)對(duì)象中存放著本對(duì)象的?
1)對(duì)象方法列表(對(duì)象能夠接收的消息列表涌乳,保存在它所對(duì)應(yīng)的類(lèi)對(duì)象中)?
2)成員變量的列表?
3)屬性列表?
它內(nèi)部也有一個(gè)isa指針指向元對(duì)象(meta class),元對(duì)象內(nèi)部存放的是類(lèi)方法列表,類(lèi)對(duì)象內(nèi)部還有一個(gè)superclass的指針,指向他的父類(lèi)對(duì)象。
1)根對(duì)象就是NSobject甜癞,它的superclass指針指向nil夕晓。?
2)類(lèi)對(duì)象既然稱(chēng)為對(duì)象,那它也是一個(gè)實(shí)例蒸辆。類(lèi)對(duì)象中也有一個(gè)isa指針指向它的元類(lèi)(meta class)躬贡,即類(lèi)對(duì)象是元類(lèi)的實(shí)例眼坏。元類(lèi)內(nèi)部存放的是類(lèi)方法列表,根元類(lèi)的isa指針指向自己魄懂,superclass指針指向NSObject類(lèi)市栗。?
56.使用runtime Associate方法關(guān)聯(lián)的對(duì)象咳短,需要在主對(duì)象dealloc的時(shí)候釋放么诲泌?
在A(yíng)RC下不需要?
在MRC中,對(duì)于使用retain或copy策略的需要
57.objc中的類(lèi)方法和實(shí)例方法有什么本質(zhì)區(qū)別和聯(lián)系敷扫?
類(lèi)方法:?
類(lèi)方法是屬于類(lèi)對(duì)象的?
類(lèi)方法只能通過(guò)類(lèi)對(duì)象調(diào)用?
類(lèi)方法中的self是類(lèi)對(duì)象?
類(lèi)方法可以調(diào)用其他的類(lèi)方法?
類(lèi)方法中不能訪(fǎng)問(wèn)成員變量?
類(lèi)方法中不能直接調(diào)用對(duì)象方法
實(shí)例方法:?
實(shí)例方法是屬于實(shí)例對(duì)象的?
實(shí)例方法只能通過(guò)實(shí)例對(duì)象調(diào)用?
實(shí)例方法中的self是實(shí)例對(duì)象?
實(shí)例方法中可以訪(fǎng)問(wèn)成員變量?
實(shí)例方法中直接調(diào)用實(shí)例方法?
實(shí)例方法中也可以調(diào)用類(lèi)方法(通過(guò)類(lèi)名)
58._objc_msgForward函數(shù)是做什么的哀蘑,直接調(diào)用它將會(huì)發(fā)生什么?
_objc_msgForward是 IMP 類(lèi)型葵第,用于消息轉(zhuǎn)發(fā)的:當(dāng)向一個(gè)對(duì)象發(fā)送一條消息绘迁,但它并沒(méi)有實(shí)現(xiàn)的時(shí)候,_objc_msgForward會(huì)嘗試做消息轉(zhuǎn)發(fā)卒密。
直接調(diào)用_objc_msgForward是非常危險(xiǎn)的事缀台,如果用不好會(huì)直接導(dǎo)致程序Crash,但是如果用得好哮奇,能做很多非程鸥酷的事。
一旦調(diào)用_objc_msgForward鼎俘,將跳過(guò)查找 IMP 的過(guò)程哲身,直接觸發(fā)“消息轉(zhuǎn)發(fā)”,如果調(diào)用了_objc_msgForward勘天,即使這個(gè)對(duì)象確實(shí)已經(jīng)實(shí)現(xiàn)了這個(gè)方法脯丝,你也會(huì)告訴objc_msgSend:“我沒(méi)有在這個(gè)對(duì)象里找到這個(gè)方法的實(shí)現(xiàn)”
59.runloop的mode作用是什么?
model 主要是用來(lái)指定事件在運(yùn)行循環(huán)中的優(yōu)先級(jí)的砰苍,分為:
NSDefaultRunLoopMode(kCFRunLoopDefaultMode):默認(rèn)茬缩,空閑狀態(tài)?
UITrackingRunLoopMode:ScrollView滑動(dòng)時(shí)?
UIInitializationRunLoopMode:?jiǎn)?dòng)時(shí)?
NSRunLoopCommonModes(kCFRunLoopCommonModes):Mode集合
蘋(píng)果公開(kāi)提供的 Mode 有兩個(gè):?
NSDefaultRunLoopMode(kCFRunLoopDefaultMode)?
NSRunLoopCommonModes(kCFRunLoopCommonModes)
60.能否向編譯后得到的類(lèi)中增加實(shí)例變量凰锡?能否向運(yùn)行時(shí)創(chuàng)建的類(lèi)中添加實(shí)例變量?為什么勇哗?
不能向編譯后得到的類(lèi)中增加實(shí)例變量;?
能向運(yùn)行時(shí)創(chuàng)建的類(lèi)中添加實(shí)例變量扰法;?
解釋下:
因?yàn)榫幾g后的類(lèi)已經(jīng)注冊(cè)在 runtime 中,類(lèi)結(jié)構(gòu)體中的 objc_ivar_list 實(shí)例變量的鏈表 和 instance_size 實(shí)例變量的內(nèi)存大小已經(jīng)確定祠锣,同時(shí)runtime 會(huì)調(diào)用 class_setIvarLayout 或 class_setWeakIvarLayout 來(lái)處理 strong weak 引用。所以不能向存在的類(lèi)中添加實(shí)例變量是偷;
運(yùn)行時(shí)創(chuàng)建的類(lèi)是可以添加實(shí)例變量,調(diào)用 class_addIvar 函數(shù)放接。但是得在調(diào)用 objc_allocateClassPair 之后玛瘸,objc_registerClassPair 之前,原因同上渺绒。
61.runloop和線(xiàn)程有什么關(guān)系?runloop和線(xiàn)程有什么關(guān)系殷绍?
62.以+ scheduledTimerWithTimeInterval...的方式觸發(fā)的timer,在滑動(dòng)頁(yè)面上的列表時(shí)镰烧,timer會(huì)暫定回調(diào)怔鳖,為什么?如何解決献幔?
RunLoop只能運(yùn)行在一種mode下,如果要換mode郑兴,當(dāng)前的loop也需要停下重啟成新的。利用這個(gè)機(jī)制却舀,ScrollView滾動(dòng)過(guò)程中NSDefaultRunLoopMode(kCFRunLoopDefaultMode)的mode會(huì)切換到UITrackingRunLoopMode來(lái)保證ScrollView的流暢滑動(dòng):只能在NSDefaultRunLoopMode模式下處理的事件會(huì)影響ScrollView的滑動(dòng)辆脸。
如果我們把一個(gè)NSTimer對(duì)象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主運(yùn)行循環(huán)中的時(shí)候, ScrollView滾動(dòng)過(guò)程中會(huì)因?yàn)閙ode的切換,而導(dǎo)致NSTimer將不再被調(diào)度空执。
同時(shí)因?yàn)閙ode還是可定制的,所以:
Timer計(jì)時(shí)會(huì)被scrollView的滑動(dòng)影響的問(wèn)題可以通過(guò)將timer添加到NSRunLoopCommonModes(kCFRunLoopCommonModes)來(lái)解決门坷。?
這個(gè)模式等效于NSDefaultRunLoopMode和NSEventTrackingRunLoopMode的結(jié)合。兩個(gè)模式以數(shù)組的形式組合成一個(gè)形式绸吸,當(dāng)只要其中任意一個(gè)模式觸發(fā)锦茁,都是這個(gè)大模式的觸發(fā)。都可響應(yīng)稿存。?
http://www.aichengxu.com/view/6772291
63.猜想runloop內(nèi)部是如何實(shí)現(xiàn)的?
while起到跳出條件檢測(cè)拂苹,若不滿(mǎn)足則一直不跳出。?
在while里有一個(gè)一直監(jiān)聽(tīng)喚醒時(shí)間的東西脯宿,監(jiān)聽(tīng)到就立馬處理。之后又循環(huán)回來(lái)監(jiān)聽(tīng)跺撼,知道滿(mǎn)足跳出條件
function loop() {
? ? initialize();
? ? do {
? ? ? ? var message = get_next_message();
? ? ? ? process_message(message);
? ? } while (message != quit);
}
objc使用什么機(jī)制管理對(duì)象內(nèi)存?
通過(guò) retainCount 的機(jī)制來(lái)決定對(duì)象是否需要釋放哩至。 每次 runloop 的時(shí)候菩貌,都會(huì)檢查對(duì)象的 retainCount,如果retainCount 為 0尾膊,說(shuō)明該對(duì)象沒(méi)有地方需要繼續(xù)使用了,可以釋放掉了抓谴。
64.BAD_ACCESS在什么情況下出現(xiàn)?
訪(fǎng)問(wèn)了野指針滩届,比如對(duì)一個(gè)已經(jīng)釋放的對(duì)象執(zhí)行了release棠枉、訪(fǎng)問(wèn)已經(jīng)釋放對(duì)象的成員變量或者發(fā)消息。 死循環(huán)
65.蘋(píng)果是如何實(shí)現(xiàn)autoreleasepool的贱除?
autoreleasepool 以一個(gè)隊(duì)列數(shù)組的形式實(shí)現(xiàn),主要通過(guò)下列三個(gè)函數(shù)完成.
objc_autoreleasepoolPush?
objc_autoreleasepoolPop?
objc_autorelease?
看函數(shù)名就可以知道,對(duì) autorelease 分別執(zhí)行 push飞醉,和 pop 操作。銷(xiāo)毀對(duì)象時(shí)執(zhí)行release操作钦无。
舉例說(shuō)明:我們都知道用類(lèi)方法創(chuàng)建的對(duì)象都是 Autorelease 的失暂,那么一旦 Person 出了作用域,當(dāng)在 Person 的 dealloc 方法中打上斷點(diǎn)决记,我們就可以看到這樣的調(diào)用堆棧信息
66.使用系統(tǒng)的某些block api(如UIView的block版本寫(xiě)動(dòng)畫(huà)時(shí)),是否也考慮引用循環(huán)問(wèn)題扩借?
系統(tǒng)的某些block api中,UIView的block版本寫(xiě)動(dòng)畫(huà)時(shí)不需要考慮沃暗,但也有一些api 需要考慮:
所謂“引用循環(huán)”是指雙向的強(qiáng)引用膊存,所以那些“單向的強(qiáng)引用”(block 強(qiáng)引用 self )沒(méi)有問(wèn)題今艺,比如這些:
[UIView animateWithDuration:duration animations:^{ [self.superview layoutIfNeeded]; }];?
[[NSOperationQueue mainQueue] addOperationWithBlock:^{ self.someProperty = xyz; }];?
[[NSNotificationCenter defaultCenter] addObserverForName:@"someNotification"?
object:nil?
queue:[NSOperationQueue mainQueue]?
usingBlock:^(NSNotification * notification) {?
self.someProperty = xyz; }];?
這些情況不需要考慮“引用循環(huán)”。
但如果你使用一些參數(shù)中可能含有 ivar 的系統(tǒng) api 实牡,如 GCD 、NSNotificationCenter就要小心一點(diǎn):比如GCD 內(nèi)部如果引用了 self题涨,而且 GCD 的其他參數(shù)是 ivar,則要考慮到循環(huán)引用:
weak __typeof(self) weakSelf = self;?
dispatch_group_async(_operationsGroup, _operationsQueue, ^?
{?
typeof(self) strongSelf = weakSelf;?
[strongSelf doSomething];?
[strongSelf doSomethingElse];?
} );?
類(lèi)似的:
weak __typeof(self) weakSelf = self;?
_observer = [[NSNotificationCenter defaultCenter] addObserverForName:@"testKey"?
object:nil?
queue:nil?
usingBlock:^(NSNotification *note) {?
typeof(self) strongSelf = weakSelf;?
[strongSelf dismissModalViewControllerAnimated:YES];?
}];?
self --> _observer --> block --> self 顯然這也是一個(gè)循環(huán)引用席函。
67.蘋(píng)果為什么要廢棄dispatch_get_current_queue?
dispatch_get_current_queue容易造成死鎖
68.如何手動(dòng)觸發(fā)一個(gè)value的KVO
復(fù)習(xí)大全里有
69.若一個(gè)類(lèi)有實(shí)例變量NSString *_foo何之,調(diào)用setValue:forKey:時(shí),可以以foo還是_foo作為key蒜危?
都可以部翘。
70.KVC和KVO的keyPath一定是屬性么?KVC的keyPath中的集合運(yùn)算符如何使用夹囚?
KVO支持實(shí)例變量
必須用在集合對(duì)象上或普通對(duì)象的集合屬性上?
簡(jiǎn)單集合運(yùn)算符有@avg, @count 鞍历, @max , @min 秆剪,@sum. age為鍵?
格式 @"@sum.age"或 @"集合屬性.@max.age"
71.如何關(guān)閉默認(rèn)的KVO的默認(rèn)實(shí)現(xiàn),并進(jìn)入自定義的KVO實(shí)現(xiàn)洁灵?
http://tech.glowing.com/cn/implement-kvo/
73.IB中User Defined Runtime Attributes如何使用?
它能夠通過(guò)KVC的方式配置一些你在interface builder 中不能配置的屬性双抽。當(dāng)你希望在IB中作盡可能多得事情牍汹,這個(gè)特性能夠幫助你編寫(xiě)更加輕量級(jí)的viewcontroller?
比如設(shè)置邊界的寬度嫁蛇,添加name屬性。
74.如何調(diào)試BAD_ACCESS錯(cuò)誤
1.通過(guò)僵尸對(duì)象?
2.設(shè)置全局?jǐn)帱c(diǎn)快速定位問(wèn)題代碼所在行?
3.Xcode 7 已經(jīng)集成了BAD_ACCESS捕獲功能:Address Sanitizer抑党。 用法如下:在配置中勾選:white_check_mark:Enable Address Sanitizer
代理屬性設(shè)置為assign會(huì)導(dǎo)致crash崩潰揽趾,報(bào)錯(cuò)EXC_BAD_ACCESS 經(jīng)由一番研討苟呐,發(fā)明若是應(yīng)用 @property (nonatomic, assign, readwrite) id delegate; 聲明一個(gè)delegate之前一直使用的是assign,今天調(diào)試一段代碼的時(shí)候笆呆,發(fā)現(xiàn)程序會(huì)crash掉,報(bào)錯(cuò)EXC_BAD_ACCESS
經(jīng)過(guò)一番研究榕堰,發(fā)現(xiàn)如果使用?
@property (nonatomic, assign, readwrite) id delegate;?
聲明一個(gè)delegate,那么即便delegate指向的對(duì)象銷(xiāo)毀了魏蔗,delegate中依然會(huì)保存之前對(duì)象的地址?
即沫勿,delegate成為了一個(gè)野指針...?
而使用weak诫惭,則不會(huì)有上述問(wèn)題,當(dāng)delegate指向的對(duì)象銷(xiāo)毀后怨绣,delegate = nil,?
所以答案就是赢笨,使用weak。
75.lldb(gdb)常用的調(diào)試命令桐筏?
(命令)和(子命令):LLDB調(diào)試命令的名稱(chēng)。命令和子命令按層級(jí)結(jié)構(gòu)來(lái)排列:一個(gè)命令對(duì)象為跟隨其的子命令對(duì)象創(chuàng)建一個(gè)上下文牧氮,子命令又為其子命令創(chuàng)建一個(gè)上下文,依此類(lèi)推剖毯。 2. :執(zhí)行命令的操作 3. :命令選項(xiàng) 4. :命令的參數(shù) 5. []:表示命令是可選的,可以有也可以沒(méi)有.
打印對(duì)象po
如果我們想打印對(duì)象胶滋。我們需要使用命令選項(xiàng):-O俭令。為了更方便的使用抄腔,LLDB為expression -O –定義了一個(gè)別名:po?
執(zhí)行表達(dá)式expression
執(zhí)行某個(gè)表達(dá)式。 我們?cè)诖a運(yùn)行過(guò)程中,可以通過(guò)執(zhí)行某個(gè)表達(dá)式來(lái)動(dòng)態(tài)改變程序運(yùn)行的軌跡暂幼。 假如我們?cè)谶\(yùn)行過(guò)程中奏寨,突然想把self.view顏色改成紅色病瞳,看看效果亲善。我們不必寫(xiě)下代碼,重新run渣蜗,只需暫停程序,用expression改變顏色骚烧,再刷新一下界面既峡,就能看到效果
改變顏色?
刷新界面?
將返回值輸出?
設(shè)置斷點(diǎn)
breakPoint set 表示設(shè)置斷點(diǎn)么夫,-n表示根據(jù)方法名name設(shè)置斷點(diǎn)涉枫,main為方法名參數(shù)。
使用-f指定文件?
我們只需要給ViewController.m文件中的viewDidLoad設(shè)置斷點(diǎn):?
這里需要注意衬廷,如果方法未寫(xiě)在文件中(比如寫(xiě)在category文件中,或者父類(lèi)文件中)跌宛,指定文件之后,將無(wú)法給這個(gè)方法設(shè)置斷點(diǎn)哎迄。
使用-l指定文件某一行設(shè)置斷點(diǎn)?
我們想給ViewController.m第38行設(shè)置斷點(diǎn)?
使用-c設(shè)置條件斷點(diǎn)?
text:方法接受一個(gè)ret的參數(shù),我們想讓ret == YES的時(shí)候程序中斷:?
有的時(shí)候我們可能暫時(shí)不想要某個(gè)斷點(diǎn),可以使用breakpoint disable讓某個(gè)斷點(diǎn)暫時(shí)失效 e.g: 我們來(lái)讓剛剛的斷點(diǎn)4失效?
enable使斷點(diǎn)重新生效
breakpoin查看設(shè)置了哪些斷點(diǎn)
76.你知道ios里面存數(shù)據(jù)有哪些方法嗎颊糜?
我答曰:歸檔业筏,NSUserDefault蒜胖,Core Data台谢,sqlite,plist樊拓,app sandbox里面的文件夾,如應(yīng)用沙盒一般包括以下幾個(gè)文件目錄:應(yīng)用程序包条篷、Documents蚊锹、Libaray(下面有Caches和Preferences目錄)牡昆、tmp柱宦。?
Documents:保存應(yīng)用運(yùn)行時(shí)生成的需要持久化的數(shù)據(jù),iTunes會(huì)自動(dòng)備份該目錄忧侧。蘋(píng)果建議將程序中建立的或在程序中瀏覽到的文件數(shù)據(jù)保存在該目錄下松逊,iTunes備份和恢復(fù)的時(shí)候會(huì)包括此目錄。?
tmp:保存應(yīng)用運(yùn)行時(shí)所需的臨時(shí)數(shù)據(jù)烁兰,使用完畢后再將相應(yīng)的文件從該目錄刪除。應(yīng)用沒(méi)有運(yùn)行時(shí)币喧,系統(tǒng)也有可能會(huì)清除該目錄下的文件,iTunes不會(huì)同步該目錄史翘。iphone重啟時(shí),該目錄下的文件會(huì)丟失钻蹬。?
Library:存儲(chǔ)程序的默認(rèn)設(shè)置和其他狀態(tài)信息,iTunes會(huì)自動(dòng)備份該目錄顺献。?
Libaray/Caches:存放緩存文件,iTunes不會(huì)備份此目錄肿轨,此目錄下文件不會(huì)在應(yīng)用退出刪除蚂斤。一般存放體積比較大,不是特別重要的資源纽窟。?
Libaray/Preferences:保存應(yīng)用的所有偏好設(shè)置,ios的Settings(設(shè)置)應(yīng)用會(huì)在該目錄中查找應(yīng)用的設(shè)置信息审孽,iTunes會(huì)自動(dòng)備份該目錄。
//第一種方式
[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];其他的都一樣?
//第二種方式
// 獲得應(yīng)用程序沙盒的Documents文件夾路徑
NSArray *arrDocumentPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
// 獲得應(yīng)用程序沙盒的Caches文件夾路徑
NSArray *arrCachesPaths=NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES);
// 獲得應(yīng)用程序沙盒的Downloads文件夾路徑
NSArray *arrDownloadPaths=NSSearchPathForDirectoriesInDomains(NSDownloadsDirectory,NSUserDomainMask,YES);
// 獲得應(yīng)用程序沙盒的home文件夾路徑
NSString *homePath= NSHomeDirectory();
// 獲得應(yīng)用程序沙盒的tmp文件夾路徑
NSString *TmpPath= NSTemporaryDirectory();
78.NSUrlsession 和 NSUrlconnection的區(qū)別
NSURLSession是NSURLConnection 的替代者打颤,是對(duì)NSURLConnection進(jìn)行了重構(gòu)優(yōu)化后的新的網(wǎng)絡(luò)訪(fǎng)問(wèn)接口。
與NSURLConnection相比透且,NSURLSession最直接的改善就是提供了配置每個(gè)會(huì)話(huà)的緩存,協(xié)議,cookie和證書(shū)政策(credential policies),甚至跨應(yīng)用程序共享它們的能力竖席。這使得框架的網(wǎng)絡(luò)基礎(chǔ)架構(gòu)和部分應(yīng)用程序獨(dú)立工作毕荐,而不會(huì)互相干擾员寇。
NSURLSession相對(duì)于NSConnection來(lái)說(shuō),比較具體的優(yōu)勢(shì)扳缕。?
1、后臺(tái)上傳和下載?
2庸毫、可以暫停和重啟網(wǎng)絡(luò)操作?
3、可以對(duì)緩存策略载佳,session類(lèi)型、任+?
務(wù)類(lèi)型(比如上傳姑躲、下載等任務(wù))進(jìn)行單獨(dú)的配置?
4、更多更豐富的代理模式
NSURLSession也是指一組相互依賴(lài)的類(lèi)阐枣。NSURLSession包括與之前相同的組件甩鳄,例如NSURLRequest, NSURLCache等。NSURLSession的不同之處在于揖赴,它把 NSURLConnection替換為NSURLSession, NSURLSessionConfiguration,以及3個(gè)NSURLSessionTask的子類(lèi):NSURLSessionDataTask, NSURLSessionUploadTask, 和NSURLSessionDownloadTask突倍。
79.frame bounds center 的區(qū)別。會(huì)讓你在紙上畫(huà)出來(lái)各自的變化
frame是相對(duì)于其它視圖?
bounds是相對(duì)于本身,本地坐標(biāo)系秕磷。管理的是子視圖添加進(jìn)本視圖的一個(gè)過(guò)程。設(shè)置bounds為(-20,-20,...,...)如果子視圖的frame是(0, 0, ..., ...)易桃,那么就會(huì)以距左邊界20,距上邊界20這樣的形式添加進(jìn)來(lái)造寝。因?yàn)樽右晥D的frame坐標(biāo)是以母視圖的bounds坐標(biāo)為準(zhǔn)。?
center.x = frame.origin.x + frame.width / 2?
center.y = frame.origin.y + frame.height / 2
80.線(xiàn)程共享進(jìn)程資源的實(shí)例赐稽,在iOS中姊舵。
NSUserDefault?
81.OC運(yùn)行時(shí)能加實(shí)例變量嗎
可以史飞。?
運(yùn)行時(shí)可動(dòng)態(tài)添加方法,在此方法里去初始化實(shí)例變量吐绵。
82.64位下nsnumber的優(yōu)化。
83.ipa包纹笼、編譯相關(guān)
83.1NSThread NSOperation dispatch 和 gcd的關(guān)系
NSThread:–優(yōu)點(diǎn):NSThread 比其他兩個(gè)輕量級(jí),使用簡(jiǎn)單?
缺點(diǎn):需要自己管理線(xiàn)程的生命周期笋额、線(xiàn)程同步、加鎖厦滤、睡眠以及喚醒等。線(xiàn)程同步對(duì)數(shù)據(jù)的加鎖會(huì)有一定的系統(tǒng)開(kāi)銷(xiāo)
NSOperation:–不需要關(guān)心線(xiàn)程管理趟咆,數(shù)據(jù)同步的事情鳞贷,可以把精力放在自己需要執(zhí)行的操作上–NSOperation是面向?qū)ο蟮?屬于OC類(lèi)
GCD:–Grand CentralDispatch是由蘋(píng)果開(kāi)發(fā)的一個(gè)多核編程的解決方案。是相比NSThread咱筛, NSOperation更高效和強(qiáng)大的技術(shù)–GCD是基于C的底層API。?
GCD主要是建立個(gè)個(gè)線(xiàn)程時(shí)間的依賴(lài)關(guān)系這類(lèi)的情況饲趋,更高的并發(fā)執(zhí)行能力。
84.iOS常用回調(diào)方式等
delegate回調(diào)爵川,kvo回調(diào),NSNotification回調(diào)圃泡,block回調(diào)
85.聲明delegate的時(shí)候?yàn)槭裁从胊ssign,而不用weak等等风秤。
weak比assgin線(xiàn)程更安全。
但在delegate成員變量這個(gè)細(xì)分領(lǐng)域碍沐,我們即可以用weak尘喝,又可以用assign瞧省。因?yàn)樵趲缀跛袌?chǎng)景下交洗,delegate所指向的對(duì)象C的生存期都是覆蓋了delegate成員變量本身所在的對(duì)象D的生存期的咆爽,所以,在D的生存期內(nèi)呛凶,C所使用的D的指針都是有效的崭捍,所以這個(gè)時(shí)候使用assign是沒(méi)有關(guān)系的。
86.用過(guò)Block沒(méi)有
網(wǎng)絡(luò)響應(yīng)block回調(diào)粒梦。對(duì)響應(yīng)數(shù)據(jù)進(jìn)行一個(gè)包裝作為參數(shù)調(diào)用控制器的函數(shù)泪勒。
87.信號(hào)機(jī)制什么的叼旋,還有二叉樹(shù)的深度優(yōu)先和廣度優(yōu)先遍歷算法讹剔。
88.有一個(gè)a[1000]的數(shù)組欺矫,存放1-1000的數(shù)狞玛,現(xiàn)在有一個(gè)數(shù)重復(fù)了心肪,用一個(gè)時(shí)間復(fù)雜度為N的算法找到重復(fù)的數(shù)值
89.猴子摘香蕉,共50個(gè),一次可以摘一個(gè)或兩個(gè)蹬音,問(wèn)摘法種數(shù)
90.iOS crash后的調(diào)試方法?
線(xiàn)上收集永部,Xcode中下載崩潰日志。
91.OC中深拷貝,淺拷貝
對(duì)不可變對(duì)象组橄,copy則執(zhí)行淺拷貝羽资,mutablCopy則執(zhí)行深拷貝屠升。對(duì)可變對(duì)象,copy和mutableCopy都執(zhí)行深拷貝微服,但是copy返回的對(duì)象是不可變的辛孵。
92.Appdelegate幾個(gè)回調(diào)?vc幾個(gè)回調(diào)的時(shí)機(jī)?寫(xiě)個(gè)itoa
AppDelegate回調(diào)時(shí)機(jī)
各個(gè)程序運(yùn)行狀態(tài)時(shí)代理的回調(diào):?
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions?
告訴代理進(jìn)程啟動(dòng)但還沒(méi)進(jìn)入狀態(tài)保存?
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions?
告訴代理啟動(dòng)基本完成程序準(zhǔn)備開(kāi)始運(yùn)行?
- (void)applicationWillResignActive:(UIApplication *)application?
當(dāng)應(yīng)用程序?qū)⒁敕腔顒?dòng)狀態(tài)執(zhí)行,在此期間冶匹,應(yīng)用程序不接收消息或事件,比如來(lái)電話(huà)了?
- (void)applicationDidBecomeActive:(UIApplication *)application?
當(dāng)應(yīng)用程序入活動(dòng)狀態(tài)執(zhí)行,這個(gè)剛好跟上面那個(gè)方法相反?
- (void)applicationDidEnterBackground:(UIApplication *)application?
當(dāng)程序被推送到后臺(tái)的時(shí)候調(diào)用灸眼。所以要設(shè)置后臺(tái)繼續(xù)運(yùn)行霉囚,則在這個(gè)函數(shù)里面設(shè)置即可?
- (void)applicationWillEnterForeground:(UIApplication *)application?
當(dāng)程序從后臺(tái)將要重新回到前臺(tái)時(shí)候調(diào)用逻澳,這個(gè)剛好跟上面的那個(gè)方法相反。?
- (void)applicationWillTerminate:(UIApplication?)application?
當(dāng)程序?qū)⒁顺鍪潜徽{(diào)用瓤逼,通常是用來(lái)保存數(shù)據(jù)和一些退出前的清理工作霸旗。這個(gè)需要要設(shè)置UIApplicationExitsOnSuspend的鍵值。?
- (void)applicationDidFinishLaunching:(UIApplication
)application?
當(dāng)程序載入后執(zhí)行
itoa 將數(shù)值轉(zhuǎn)換成相應(yīng)進(jìn)制的字符串
94.iOS沙盒機(jī)制
iOS應(yīng)用程序只能在為該改程序創(chuàng)建的文件系統(tǒng)中讀取文件,不可以去其它地方訪(fǎng)問(wèn),此區(qū)域被成為沙盒佛吓,所以所有的非代碼文件都要保存在此维雇,例如圖像,圖標(biāo)唁影,聲音,映像锌介,屬性列表隆敢,文本文件等。?
1.1、每個(gè)應(yīng)用程序都有自己的存儲(chǔ)空間?
1.2皇钞、應(yīng)用程序不能翻過(guò)自己的圍墻去訪(fǎng)問(wèn)別的存儲(chǔ)空間的內(nèi)容?
1.3、應(yīng)用程序請(qǐng)求的數(shù)據(jù)都要通過(guò)權(quán)限檢測(cè)可柿,假如不符合條件的話(huà)慢哈,不會(huì)被放行。?
通過(guò)這張圖只能從表層上理解sandbox是一種安全體系,應(yīng)用程序的所有操作都要通過(guò)這個(gè)體系來(lái)執(zhí)行世分,其中核心內(nèi)容是:sandbox對(duì)應(yīng)用程序執(zhí)行各種操作的權(quán)限限制。
93.不更新版本的方式添加新特性(熱更新)瓢阴。
html5?
1.使用FaceBook的開(kāi)源框架reactive native,使用js寫(xiě)原生的iOS應(yīng)用少漆。iOS app可以在運(yùn)行時(shí)從服務(wù)器拉取最新的js文件到本地,然后執(zhí)行检访,因?yàn)閖s是一門(mén)動(dòng)態(tài)的腳本語(yǔ)言,所以可以在運(yùn)行時(shí)直接讀取js文件執(zhí)行丹禀,因此能夠?qū)崿F(xiàn)iOS的熱更新。
2.使用lua腳本。lua腳本如同js一樣村斟,也能在運(yùn)行時(shí)去讀取lua腳本并執(zhí)行。
3.Xcode6之后逾滥,蘋(píng)果開(kāi)放了iOS的動(dòng)態(tài)庫(kù)編譯權(quán)限。所謂的動(dòng)態(tài)庫(kù)舔哪,其實(shí)就是可以在運(yùn)行時(shí)加載≡蹙簦可以利用這個(gè)實(shí)現(xiàn)iOS的熱更新。能夠從沙箱里面讀取到代碼文件芙委,就意味著可以在線(xiàn)更新代碼,遠(yuǎn)程升級(jí)
94.請(qǐng)寫(xiě)一個(gè)類(lèi)似于NSMutableArray的類(lèi)侧啼,可以添加椭更,刪除,以及如何以最快的速度查找某個(gè)元素舌狗?
采用一個(gè)鏈表加一個(gè)數(shù)組的組合茉稠。添加刪除用鏈表,查找用數(shù)組把夸。
95.如果在發(fā)送異步請(qǐng)求的情況下,當(dāng)前的界面刪除了铭污,會(huì)出現(xiàn)什么后果嘹狞,如何解決簸喂?
遇到這種情況程序會(huì)崩潰再菊,因?yàn)楫?dāng)前界面釋放的同時(shí)稠诲,在當(dāng)前界面所定義的對(duì)象也會(huì)釋放,會(huì)出現(xiàn)野指針的情況,解決的辦法是將異步請(qǐng)求的對(duì)象保持到單例中盖文,這樣界面釋放的同時(shí)異步請(qǐng)求的對(duì)象還存在凶伙。
96.怎么用c++ 實(shí)現(xiàn)kvo乘碑?
開(kāi)啟一個(gè)新線(xiàn)程去輪詢(xún)監(jiān)聽(tīng)事件轿衔,并傳入響應(yīng)方法,如果事件發(fā)生就調(diào)用監(jiān)聽(tīng)響應(yīng)方法。
97.你會(huì)如何儲(chǔ)存用戶(hù)的認(rèn)證信息费变?
使用keychain來(lái)存儲(chǔ),也就是鑰匙串。 使用keychain需要導(dǎo)入Security框架。?
只需要把“KeychainItemWrapper.h”和“KeychainItemWrapper.m”拷貝到我們項(xiàng)目夏跷,并導(dǎo)入Security.framework 。KeychainItemWrapper的用法:
/** 初始化一個(gè)保存用戶(hù)帳號(hào)的KeychainItemWrapper */?
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"Account Number" accessGroup:@"YOUR_APP_ID_HERE.com.yourcompany.AppIdentifier"];
//保存數(shù)據(jù)?
[wrapper setObject:@"<帳號(hào)>" forKey:(id)kSecAttrAccount];?
[wrapper setObject:@"<帳號(hào)密碼>" forKey:(id)kSecValueData];
//從keychain里取出帳號(hào)密碼?
NSString *password = [wrapper objectForKey:(id)kSecValueData];
98.堆和棧的區(qū)別
棧區(qū)(stack)由編譯器自動(dòng)分配釋放 ,存放方法(函數(shù))的參數(shù)值, 局部變量的值等义辕,棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域销部。即棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的。?
堆區(qū)(heap)一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時(shí)由OS回收狰右,向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu)盛垦,是不連續(xù)的內(nèi)存區(qū)域跷乐,從而堆獲得的空間比較靈活。?
碎片問(wèn)題:對(duì)于堆來(lái)講稳吮,頻繁的new/delete勢(shì)必會(huì)造成內(nèi)存空間的不連續(xù)春感,從而造成大量的碎片,使程序效率降低集歇。對(duì)于棧來(lái)講纺荧,則不會(huì)存在這個(gè)問(wèn)題,因?yàn)闂J窍冗M(jìn)后出的隊(duì)列坑匠,他們是如此的一一對(duì)應(yīng)月匣,以至于永遠(yuǎn)都不可能有一個(gè)內(nèi)存塊從棧中間彈出.?
分配方式:堆都是動(dòng)態(tài)分配的,沒(méi)有靜態(tài)分配的堆嗅蔬。棧有2種分配方式:靜態(tài)分配和動(dòng)態(tài)分配。靜態(tài)分配是編譯器完成的计露,比如局部變量的分配。動(dòng)態(tài)分配由alloca函數(shù)進(jìn)行分配,但是棧的動(dòng)態(tài)分配和堆是不同的,他的動(dòng)態(tài)分配是由編譯器進(jìn)行釋放翩瓜,無(wú)需我們手工實(shí)現(xiàn)匿又。?
分配效率:棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu)焦人,計(jì)算機(jī)會(huì)在底層對(duì)棧提供支持:分配專(zhuān)門(mén)的寄存器存放棧的地址折柠,壓棧出棧都有專(zhuān)門(mén)的指令執(zhí)行该抒,這就決定了棧的效率比較高憋肖。堆則是C/C++函數(shù)庫(kù)提供的瓜挽,它的機(jī)制是很復(fù)雜的暮芭。?
全局區(qū)(靜態(tài)區(qū))(static),全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊 的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域闰非。程序結(jié)束后有系統(tǒng)釋放唾那。?
文字常量區(qū)—常量字符串就是放在這里的拱雏。程序結(jié)束后由系統(tǒng)釋放至耻。?
程序代碼區(qū)—存放函數(shù)體的二進(jìn)制代碼
99.OC有多繼承嗎?沒(méi)有的話(huà)用什么代替?
OC中沒(méi)有多繼承,可以用委托代理Protocol來(lái)實(shí)現(xiàn)。
100.MD5和Base64的區(qū)別是什么市俊,各自場(chǎng)景是什么张咳?
md5 用戶(hù)密碼存儲(chǔ) 文件校驗(yàn)?
base64 公開(kāi)的代碼加密 url加密
101.SDWebImage原理
從內(nèi)存中(字典)找圖片(當(dāng)這個(gè)圖片在本次程序加載過(guò))沽一,找到直接使用北发;?
從沙盒中找浪讳,找到直接使用恨闪,緩存到內(nèi)存。?
從網(wǎng)絡(luò)上獲取留美,使用,緩存到內(nèi)存示括,緩存到沙盒。
102.請(qǐng)問(wèn)push view controller 和 present view controller有什么區(qū)別测砂?
要是用push view controller ,首先必須確保根視圖是NavigationController乃戈,不然是不可以用的幸海。
push與present都可以推出新的界面。?
present與dismiss對(duì)應(yīng)砌函,push和pop對(duì)應(yīng)。?
present只能逐級(jí)返回蛋褥,push所有視圖由視圖棧控制薯蝎,可以返回上一級(jí)认烁,也可以返回到根vc,其他vc冬筒。?
present一般用于不同業(yè)務(wù)界面的切換咪啡,push一般用于同一業(yè)務(wù)不同界面之間的切換耻讽。
103.麻煩你設(shè)計(jì)個(gè)簡(jiǎn)單的圖片內(nèi)存緩存器
寫(xiě)一個(gè)FIFO的存儲(chǔ)機(jī)制蜂厅,設(shè)置一定量的內(nèi)存大小。每次添加新的圖片后檢查是否超出容量薛窥,如果超出則釋放隊(duì)列最前面的圖片。
緩存機(jī)制:FIFO莹弊, 先入先出?
設(shè)置內(nèi)存:5M?
設(shè)置鍵數(shù)組:按時(shí)間先后順序把鍵添加到數(shù)組里涤久,NSMutableDictionary里按圖片的鍵存儲(chǔ)圖片數(shù)據(jù)。?
提取緩存:根據(jù)鍵去NSMutableDictionary里獲取圖片數(shù)據(jù)忍弛。?
刪除混存:緩存內(nèi)存不夠的時(shí)候响迂,取鍵數(shù)組里第一個(gè)鍵,然后依據(jù)這個(gè)鍵去刪除對(duì)應(yīng)的數(shù)據(jù)细疚,去出的鍵也從鍵數(shù)組里刪除蔗彤。
104.TCP/IP層次架構(gòu),每層的作用與協(xié)議疯兼;TCP擁塞控制然遏;滑動(dòng)窗口是怎么設(shè)計(jì)的,有什么好處
自我介紹
技術(shù):我是電子科大的一名研二學(xué)生吧彪,我很喜歡編程待侵,14年9月份開(kāi)始接觸iOS開(kāi)發(fā),15年3月到6月份在觸及科技有限公司實(shí)習(xí)姨裸,負(fù)責(zé)OS開(kāi)發(fā)秧倾。15年6月到9月份在教研室完成主尚藝術(shù)機(jī)構(gòu)聯(lián)盟這個(gè) iOS App的開(kāi)發(fā)和上線(xiàn)。
項(xiàng)目介紹
來(lái)福:來(lái)福是一款商戶(hù)信息平臺(tái)軟件傀缩,加盟了來(lái)福的商戶(hù)的各種信息會(huì)在來(lái)福中展示出來(lái)提供給消費(fèi)者那先。來(lái)福會(huì)為用戶(hù)展示一些每日推薦,商戶(hù)福利這樣的信息赡艰,查看商戶(hù)評(píng)價(jià)售淡,對(duì)商戶(hù)進(jìn)行評(píng)價(jià)和打分,按區(qū)域搜索附近商戶(hù)慷垮,也可抽取一些商戶(hù)劵揖闸,就類(lèi)似美團(tuán)一樣。
主尚藝術(shù)機(jī)構(gòu)聯(lián)盟:主尚一款藝術(shù)品租賃平臺(tái)軟件料身,藝術(shù)家上傳自己的作品楔壤,普通用戶(hù)和游客都能夠去瀏覽和查看。對(duì)藝術(shù)品都能進(jìn)行評(píng)價(jià)惯驼,滿(mǎn)意的可以選擇租賃下來(lái)蹲嚣。平臺(tái)每天展示出優(yōu)秀的作品和熱門(mén)的藝術(shù)家,提供搜索功能讓用戶(hù)按喜好去搜索作品和藝術(shù)家祟牲。
用戶(hù)類(lèi)型分三種隙畜,簽約藝術(shù)家,游客说贝,普通注冊(cè)用戶(hù)议惰。藝術(shù)家相比普通注測(cè)用戶(hù)多的一個(gè)權(quán)限就是能夠上傳作品,其他權(quán)限像發(fā)表評(píng)論乡恕,收藏作品言询,瀏覽作品俯萎,關(guān)注藝術(shù)家,租賃藝術(shù)品等權(quán)限都具備运杭。游客不需要登陸夫啊,只具備瀏覽作品和查看評(píng)論的權(quán)限。
把面試官往你準(zhǔn)備好的方向引導(dǎo)
工作套路
1.需求分析-技術(shù)選型-策略?xún)?yōu)化
2.對(duì)自己程序進(jìn)程的一個(gè)評(píng)估和要求辆憔,要知道需要做到什么程度撇眯,規(guī)模確定是多大,適用人群是哪些?
3.挑選相應(yīng)的第三方庫(kù)虱咧,看是否滿(mǎn)足要求熊榛,不滿(mǎn)足要求可以用哪些替代,是否需要進(jìn)行二次封裝?
4.策略上還需要怎樣對(duì)程序進(jìn)行優(yōu)化腕巡,例如內(nèi)存
向技術(shù)面提問(wèn)
(1) 投遞簡(jiǎn)歷的時(shí)候看到職位描述比較抽象玄坦,您能否具體描述一下,這個(gè)崗位具體需要是完成什么工作的绘沉,具體分工大概是怎樣的煎楣?比如您可以說(shuō)說(shuō)您平時(shí)的工作大致是什么呢??
(2) 您可以對(duì)我剛剛的表現(xiàn)做一個(gè)評(píng)價(jià)梆砸,指出我有哪些不足的地方嗎转质?
向HR提問(wèn)
貴公司XXX業(yè)務(wù)發(fā)展很好园欣,這是公司發(fā)展的重點(diǎn)么帖世?
怎么看待業(yè)務(wù)和技術(shù)
貴公司一般的團(tuán)隊(duì)的規(guī)模有多大,幾個(gè)人負(fù)責(zé)一個(gè)產(chǎn)品或者業(yè)務(wù)沸枯?
貴公司的開(kāi)發(fā)中是否會(huì)使用到一些最新技術(shù)日矫?
對(duì)新人有沒(méi)有什么培訓(xùn),會(huì)不會(huì)安排導(dǎo)師绑榴?
你覺(jué)得我有哪些需要提高的地方哪轿?
還有就是遇到智力題的時(shí)候,不要什么都不說(shuō)翔怎,面試官其實(shí)不是在看你的答案窃诉,而是在看你的邏輯思維,你只要說(shuō)出你自己的見(jiàn)解赤套,有一定的思考過(guò)程就行飘痛。