*面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家? 收到差不多3個(gè)offer,總結(jié)起來就是把基礎(chǔ)的東西弄好,復(fù)雜的東西了解就ok了!
*此題庫是2015-2106年北上廣深杭各大小公司面試題。
*注:如今社會(huì)還是得靠本事,面試題60分只是多了一個(gè)機(jī)會(huì),珍惜機(jī)會(huì)的同時(shí)提高自己硬實(shí)力才是真理!
1.給定一個(gè)字符串,輸出本字符串中只出現(xiàn)一次并且最靠前的那個(gè)字符的位置?比如“abaccddeeef”則是b,輸出2
答: int main()
{
char a[80] = "abaccddeeef\0";
char ch;
int i, m, b[80];
int flag = 0;
ch = getchar();//獲取一個(gè)字符
m = strlen(a);
for (i = 0; i < m; ++i){
if (a[i] == ch){//找到了猪贪,直接判斷是否相等
b[flag] = i+1;//記錄位置
flag += 1;
}
}
if (flag == 0)printf ("no");
else {
printf ("%d\n", flag);
for (i = 0; i < flag; i++){//對位置進(jìn)行輸出叽唱,用循環(huán)
printf ("%d ", b[i]);
}
printf ("\n");
}
return 0;
}
2.實(shí)現(xiàn)一個(gè)冒泡排序或者快速排序
答:冒泡排序:
intarray[5] = { 28,27,36,45,8};
for (int i = 0; i < 4; i++) {
for(int j = 0; j < 4; j++) {
if (array[j] > array [j + 1]){
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}}}
for(int i = 0; i < 5; i++) {
printf("%d\n",array[i]);}
3.請編寫一個(gè)函數(shù)用于計(jì)算階乘
答: int f(int i)
{intt=1,j;
for(j=1;j<=i;j++)
t=t*j;
return t;
}
4.Cocoa Touch提供了幾種Core
Animation過渡類?
答:Cocoa Touch提供了4種Core
Animation過渡類型耕驰,分別為:交叉淡化昧甘、推擠办桨、顯示和覆蓋觅玻。
5.iOS平臺(tái)怎么做數(shù)據(jù)的持久化?coredata和sqlite有無必然聯(lián)系?coredata是一個(gè)關(guān)系型數(shù)據(jù)嗎?
答:數(shù)據(jù)的持久化本質(zhì)上都是就是寫文件掰伸,但從邏輯上又分成很多種皱炉,比如寫入沙盒,比如存到網(wǎng)絡(luò)上狮鸭,比如寫入數(shù)據(jù)庫合搅。
core data是對sqlite的封裝,因?yàn)閟qlite是c語言的api歧蕉,然而有人也需要obj-c的api灾部,所以有了core data ,另外,core data不僅僅是把c的api翻譯成oc的api惯退,還提供了一些管理的功能赌髓,使用更加方便。
?App升級之后數(shù)據(jù)庫字段或者表有更改會(huì)導(dǎo)致crash催跪,CoreData的版本管理和數(shù)據(jù)遷移變得非常有用锁蠕,手動(dòng)寫sql語句操作還是麻煩一些。
?CoreData不光能操縱SQLite懊蒸,CoreData和iCloud的結(jié)合也很好荣倾,如果有這方面需求的話優(yōu)先考慮CoreData。
?CoreData并不是直接操縱數(shù)據(jù)庫骑丸,比如:使用CoreData時(shí)不能設(shè)置數(shù)據(jù)庫的主鍵舌仍,目前仍需要手動(dòng)操作鳖孤。
6.Object-c的類可以多重繼承么?可以實(shí)現(xiàn)多個(gè)接口么?category是什么?重寫一個(gè)類的方式用繼承好還是分類好?為什么?
答: Object-c的類不可以多重繼承;可以實(shí)現(xiàn)多個(gè)接口抡笼,通過實(shí)現(xiàn)多個(gè)接口可以完成C++的多重繼承;Category是類別黄鳍,一般情況用分類好推姻,用Category去重寫類的方法,僅對本Category有效框沟,不會(huì)影響到其他類與原有類的關(guān)系藏古。
7.#import跟#include有什么區(qū)別,@class呢?#import<>跟#import””有什么區(qū)別?
答: #import是Objective-C導(dǎo)入頭文件的關(guān)鍵字,#include是C/C++導(dǎo)入頭文件的關(guān)鍵字,使用#import頭文件會(huì)自動(dòng)只導(dǎo)入一次忍燥,不會(huì)重復(fù)導(dǎo)入拧晕,相當(dāng)于#include和#pragma once;@class告訴編譯器某個(gè)類的聲明梅垄,當(dāng)執(zhí)行時(shí)厂捞,才去查看類的實(shí)現(xiàn)文件,可以解決頭文件的相互包含队丝;#import<>用來包含系統(tǒng)的頭文件靡馁,#import””用來包含用戶頭文件。
8.屬性readwrite,readonly,assin,retain,copy,nonatomic各是什么作用,在哪種情況下用?
答: readwrite是可讀可寫特性机久;需要生成getter方法和setter方法時(shí)
readonly是只讀特性只會(huì)生成getter方法不會(huì)生成setter方法;不希望屬性在類外改變
assign是賦值特性臭墨,setter方法將傳入?yún)?shù)賦值給實(shí)例變量;僅設(shè)置變量時(shí)膘盖;
retain表示持有特性胧弛,setter方法將傳入?yún)?shù)先保留,再賦值侠畔,傳入?yún)?shù)的retaincount會(huì)+1;
copy表示拷貝特性结缚,setter方法將傳入對象復(fù)制一份;需要完全一份新的變量時(shí)践图。
nonatomic非原子操作掺冠,決定編譯器生成的setter
getter是否是原子操作,atomic表示多線程安全码党,一般使用nonatomic
9.寫一個(gè)setter方法用于完成@property(nonatomic,
retain)NSString *name;寫一個(gè)setter方法用于完成@property(nonatomic, copy)NSString *name;
答: -(void)setName:(NSString *) str
{
[str retain];
[name release];
name = str;
}
- (void)setName:(NSString *)str
{
id t = [str copy];
[name release];
name = t;? }
10.對于語句NSString *obj =
[[NSData alloc] init]; obj在編譯時(shí)和運(yùn)行時(shí)分別是什么類型的對象?
答:編譯時(shí)是NSString的類型德崭;運(yùn)行時(shí)是NSData類型的對象
11.當(dāng)前已經(jīng)編程實(shí)現(xiàn)函數(shù):int
rand100().該函數(shù)可返回0~99的隨機(jī)整數(shù),且可以保證等概率.請利用該函數(shù)實(shí)現(xiàn)int rand10000(),要求等概率返回0~9999的隨機(jī)數(shù).(不可使用其他的系統(tǒng)函數(shù))
12.湯姆現(xiàn)在要在家里舉行宴會(huì),他雖然有很多筷子,但這些筷子的長度并不完全相同,先已知每根筷子的長度,要求每位客人都能拿到兩根長度相同的筷子
,求最多可邀請的客人數(shù).
編程實(shí)現(xiàn):int getMax(int arrLength[N])
13.現(xiàn)有一個(gè)整數(shù)序列,你可以交換其中的任意兩個(gè)數(shù)以得到一個(gè)新序列.求共能得到多少種可能結(jié)果.(注意:3,3,3,3無論怎么交換,只能得到一個(gè)序列)
編程實(shí)現(xiàn):int getTotal(int arrOrigin[N])
14.現(xiàn)有一個(gè)M行N列的數(shù)組,要求安裝反向斜對角線(右上->左下)的方式,打印該數(shù)組.編程實(shí)現(xiàn):intprintMatrix[int arrMatrix[M][N]]
下面樣例的打印順序?yàn)?
0->1->4->2->5->8->3->6->9->7->10->11
123
4567
8910 11
15.在UIKit中,frame與bounds的關(guān)系是( C )
A. frame是bounds的別名
B. frame是bounds的繼承類
C. frame的參考系是父規(guī)圖坐標(biāo), bounds的參考系是自身的坐標(biāo)
D.frame的參考系是自身坐標(biāo),bounds的參考系是父規(guī)圖的坐標(biāo)
16.一個(gè)類的delegate(代理)的作用不正確的是( D )
A.delegate中的函數(shù)在其他類中實(shí)現(xiàn)
B.主要用于不同類型的對象之間一對一傳遞消息
C.沒有指派則不會(huì)觸發(fā)
D.可以一個(gè)對象的delegate指派給多個(gè)其他類型的對象
17.下面關(guān)于Objective-C內(nèi)存管理的描述錯(cuò)誤的是(A )
A.當(dāng)使用ARC來管理內(nèi)存時(shí),對象的retain,dealloc方法不會(huì)被調(diào)用
B.autoreleasepool在drain的時(shí)候會(huì)釋放在其中分配的對象
C.當(dāng)使用ARC來管理內(nèi)存時(shí),在線程中大量分配對象而不用autoreleasepool則可能會(huì)造成內(nèi)存泄露
D.在使用ARC的項(xiàng)目中不能使用NSZone
18.下面block定義正確的是( A )
A.tyoedef void(^SuccessBlock)(BOOLsuccess);
B. tyoedef void(^SuccessBlock)(NSStringvalue,BOOL success);
C. tyoedef void^(SuccessBlock)(NSStringvalue,BOOL success);
D. tyoedef void^(SuccessBlock)(NSString*value);
19.UIButton從子類到父類一次繼承自:( D )
A. UIView-> UIViewController->UIController
B. UIResponder-> UIControl-> UIView
C. UIControl-> UIResponder->UIViewController
D. UIControl-> UIView-> UIResponder
20.下列關(guān)于iOS開發(fā)中類方法的使用描述,錯(cuò)誤的是:( C )
A.類方法可以調(diào)用類方法
B.類方法不可以調(diào)用實(shí)例方法,但是類方法可以通過創(chuàng)建對象來訪問實(shí)例方法
C.類方法不可以使用實(shí)例變量,包括self(可以使用self)
D.類方法作為消息,可以被發(fā)送到類或者對象里面去
31.什么情況下使用關(guān)鍵字weak和assign有何不同?
答:assign指針賦值,不對引用計(jì)數(shù)操作,使用之后如果沒有置為nil,可能就會(huì)產(chǎn)生野指針;而weak一旦不進(jìn)行使用后,永遠(yuǎn)不會(huì)使用了,就不會(huì)產(chǎn)生野指針!
32.Object-C的類可以多重繼承么?可以實(shí)現(xiàn)多個(gè)接口么?Category是什么?重寫一個(gè)類方法的方法用繼承好還是分類好?為什么?
答: Object-c的類不可以多重繼承;可以實(shí)現(xiàn)多個(gè)接口揖盘,通過實(shí)現(xiàn)多個(gè)接口可以完成C++的多重繼承眉厨;Category是類別,一般情況用分類好兽狭,用Category去重寫類的方法憾股,僅對本Category有效鹿蜀,不會(huì)影響到其他類與原有類的關(guān)系。
32.如何用iOS設(shè)備進(jìn)行性能測試?
答: Profile-> Instruments ->Time Profiler
33.我們說的oc是動(dòng)態(tài)運(yùn)行時(shí)語音是什么意思?
答案:多態(tài)服球。主要是將數(shù)據(jù)類型的確定由編譯時(shí)茴恰,推遲到了運(yùn)行時(shí)。這個(gè)問題其實(shí)淺涉及到兩個(gè)概念斩熊,運(yùn)行時(shí)和多態(tài)往枣。簡單來說,運(yùn)行時(shí)機(jī)制使我們直到運(yùn)行時(shí)才去決定一個(gè)對象的類別粉渠,以及調(diào)用該類別對象指定方法分冈。多態(tài):不同對象以自己的方式響應(yīng)相同的消息的能力叫做多態(tài)。意思就是假設(shè)生物類(life)都用有一個(gè)相同的方法-eat;那人類屬于生物霸株,豬也屬于生物雕沉,都繼承了life后,實(shí)現(xiàn)各自的eat去件,但是調(diào)用是我們只需調(diào)用各自的eat方法坡椒。也就是不同的對象以自己的方式響應(yīng)了相同的消息(響應(yīng)了eat這個(gè)選擇器)。因此也可以說箫攀,運(yùn)行時(shí)機(jī)制是多態(tài)的基礎(chǔ)肠牲。
34.你的項(xiàng)目什么時(shí)候選擇使用GCD,什么時(shí)候選擇NSOperation?
答:項(xiàng)目中使用NSOperation的優(yōu)點(diǎn)是NSOperation是對線程的高度抽象,在項(xiàng)目中使用它靴跛,會(huì)使項(xiàng)目的程序結(jié)構(gòu)更好缀雳,子類化NSOperation的設(shè)計(jì)思路,是具有面向?qū)ο蟮膬?yōu)點(diǎn)(復(fù)用梢睛、封裝)肥印,使得實(shí)現(xiàn)是多線程支持,而接口簡單绝葡,建議在復(fù)雜項(xiàng)目中使用深碱。項(xiàng)目中使用GCD的優(yōu)點(diǎn)是GCD本身非常簡單、易用藏畅,對于不復(fù)雜的多線程操作敷硅,會(huì)節(jié)省代碼量,而Block參數(shù)的使用愉阎,會(huì)是代碼更為易讀绞蹦,建議在簡單項(xiàng)目中使用。
35.讀文件是輸入流還是輸出流?
東西讀入內(nèi)存就是輸入流東西從內(nèi)存寫到記錄存儲(chǔ)輸出流而我們本身就以記錄存儲(chǔ)為原點(diǎn)所有會(huì)有不解的感覺~java io流按照java io流的方向可以分為輸入流和輸出流輸入流是將資源數(shù)據(jù)讀入到緩沖Buffer中榜旦,輸出流是將緩沖Buffer中的數(shù)據(jù)按照指定格式寫出到一個(gè)指定的位置幽七,所以這兩個(gè)流一般同時(shí)使用,才有意義溅呢。例如你要做文件的上傳澡屡,你要先用輸入流將待上傳文件讀入緩沖猿挚,然后用輸出流將文件寫出到網(wǎng)絡(luò)服務(wù)器的一個(gè)位置,則上傳成功驶鹉;若是文件下載绩蜻,則先獲得輸入流,來讀取網(wǎng)絡(luò)服務(wù)器中的一個(gè)文件室埋,然后用輸出流寫到本地的一個(gè)文件中辜羊;還有例如文件的拷貝,也是先用輸入流讀再用輸出流寫出去的很好的例子词顾,你可以先做一個(gè)小例子試試,對你理解java io有幫助
36.簡述CALayer和UIView的關(guān)系
答:UIView和CALayer是相互依賴的關(guān)系碱妆。UIView依賴與calayer提供的內(nèi)容肉盹,CALayer依賴uivew提供的容器來顯示繪制的內(nèi)容。歸根到底CALayer是這一切的基礎(chǔ)疹尾,如果沒有CALayer上忍,UIView自身也不會(huì)存在,UIView是一個(gè)特殊的CALayer實(shí)現(xiàn)纳本,添加了響應(yīng)事件的能力窍蓝。
結(jié)論:
UIView來自CALayer,高于CALayer繁成,是CALayer高層實(shí)現(xiàn)與封裝吓笙。UIView的所有特性來源于CALayer支持。
37.聲明一個(gè)靜態(tài)方法和一個(gè)實(shí)例方法
答:先說實(shí)例方法巾腕,當(dāng)你給一個(gè)類寫一個(gè)方法面睛,如果該方法需要訪問某個(gè)實(shí)例的成員變量時(shí),那么就將該方法定義成實(shí)例方法尊搬。一類的實(shí)例通常有一些成員變量叁鉴,其中含有該實(shí)例的狀態(tài)信息。而該方法需要改變這些狀態(tài)佛寿。那么該方法需要聲明成實(shí)例方法幌墓。
靜態(tài)方法正好相反,它不需要訪問某個(gè)實(shí)例的成員變量冀泻,它不需要去改變某個(gè)實(shí)例的狀態(tài)常侣。我們把該方法定義成靜態(tài)方法。
38.常見的Object-C的數(shù)據(jù)類型有哪些?和Cd基本數(shù)據(jù)類型有什么區(qū)別?
答: object-c的數(shù)據(jù)類型有nsstring,nsnumber,nsarray,nsmutablearray,nsdata等等,這些都是class,創(chuàng)建后便是對象,而c語言的基本數(shù)據(jù)類型int,只是一定字節(jié)的內(nèi)存空間,用于存放數(shù)值;而object-c的nsnumber包含有父nsobject的方法和nsnumber自己的方法,可以完成復(fù)雜的操作腔长。
39.UIView的動(dòng)畫效果有哪些
如UIViewAnimationOptionCurveEaseInOut
UIViewAnimationOptionCurveEaseIn
UIViewAnimationOptionCurveEaseOut
UIViewAnimationOptionTransitionFlipFromLeft
UIViewAnimationOptionTransitionFlipFromRight
UIViewAnimationOptionTransitionCurlUp
UIViewAnimationOptionTransitionCurlDown
40.你了解svn,cvs等版本控制工具么?
答:了解.
41.靜態(tài)鏈接庫(了解一下)
答:靜態(tài)庫是程序代碼的集合袭祟,是共享代碼的一種方式
靜態(tài)庫是閉源的存在形式.a和.framework
連接時(shí),靜態(tài)庫會(huì)被完全的復(fù)制到可執(zhí)行文件中捞附,被多次使用就會(huì)有冗余拷貝巾乳,相當(dāng)于java里的jar包您没,把一些類編譯到一個(gè)包中,在不同的工程中如果導(dǎo)入此文件就可以使用里面的類胆绊,
42.什么是沙箱模型?哪些操作是屬于私有api范疇?
答:1氨鹏、應(yīng)用程序可以在自己的沙盒里運(yùn)作,但是不能訪問任何其他應(yīng)用程序的沙盒压状。
2仆抵、應(yīng)用程序間不能共享數(shù)據(jù)陋桂,沙盒里的文件不能被復(fù)制到其他應(yīng)用程序文件夾中,也不能把其他應(yīng)用程序文件夾中的文件復(fù)制到沙盒里诱鞠。
3、蘋果禁止任何讀尔破、寫沙盒以外的文件娱两,禁止應(yīng)用程序?qū)?nèi)容寫到沙盒以外的文件夾中莺匠。
4、沙盒根目錄里有三個(gè)文件夾:Documents十兢,一般應(yīng)該把應(yīng)用程序的數(shù)據(jù)文件存到這個(gè)文件夾里趣竣,用于存儲(chǔ)用戶數(shù)據(jù)或其他應(yīng)該定期備份的信息。Library旱物,下有兩個(gè)文件夾遥缕,Caches存儲(chǔ)應(yīng)用程序再次啟動(dòng)所需的信息,Preferences包含應(yīng)用程序偏好設(shè)置文件宵呛,不過不要在這里修改偏好設(shè)置单匣。temp,存放臨時(shí)文件宝穗,即應(yīng)用程序再次啟動(dòng)不需要的文件封孙。
沙盒根目錄里有三個(gè)文件夾分別是:documents,tmp讽营,Library虎忌。
1、Documents目錄:您應(yīng)該將所有de應(yīng)用程序數(shù)據(jù)文件寫入到這個(gè)目錄下橱鹏。這個(gè)目錄用于存儲(chǔ)用戶數(shù)據(jù)或其它應(yīng)該定期備份的信息膜蠢。
2、AppName.app目錄:這是應(yīng)用程序的程序包目錄莉兰,包含應(yīng)用程序的本身挑围。由于應(yīng)用程序必須經(jīng)過簽名,所以您在運(yùn)行時(shí)不能對這個(gè)目錄中的內(nèi)容進(jìn)行修改糖荒,否則可能會(huì)使應(yīng)用程序無法啟動(dòng)杉辙。
3、Library目錄:這個(gè)目錄下有兩個(gè)子目錄:Caches和Preferences
Preferences目錄:包含應(yīng)用程序的偏好設(shè)置文件捶朵。您不應(yīng)該直接創(chuàng)建偏好設(shè)置文件蜘矢,而是應(yīng)該使用NSUserDefaults類來取得和設(shè)置應(yīng)用程序的偏好.
Caches目錄:用于存放應(yīng)用程序?qū)S玫闹С治募衲校4鎽?yīng)用程序再次啟動(dòng)過程中需要的信息岖食。
4蔑穴、tmp目錄:這個(gè)目錄用于存放臨時(shí)文件芜茵,保存應(yīng)用程序再次啟動(dòng)過程中不需要的信息。
iOS沙盒(sandbox)中的幾個(gè)目錄獲取方式:
//獲取沙盒主目錄路徑
NSString *homeDir = NSHomeDirectory();
//獲取Documents目錄路徑
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
//獲取Caches目錄路徑
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachesDir = [paths objectAtIndex:0];
//獲取tmp目錄路徑
NSString *tmpDir =? NSTemporaryDirectory();
//獲取當(dāng)前程序包中一個(gè)圖片資源(apple.png)路徑
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"apple" ofType:@"png"];
UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];
例子:
NSFileManager* fm=[NSFileManagerdefaultManager];
if(![fm fileExistsAtPath:[selfdataFilePath]]){
//下面是對該文件進(jìn)行制定路徑的保存
[fm createDirectoryAtPath:[selfdataFilePath] withIntermediateDirectories:YES attributes:nil error:nil];
//取得一個(gè)目錄下得所有文件名
NSArray *files = [fm subpathsAtPath: [selfdataFilePath] ];
//讀取某個(gè)文件
NSData *data = [fm contentsAtPath:[selfdataFilePath]];
//或者
NSData *data = [NSDatadataWithContentOfPath:[self dataFilePath]];
}
43.協(xié)議是什么?有什么作用?
協(xié)議:聲明一系列的方法笆载,可由任何類實(shí)施,即使遵守該協(xié)議的類沒有共同的超類乱投。協(xié)議方法定義了獨(dú)立于任何特定類的行為。簡單的說限匣,協(xié)議就是定義了一個(gè)接口峦筒,其他類負(fù)責(zé)來實(shí)現(xiàn)這些接口。如果你的類實(shí)現(xiàn)了一個(gè)協(xié)議的方法時(shí)材蹬,則說該類遵循此協(xié)議。
協(xié)議的作用:
1.定義一套公用的接口(Public)
@required:必須實(shí)現(xiàn)的方法
@optional:可選實(shí)現(xiàn)的方法(可以全部都不實(shí)現(xiàn))
2.委托代理(Delegate)傳值:
它本身是一個(gè)設(shè)計(jì)模式乓旗,它的意思是委托別人去做某事。
比如:兩個(gè)類之間的傳值忌穿,類A調(diào)用類B的方法,類B在執(zhí)行過程中遇到問題通知類A红选,這時(shí)候我們需要用到代理(Delegate)明吩。
又比如:控制器(Controller)與控制器(Controller)之間的傳值间学,從C1跳轉(zhuǎn)到C2,再從C2返回到C1時(shí)需要通知C1更新UI或者是做其它的事情,這時(shí)候我們就用到了代理(Delegate)傳值窒盐。
44.你在開發(fā)大型項(xiàng)目時(shí),如何進(jìn)行內(nèi)存泄露檢測的?
可以通過xcode的自帶工具run---start with performance tool里有instruments下有個(gè)leaks工具忿磅,
啟動(dòng)此工具后术裸,運(yùn)行項(xiàng)目,工具里可以顯示內(nèi)存泄露的情況,雙擊可找到源碼位置鼻由,可以幫助進(jìn)行內(nèi)存泄露的處理仇参。
45.你實(shí)現(xiàn)過一個(gè)框架或者庫以供別人使用么?如果有,請談一談構(gòu)建框架或者庫是的經(jīng)驗(yàn);如果沒有,請?jiān)O(shè)想和設(shè)計(jì)框架的public的API,并指出大概需要如何做,需要注意一些什么方面,來方便別人容易地使用你的框架.
46.app從創(chuàng)建應(yīng)用到上架過程(appstore)
在你開始將程序提交到App Store之前诈乒,你需要有一個(gè)App ID,一個(gè)有效的發(fā)布證書,以及一個(gè)有效的Provisioning profile始藕。
在itunesconnect網(wǎng)站上,創(chuàng)建app應(yīng)用蒲稳,設(shè)置對應(yīng)信息,上傳app打包文件伍派,提交等待審核
47.用你熟悉的語音,編程實(shí)現(xiàn)Fibonacci數(shù)列:int F(intn);
Fibonacci數(shù)列遞推式F(n) = F(n-1) +F(n-2)
F(1) = 1
F(2) = 2
F(3) = 3
F(4) = 5
F(5) = 8
int F(int n){
if(n == 1){
return1;
}
return f(n-1)+f(n-2);
}
48.給定兩個(gè)排好序的數(shù)組A,B,請寫一個(gè)函數(shù),從中找出他們的公共元素:findCommon(A,
B)并列舉其他可能的查找方法,越多越好
例如:
Array A = [1, 3, 5, 6, 9]
Array B = [2, 3, 6, 8, 10]
返回結(jié)果= [3, 6]
void FindCommon(int* a, int* b, int n)
{
int i = 0;
int j = 0 ;
while(i < n && j < n){
if (a[i] < b[j])
++i ;
else if(a[i] == b[j])
{
cout << a[i] << endl ;
++i ;
++j ;
}
else// a[i] > b[j]
++j ;
}
51.KVO的實(shí)現(xiàn)原理?
答:KVO:當(dāng)指定的對象的屬性被修改了江耀,允許對象接收到通知的機(jī)制。
52.如何給一個(gè)對象的私有屬性賦值?
答:利用KVC即鍵值編碼來給對象的私有屬性賦值.
53.block的本質(zhì)是什么?為啥在block里面更改外面變量的值,要給外面的變量加_block修飾,加_block修飾的原理是什么?
答: (1) block本質(zhì)是一個(gè)數(shù)據(jù)類型,多用于參數(shù)傳遞,代替代理方法, (有多個(gè)參數(shù)需要傳遞或者多個(gè)代理方法需要實(shí)現(xiàn)還是推薦使用代理方法),少用于當(dāng)做返回值傳遞. block是一個(gè)OC對象,它的功能是保存代碼片段,預(yù)先準(zhǔn)備好代碼,并在需要的時(shí)候執(zhí)行.
(2)因?yàn)槭褂胋lock代碼塊可能會(huì)引起內(nèi)部循壞引用,所以應(yīng)在block定義前加上修飾
54.block在哪種情況下會(huì)造成循環(huán)引用,如何解決?
答:(1)從兩方面分析造成循環(huán)引用問題
當(dāng)self擁有一個(gè)block的時(shí)候诉植,在block又調(diào)用self的方法(或者self所擁有的某個(gè)屬性)祥国。形成你中有我,我中有你晾腔,這種時(shí)候會(huì)造成循環(huán)引用
把某個(gè)實(shí)例變量變成本地臨時(shí)變量,強(qiáng)引用將直接指向這個(gè)本地臨時(shí)變量,但本地臨時(shí)變量一般都會(huì)很快釋放,所以一般考慮第一種情況
(2)解決方案:對block進(jìn)行修飾__weak(arc)或__block(mrc)
55.NSURLSession在什么情況下回存在循環(huán)引用的問題,怎么解決?
答: (1)在使用NSURLSession簽訂其代理的時(shí)候會(huì)存在循環(huán)引用問題舌稀,因?yàn)槠浯硎莚etain強(qiáng)引用
(2)解決方案
(1)在下載完成后取消NSURLSession會(huì)話并釋放Session,賦值為nil灼擂。
(2)再視圖將要消失時(shí)也執(zhí)行同樣的操作壁查。為了防止沒有下載完成就跳轉(zhuǎn)控制器。
具體如下:
/**視圖將要消失的時(shí)候剔应,取消session*/
- (void)viewWillDisappear:(BOOL)animated
{
[superviewWillDisappear:animated];
//任務(wù)完成睡腿,取消NSURLSession
[self.sessioninvalidateAndCancel];
//釋放會(huì)話
self.session =nil;
}
56.如何自己實(shí)現(xiàn)GET緩存?
答:1.使用GET請求數(shù)據(jù)
2.iOS系統(tǒng)SDK已經(jīng)做好了緩存。需要的僅僅是設(shè)置下內(nèi)存緩存大小峻贮、磁盤緩存大小席怪、以及緩存路徑,代碼如下
NSURLCache *urlCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil];
[NSURLCache setSharedURLCache:urlCache];
57.在使用SQLite過程中,如果多條線程同時(shí)操作同一數(shù)據(jù)庫會(huì)造成什么問題,怎么解決?
答:(1)容易造成系統(tǒng)崩潰
(2)解決方案:開啟第3種串行模式,使用一個(gè)類(單例方式)操作數(shù)據(jù)庫月洛。
58.如果提交一個(gè)Json格式的數(shù)據(jù)給后臺(tái)服務(wù)器,后臺(tái)服務(wù)器返回的是一段普通文字,用NSURLConnection/NSURLSession/AFN分別如何實(shí)現(xiàn)?
答:1.使用NSURLConnection發(fā)送請求的步驟很簡單
(1)創(chuàng)建一個(gè)NSURL對象何恶,設(shè)置請求路徑(設(shè)置請求路徑)
(2)傳入NSURL創(chuàng)建一個(gè)NSURLRequest對象孽锥,設(shè)置請求頭和請求體(創(chuàng)建請求對象)
(3)使用NSURLConnection發(fā)送NSURLRequest(發(fā)送請求)
2.使用NSURLSession發(fā)送請求的步驟很簡單
1)確定請求路徑(一般由公司的后臺(tái)開發(fā)人員以接口文檔的方式提供)嚼黔,GET請求參數(shù)直接跟在URL后面
2)創(chuàng)建請求對象(默認(rèn)包含了請求頭和請求方法【GET】)细层,此步驟可以省略
3)創(chuàng)建會(huì)話對象(NSURLSession)
4)根據(jù)會(huì)話對象創(chuàng)建請求任務(wù)(NSURLSessionDataTask)
5)執(zhí)行Task
6)當(dāng)?shù)玫椒?wù)器返回的響應(yīng)后,解析數(shù)據(jù)(XML|JSON|HTTP)
59.請描述一下SDWebImage內(nèi)部實(shí)現(xiàn)的原理
答:SDWebImage底層實(shí)現(xiàn)有沙盒緩存機(jī)制唬涧,主要由三塊組成
1疫赎、內(nèi)存圖片緩存
2、內(nèi)存操作緩存
3碎节、磁盤沙盒緩存
60.你對runtime都有哪些了解,你在實(shí)現(xiàn)開發(fā)過程中,或是你在所使用的第三方框架中,有沒有使用過runtime的,如果有,請你描述一下其內(nèi)部實(shí)現(xiàn)機(jī)制
答:Runtime:runtime是一套比較底層的純C語言API,屬于1個(gè)C語言庫,包含了很多底層的C語言API捧搞。在我們平時(shí)編寫的OC代碼中,程序運(yùn)行過程時(shí),其實(shí)最終都是轉(zhuǎn)成了runtime的C語言代碼, runtime算是OC的幕后工作者.
(http://www.w2bc.com/article/126999網(wǎng)址中搜索:其實(shí)最終都是轉(zhuǎn)成了runtime的C語言代碼)
61.線程間怎么通信?
(1)GCD:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
//下載圖片
UIImage *image = nil;
dispatch_async(dispatch_get_main_queue(),^{
//回到主線程
});
(2)NSThread的線程通信
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
//下載圖片
UIImage *image = nil;
[selfperformSelector:@selector(settingImage:) onThread:[NSThread mainThread]withObject:image waitUntilDone:YES modes:nil];
}
這種情況也適用于子線程之間的通信。
62.網(wǎng)絡(luò)圖片處理問題中怎么解決一個(gè)相同的網(wǎng)絡(luò)地址重復(fù)請求的問題?
答案:利用字典圖片地址為key狮荔,下載操作為value
63.自動(dòng)釋放池底層怎么實(shí)現(xiàn)?
答:自動(dòng)釋放池以棧的形式實(shí)現(xiàn):當(dāng)你創(chuàng)建一個(gè)新的自動(dòng)釋放池時(shí),它將被添加到棧頂.當(dāng)一個(gè)對象收到發(fā)送autorelease消息時(shí),他被添加到當(dāng)前線程的處于棧頂?shù)淖詣?dòng)釋放池中,當(dāng)自動(dòng)釋放池被回收時(shí),他們從棧中被刪除,并且會(huì)給池子里面所有的對象都會(huì)做一次release操作
64.不用中間變量,用兩種方法交換A和B的值
A = A+B;
B = A - B;
A = A - B;
65.簡單描述一下客戶端的緩存機(jī)制?
答案:無法簡述,詳細(xì)了解下,明白了夠裝逼就好http://www.cnblogs.com/wendingding/p/3950198.html
66.控制器View的生命周期及相關(guān)函數(shù)是什么?你在開發(fā)中是如何用的?
>1.在視圖顯示之前調(diào)用viewWillAppear;該函數(shù)可以調(diào)用多次;
>2.視圖顯示完畢,調(diào)用viewDidAppear;
>3.在視圖消失之前調(diào)用viewWillDisAppear;該函數(shù)可以調(diào)用多次(如需要);
>4.在布局變化前后,調(diào)用viewWill/DidLayoutSubviews處理相關(guān)信息;
67.NSRunLoop的實(shí)現(xiàn)機(jī)制,及在多線程中如何使用?
答案:NSRunLoop是iOS的消息機(jī)制的處理模式
>1NSRunloop的主要作用:控制runloop里面線程的執(zhí)行和休眠,在有事情做的時(shí)候使擋墻NSRunloop控制的線程工作,沒有事情做讓當(dāng)前runloop的控制線程休眠.
>2.runloop就是一直在循環(huán)檢測,從線程start到線程end,檢測inputsourse(如點(diǎn)擊,雙擊等操作)異步時(shí)間,檢測timesourse同步事件,見到檢測到輸入源會(huì)執(zhí)行處理函數(shù)胎撇,首先會(huì)產(chǎn)生通知,corefunction向線程添加runloop observers來監(jiān)聽事件殖氏,意在監(jiān)聽事件發(fā)生時(shí)來做處理晚树。
>3.runloopmode是一個(gè)集合,包括監(jiān)聽:事件源雅采,定時(shí)器爵憎,以及需通知的runloop observers
>1.只有在為你的程序創(chuàng)建次線程的時(shí)候,才需要運(yùn)行run loop婚瓜。對于程序的主線程而言宝鼓,run loop是關(guān)鍵部分。Cocoa提供了運(yùn)行主線程run loop的代碼同時(shí)也會(huì)自動(dòng)運(yùn)行run loop巴刻。IOS程序UIApplication中的run方法在程序正常啟動(dòng)的時(shí)候就會(huì)啟動(dòng)run loop愚铡。如果你使用xcode提供的模板創(chuàng)建的程序,那你永遠(yuǎn)不需要自己去啟動(dòng)run loop
>2.在多線程中胡陪,你需要判斷是否需要run loop茂附。如果需要run loop,那么你要負(fù)責(zé)配置run loop并啟動(dòng)督弓。你不需要在任何情況下都去啟動(dòng)run loop营曼。比如,你使用線程去處理一個(gè)預(yù)先定義好的耗時(shí)極長的任務(wù)時(shí)愚隧,你就可以毋需啟動(dòng)run loop蒂阱。Run loop只在你要和線程有交互時(shí)才需要
68.簡單說一下APP的啟動(dòng)過程,從main文件開始說起
進(jìn)入main函數(shù),在main.m的main函數(shù)中執(zhí)行了UIApplicationMain這個(gè)方法狂塘,這是ios程序的入口點(diǎn)!
int UIApplicationMain(int argc, char argv[], NSString principalClassName, NSString *delegateClassName)
argc录煤、argv:ISO C標(biāo)準(zhǔn)main函數(shù)的參數(shù),直接傳遞給UIApplicationMain進(jìn)行相關(guān)處理即可
principalClassName:指定應(yīng)用程序類荞胡,該類必須是UIApplication(或子類)妈踊。如果為nil,則用UIApplication類作為默認(rèn)值
delegateClassName:指定應(yīng)用程序類的代理類,該類必須遵守UIApplicationDelegate協(xié)議
此函數(shù)會(huì)根據(jù)principalClassName創(chuàng)建UIApplication對象泪漂,根據(jù)delegateClassName創(chuàng)建一個(gè)delegate對象廊营,并將該delegate對象賦值給UIApplication對象中的delegate屬性
lUIApplication對象會(huì)依次給delegate對象發(fā)送不同的消息歪泳,接著會(huì)建立應(yīng)用程序的main runloop(事件循環(huán)),進(jìn)行事件的處理(首先會(huì)調(diào)用delegate對象的application:didFinishLaunchingWithOptions:)
程序正常退出時(shí)這個(gè)函數(shù)才返回露筒。如果進(jìn)程要被系統(tǒng)強(qiáng)制殺死呐伞,一般這個(gè)函數(shù)還沒來得及返回進(jìn)程就終止了
69.第三方API你是怎么用的?
cocoa pod導(dǎo)入
70.用預(yù)處理指令#define聲明一個(gè)常數(shù),用以表明一年中有多少秒?(忽略閏年問題)
答:#define second 365*24*60*60
91.UITableView需要實(shí)現(xiàn)哪些代理?列出UITableView代理中必須實(shí)現(xiàn)的與其他一些常用的函數(shù).
答:
-( NSInteger )tableView:( UITableView *)tableViewnumberOfRowsInSection:( NSInteger)section;
一組有多少行
-( UITableViewCell *)tableView:( UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath;
每行中的cell的實(shí)現(xiàn)以上兩個(gè)方法為必須要實(shí)現(xiàn)的
常用的有
- ( void )tableView:( UITableView *)tableViewdidSelectRowAtIndexPath:( NSIndexPath*)indexPath
選中以后事件設(shè)置
-( CGFloat )tableView:( UITableView *)tableViewheightForRowAtIndexPath:( NSIndexPath*)indexPath
設(shè)置cell的高度
等等。慎式。伶氢。。瘪吏。
92.在iOS上開發(fā)一個(gè)應(yīng)用程序時(shí)怎么做的?
答:首先癣防,要有一個(gè)MAC系統(tǒng)(買一臺(tái)蘋果電腦,蘋果本或者M(jìn)ACmini)掌眠,沒有這個(gè)條件可以裝一個(gè)黑蘋果的mac系統(tǒng)或者裝一個(gè)虛擬機(jī)劣砍。然后裝一個(gè)X-CODE開發(fā)環(huán)境。要是學(xué)習(xí)ios開發(fā)的話扇救,這些就可以了刑枝。如果要開發(fā)、上線的話迅腔,就得準(zhǔn)備iphone/ipod装畅、ipad做為測試機(jī),到蘋果申請一個(gè)開發(fā)者賬號沧烈,每年的年費(fèi)99美元掠兄。再然后接著就可以開發(fā)你的程序了,開發(fā)完畢之后锌雀,發(fā)布到App store上面蚂夕,通過審核就可以了。
*93.C++和Objective-C的混合使用,以下描述錯(cuò)誤的是()
//未找到答案或是C++JAVA
A. cpp文件只能使用C/C++代碼
B. cpp文件include的頭文件中,可以出現(xiàn)objective-C的代碼
C. mm文件中混用cpp直接使用即可
D. cpp使用objective-C的關(guān)鍵是使用接口,而不能直接使用代碼
*94.以下哪一段代碼不會(huì)拋出異常( C& D )
A. NSArray *array = @[1, 2, 3];NSNumber*number = array[3];// @[@1,@ 2,@ 3]
B. NSDictionary *dict = @{@”key”:
nil};//value不能為空
C. NSString *str = nil; NSString *str2 =[str substringFromIndex:3];
D. NSString *str = @”hi”;NSString *str2 =[str substringFromIndex:3];
*95.在沒有navigationController的情況下,要從一個(gè)ViewController切換到另一個(gè)ViewController應(yīng)該()
A.{self.navigationControllerpushViewController:nextViewController animated:YES};
B.{self .viewaddSubview:nextViewController}
C. {selfpresentModalViewController:nextViewController animated:YES};
D. {selfpushViewController:nextViewController animated:YES};
分析:A腋逆、C都需要有navigationController,B一個(gè)控制器的view是無法加載另一個(gè)控制器的view的婿牍,所以選C!
*96.關(guān)于下面線程管理錯(cuò)誤的是()
//不確定
A.GCD在后端管理著一個(gè)線程池
B.NSOperationQueue是對NSthread的更高層的封裝,對
C.NSThread需要自己管理線程的生命周期
D.GCD可以根據(jù)不同優(yōu)先級分配線程,對
*97.iOS中的數(shù)據(jù)持久化方式(D)
A.屬性列表
B.對象歸檔
C.SQLite和CoreData
D.以上全部+對象歸檔
98.設(shè)有一下宏定義:
#defineN4
#defineY(n)((N + 1) * n)
則執(zhí)行語句: Y(5 + 1)為:(26)
99.如下程序用于把"blue"字符串返回,請指出其中的錯(cuò)誤.
//不確定
char *GetBlue()
{
char *pcColor;
char*pcNewColor;
pcColor = “blue”;
pcNewColor =(char*)malloc(strlen(pcColor));
strcpy(pcNewColor, pcColor);
return pcNewColor;
}
答:strcpy是一個(gè)字符串拷貝的函數(shù),它的函數(shù)原型為strcpy(char *dst, c*****t char *src);將src開始的一段字符串拷貝到dst開始的內(nèi)存中去,結(jié)束的標(biāo)志符號為'\0',由于拷貝的長度不是由我們控制的,所以這個(gè)字符串拷貝很容易出錯(cuò)
100.常見的object-c的數(shù)據(jù)類型有哪些,和C的基本數(shù)據(jù)類型有什么區(qū)別?如:NSInteger和int
答:object的數(shù)據(jù)類型由NSString,NSNumber,NSArray,NSMutableArray,NSData等等惩歉,這些都是class等脂,創(chuàng)建后便是對象,而C語言的基本數(shù)據(jù)類型int撑蚌,只是一定字節(jié)的內(nèi)存空間上遥,用于存放數(shù)值,NSInteger是基本的數(shù)據(jù)類型争涌,并不是NSNumber的子類粉楚,當(dāng)然也不是NSObject的子類。NSInteger是基本數(shù)據(jù)類型int或者Long的別名(NSInteger的定義typedef long NSInteger)它的區(qū)別在于,NSInteger會(huì)根據(jù)系統(tǒng)是32位還是64位來決定是本身int還是long.
101.iOS有垃圾回收機(jī)制嗎?它是以怎樣的機(jī)制來工作的?
答: OC是支持垃圾回收機(jī)制的(Garbage collection簡稱GC),但是apple的移動(dòng)終端中,是不支持GC的,Mac桌面系統(tǒng)開發(fā)中是支持的.
移動(dòng)終端開發(fā)是支持ARC(Automatic
Reference Counting的簡稱),ARC是在IOS5之后推出的新技術(shù),它與GC的機(jī)制是不同的模软。我們在編寫代碼時(shí),不需要向?qū)ο蟀l(fā)送release或者autorelease方法,也不可以調(diào)用delloc方法,編譯器會(huì)在合適的位置自動(dòng)給用戶生成release消息(autorelease),ARC的特點(diǎn)是自動(dòng)引用技術(shù)簡化了內(nèi)存管理的難度.
102.請使用gcd完成如下任務(wù),執(zhí)行并發(fā)任務(wù)task1,task1完成后update UI.
答:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
//task1:
NSLog(@"執(zhí)行task1");
//更新UI
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"更新UI");
});
});
103.為什么在主線程中更新UI?子線程中想要更新UI怎么做?
答:(1)在子線程中不能更新UI伟骨,除了極少數(shù)UI外,其他UI更新要等到子線程執(zhí)行完畢后回到主線程中進(jìn)行更新撵摆。如果子線程一直在運(yùn)行,則子線程中UI更新的函數(shù)棧主線程無法得知害晦,即UI無法更新特铝;
(2)回到主線程中進(jìn)行UI更新;
104.簡述通過Storyboard實(shí)現(xiàn)一個(gè)tableView
(自定義cell的關(guān)鍵步驟).
答:首先創(chuàng)建自己的自定義cell的類壹瘟,我們叫做CustomCell鲫剿,要繼承于UITableViewCell。在這個(gè)類中定義自己所需要的控件稻轨。
然后灵莲,打開storyboard,選擇自己要添加自定義cell的UIViewController殴俱,我們叫它為ViewController政冻。在UITableView里面添加一個(gè)cell(或者修改原有的cell)。將cell的style改為custom线欲,將cell的類改為CustomCell明场,將identifier改為CustomCellIdentifier。然后李丰,可以在cell中添加控件苦锨,將控件和剛才在CustomCell中定義的控件連起來。
最后趴泌,在ViewController的UITableView的tableView:cellForRowAtIndexPath:代理方法中添加以下代碼:
[plain]
CustomCell*cell=[tableViewdequeueReusableCellWithIdentifier:@"CustomCellIdentifier"];
這樣舟舒,就創(chuàng)建了一個(gè)cell紧帕,可以在這句代碼之后對自己添加的控件進(jìn)行設(shè)置马篮。
105.如何生成同時(shí)支持多個(gè)架構(gòu)(simulator,arm7,arm64)的通用靜態(tài)庫?
答:ValidArchitectures設(shè)置為:armv7|armv7s|arm64|i386|x86_64;
Architectures設(shè)置不變(或根據(jù)你需要):armv7|arm64围辙;
然后分別選擇iOS設(shè)備和模擬器進(jìn)行編譯吉捶,最后找到相關(guān)的.a進(jìn)行合包莺治,使用lipo -create真機(jī)庫.a的路徑模擬器庫.a的的路徑-output合成庫的名字.a;
這樣就制作了一個(gè)通用的靜態(tài)庫.a帚稠;
106.請寫出一個(gè)xml文件,用于描述一個(gè)書架,書架上有2本書,書本的類別(category)分別是cooking,children.要求tag中包含書名(title),作者(author).類別(category)要用屬性表示.
答:
書名1<\title>
作者1<\author>
<\book>
書名2<\title>
作者2<\author>
<\book>
107.strcpy和memcpy的最大區(qū)別是什么?
答:1谣旁、復(fù)制的內(nèi)容不同。strcpy只能復(fù)制字符串滋早,而memcpy可以復(fù)制任意內(nèi)容榄审,例如字符數(shù)組、整型杆麸、結(jié)構(gòu)體搁进、類等浪感。
2、復(fù)制的方法不同饼问。strcpy不需要指定長度影兽,它遇到被復(fù)制字符的串結(jié)束符"\0"才結(jié)束,所以容易溢出莱革。memcpy則是根據(jù)其第
3個(gè)參數(shù)決定復(fù)制的長度峻堰。
3、用途不同盅视。通常在復(fù)制字符串時(shí)用strcpy捐名,而需要復(fù)制其他類型數(shù)據(jù)時(shí)則一般用memcpy
108.g++, ld是什么?聲明編譯選項(xiàng)–DSUPPORT_BLUETOOTH =
1有什么作用?
答: g++是GNU的c++編譯器;
109.@class用途
答:@class一般用于頭文件中聲明某個(gè)類的實(shí)例變量的時(shí)候用到.它只是聲明,至于內(nèi)部的實(shí)現(xiàn)是沒有告訴編譯器的.
110.delegate使用assign or retain簡述理由.
答:assign,防止出現(xiàn)循環(huán)引用闹击;
111.NSString與NSData之間的轉(zhuǎn)換過程中要特別注意的事項(xiàng)是什么?
解:NSString轉(zhuǎn)換成NSData對象
NSData* xmlData = [@"testdata"dataUsingEncoding:NSUTF8StringEncoding];
NSData轉(zhuǎn)換成NSString對象
NSData * data;
NSString *result = [[NSString alloc] initWithData:data? encoding:NSUTF8StringEncoding];
NSData轉(zhuǎn)換成char*
NSData *data;
char *test=[data bytes];
char*轉(zhuǎn)換成NSData對象
byte* tempData = malloc(sizeof(byte)*16);
NSData *content=[NSData dataWithBytes:tempData length:16];
轉(zhuǎn)換過程中要注意NSData的編碼格式問題.
解決方法:
先設(shè)置斷點(diǎn)然后在控制臺(tái)po出NSData的變量镶蹋,看看會(huì)顯示什么。
如果po出的NSData是可閱讀的赏半,直接能看到文本的內(nèi)容贺归,則使用[NSString stringWithFormat:NSData] (這里的NSData指的是你需要轉(zhuǎn)換成NSString的NSData變量)即可。
如果po出的NSData是不可閱讀的亂碼断箫,那一般都是有編碼格式的牧氮,最常用的是NSUTF8StringEncoding,另外還有NSASCIIStringEncoding等瑰枫,你可以在Apple文檔里找到編碼格式的那個(gè)枚舉類型踱葛,挨個(gè)嘗試。
112.請用代碼如何判斷某個(gè)對象obj是否支持某個(gè)method.
解:if ([srespondsToSelector:@selector(print:)]) {
[s print:@"支持這個(gè)方法"];
}
113.請用簡單的代碼展示@protocol的定義及實(shí)現(xiàn).
解: #warning代理第一步:聲明協(xié)議
@protocol MarryMe
-(void)makeMoney;
@end
#warning代理第二步:聲明代理
@property(nonatomic,assign)id myDeleget;
.m文件中
#warning代理第三步:代理人執(zhí)行協(xié)議方法
[self.myDeleget makeMoney];
代理人.m文件中
#warning代理第四步:簽訂協(xié)議
@interface Boy : NSObject
Girl *girl = [[Girl alloc] init];
#warning代理第五步:成為代理人
girl.myDeleget = self;
[girl getMessage:message];
#warning協(xié)議代理第六步:實(shí)現(xiàn)協(xié)議方法
-(void)makeMoney{
NSLog(@"aaa");
}
/*不是iOS的題*/114.請講述Indesign中主頁作用
115.請描述應(yīng)聘崗位的未來職業(yè)規(guī)劃
解:答案不唯一,如有需要請自行規(guī)劃活著百度.
116.3升的杯子一個(gè),5升的杯子一個(gè),杯子的形狀不規(guī)則,問怎么才能得到4升的水,水無限多.(請寫出推理過程)
解:先將5升的杯子倒?jié)M,然后把5升的杯子中的水倒入3升的杯子,倒?jié)M后5升的杯子剩下2升.再把3升杯子中的水倒掉,把5升的杯子中剩余的2升水倒入3升的杯子中,然后把5升的杯子倒?jié)M.再用5升的杯子中的水給3升的杯子添滿,則5升的杯子中剩余4升的水.
117.數(shù)據(jù)持久化存儲(chǔ)方案有哪些光坝?
解:所謂的持久化尸诽,就是將數(shù)據(jù)保存到硬盤中,使得在應(yīng)用程序或機(jī)器重啟后可以繼續(xù)訪問之前保存的數(shù)據(jù)盯另。在iOS開發(fā)中性含,數(shù)據(jù)持久化的方案有5種方案:
plist文件(屬性列表)
preference(偏好設(shè)置)
NSKeyedArchiver(歸檔)
SQLite 3
CoreData
118.網(wǎng)絡(luò)通信用過哪些方式?
解: ios設(shè)備的網(wǎng)絡(luò)通信的方法鸳惯,有如下兩個(gè)大類:
1商蕴、使用socket的方式進(jìn)行通信。
2芝发、使用asynsocket類庫進(jìn)行通信绪商。
119.如何處理多個(gè)網(wǎng)絡(luò)請求并發(fā)的情況?
解: //了解(并發(fā))當(dāng)有多個(gè)線程在操作時(shí),如果系統(tǒng)只有一個(gè)CPU,則它根本不可能真正同時(shí)進(jìn)行一個(gè)以上的線程辅鲸,它只能把CPU運(yùn)行時(shí)間劃分成若干個(gè)時(shí)間段,再將時(shí)間段分配給各個(gè)線程執(zhí)行格郁,在一個(gè)時(shí)間段的線程代碼運(yùn)行時(shí),其它線程處于掛起狀。.這種方式我們稱之為并發(fā)(Concurrent)例书。
遇到這種情況建議使用第三方的網(wǎng)絡(luò)庫锣尉。比如AFNetworking。也可以通過GCD和NSOperationQueue來控制并發(fā)
120.簡單介紹一下KVC和KVO决采,他們都可以應(yīng)用在哪些場景自沧?
解: KVO:鍵值監(jiān)聽,觀察某一屬性的方法
KVC:鍵值編碼,是一種間接訪問對象的屬性
121.講述一下runtime的概念,message
send如果尋找不到響應(yīng)的對象树瞭,會(huì)如何拇厢?
Objc Runtime其實(shí)是一個(gè)Runtime庫,它基本上是用C和匯編寫的移迫,這個(gè)庫使得C語言有了面向?qū)ο蟮哪芰Α?/p>
122. iOS能否嵌入其他語言?如何實(shí)現(xiàn)?
不會(huì)!!!!!
123. iOS移動(dòng)開發(fā)最終生成的是什么文件?其結(jié)構(gòu)如何?
最后打包完成是一個(gè).ipa文件可以通過iTunes和其他工具對有測試資格的手機(jī)進(jìn)行安裝
124. UINavigationController如何要使用push/pop功能的話,需要怎么實(shí)現(xiàn)
1.用UINavigationController的時(shí)候用pushViewController:animated
----返回之前的視圖[[selfnavigationController] popViewControllerAnimated:YES];
---ps:push以后會(huì)在navigation的left bar自動(dòng)添加back按鈕旺嬉,它的響應(yīng)方法就是返回管行。所以一般不需要寫返回方法厨埋,點(diǎn)back按鈕即可。
2.其他時(shí)候用presentModalViewController:animated
[selfpresentModalViewController:controller animated:YES];//YES有動(dòng)畫效果
-----返回之前的視圖[selfdismissModalViewControllerAnimated:YES];
3.切換視圖一般用不到addSubview
UINavigationController是導(dǎo)航控制器捐顷,如果pushViewController的話荡陷,會(huì)跳轉(zhuǎn)到下一個(gè)ViewController,點(diǎn)返回會(huì)回到現(xiàn)在這個(gè)ViewController迅涮;
如果是addSubview的話废赞,其實(shí)還是對當(dāng)前的ViewController操作,只是在當(dāng)前視圖上面又“蓋”住了一層視圖叮姑,其實(shí)原來的畫面在下面呢唉地,看不到而已。
125. UIView如何需要重新繪制整個(gè)界面,需要調(diào)用什么方法?
UIView setNeedsDisplay和setNeedsLayout方法传透。首先兩個(gè)方法都是異步執(zhí)行的耘沼。而setNeedsDisplay會(huì)調(diào)用自動(dòng)調(diào)用drawRect方法,這樣可以拿到UIGraphicsGetCurrentContext朱盐,就可以畫畫了群嗤。而setNeedsLayout會(huì)默認(rèn)調(diào)用layoutSubViews,就可以處理子視圖中的一些數(shù)據(jù)兵琳。
綜上所述:setNeedsDisplay方便繪圖狂秘,而layoutSubViews方便出來數(shù)據(jù)
setNeedDisplay告知視圖它發(fā)生了改變,需要重新繪制自身躯肌,就相當(dāng)于刷新界面.
126. Plist文件?結(jié)構(gòu)是?
Plist文件通常用于儲(chǔ)存用戶設(shè)置者春,也可以用于存儲(chǔ)捆綁的信息,該功能在舊式的Mac OS中是由資源分支提供的清女。
Plist主要有Core Fundation類型構(gòu)成,也可以將這些類型放入NSDictionary和NSArray以便后塍更復(fù)雜的數(shù)據(jù)類型
127. iOS里面的二進(jìn)制數(shù)據(jù)類型是什么?和NSString如何互相轉(zhuǎn)換?
NSData:用于存儲(chǔ)二進(jìn)制的數(shù)據(jù)類型
NSData類提供了一種簡單的方式碧查,它用來設(shè)置緩沖區(qū)、將文件的內(nèi)容讀入緩沖區(qū),或?qū)⒕彌_區(qū)的內(nèi)容寫到一個(gè)文件忠售。
不變緩沖區(qū)(NSData類)传惠,也可定義可變的緩沖區(qū)(NSMutableData類)。
NSData稻扬、NSString互轉(zhuǎn):
NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding];
//NSString轉(zhuǎn)換成NSData類型
NSString * newStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
128. iOS里面是否有GBK的字符編碼描述?即NSUTF8StringEncoding如果有,是怎樣的?
不會(huì)
129. iOS里面的手勢是如何實(shí)現(xiàn)的?
130.談?wù)勀懔私獾脑O(shè)計(jì)模式,你用過哪些,他們的缺點(diǎn)
1.MVC:優(yōu)點(diǎn):
1卦方、開發(fā)人員可以只關(guān)注整個(gè)結(jié)構(gòu)中的其中某一層;
2泰佳、可以很容易的用新的實(shí)現(xiàn)來替換原有層次的實(shí)現(xiàn)盼砍;
3、可以降低層與層之間的依賴逝她;
4浇坐、有利于標(biāo)準(zhǔn)化;
5黔宛、利于各層邏輯的復(fù)用近刘。
缺點(diǎn):
1、降低了系統(tǒng)的性能臀晃。這是不言而喻的觉渴。如果不采用分層式結(jié)構(gòu),很多業(yè)務(wù)可以直接造訪數(shù)據(jù)庫徽惋,以此獲取相應(yīng)的數(shù)據(jù)案淋,如今卻必須通過中間層來完成。
2险绘、有時(shí)會(huì)導(dǎo)致級聯(lián)的修改踢京。這種修改尤其體現(xiàn)在自上而下的方向。如果在表示層中需要增加一個(gè)功能宦棺,為保證其設(shè)計(jì)符合分層式結(jié)構(gòu)瓣距,可能需要在相應(yīng)的業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層中都增加相應(yīng)的代碼。
2.觀察者模式優(yōu)點(diǎn):
1渺氧、觀察者模式在被觀察者和觀察者之間建立一個(gè)抽象的耦合旨涝。被觀察者角色所知道的只是一個(gè)具體觀察者列表,每一個(gè)具體觀察者都符合一個(gè)抽象觀察者的接口侣背。被觀察者并不認(rèn)識任何一個(gè)具體觀察者白华,它只知道它們都有一個(gè)共同的接口。
由于被觀察者和觀察者沒有緊密地耦合在一起贩耐,因此它們可以屬于不同的抽象化層次弧腥。如果被觀察者和觀察者都被扔到一起,那么這個(gè)對象必然跨越抽象化和具體化層次潮太。
2管搪、觀察者模式支持廣播通訊虾攻。被觀察者會(huì)向所有的登記過的觀察者發(fā)出通知,
觀察者模式缺點(diǎn):
1更鲁、如果一個(gè)被觀察者對象有很多的直接和間接的觀察者的話霎箍,將所有的觀察者都通知到會(huì)花費(fèi)很多時(shí)間。
2澡为、如果在被觀察者之間有循環(huán)依賴的話漂坏,被觀察者會(huì)觸發(fā)它們之間進(jìn)行循環(huán)調(diào)用,導(dǎo)致系統(tǒng)崩潰媒至。在使用觀察者模式是要特別注意這一點(diǎn)顶别。
3、如果對觀察者的通知是通過另外的線程進(jìn)行異步投遞的話拒啰,系統(tǒng)必須保證投遞是以自恰的方式進(jìn)行的驯绎。
4、雖然觀察者模式可以隨時(shí)使觀察者知道所觀察的對象發(fā)生了變化谋旦,但是觀察者模式?jīng)]有相應(yīng)的機(jī)制使觀察者知道所觀察的對象是怎么發(fā)生變化的剩失。
3.單例模式:主要優(yōu)點(diǎn):
1、提供了對唯一實(shí)例的受控訪問蛤织。
2赴叹、由于在系統(tǒng)內(nèi)存中只存在一個(gè)對象鸿染,因此可以節(jié)約系統(tǒng)資源指蚜,對于一些需要頻繁創(chuàng)建和銷毀的對象單例模式無疑可以提高系統(tǒng)的性能。
3涨椒、允許可變數(shù)目的實(shí)例摊鸡。
3.單例模式:主要缺點(diǎn):
1、由于單利模式中沒有抽象層蚕冬,因此單例類的擴(kuò)展有很大的困難免猾。
2、單例類的職責(zé)過重囤热,在一定程度上違背了“單一職責(zé)原則”猎提。
3、濫用單例將帶來一些負(fù)面問題旁蔼,如為了節(jié)省資源將數(shù)據(jù)庫連接池對象設(shè)計(jì)為的單例類锨苏,可能會(huì)導(dǎo)致共享連接池對象的程序過多而出現(xiàn)連接池溢出;如果實(shí)例化的對象長時(shí)間不被利用棺聊,系統(tǒng)會(huì)認(rèn)為是垃圾而被回收伞租,這將導(dǎo)致對象狀態(tài)的丟失.
131.數(shù)據(jù)持久化存儲(chǔ)方案有哪些?
答:
(附網(wǎng)址:http://www.cocoachina.com/industry/20130328/5908.html)
iOS中的數(shù)據(jù)持久化方式,基本上有以下四種:屬性列表限佩、對象歸檔葵诈、SQLite3和Core Data
1.屬性列表(NSUserDefaults裸弦,用于存儲(chǔ)配置信息)
涉及到的主要類:NSUserDefaults,一般[NSUserDefaults standardUserDefaults]就夠用了
2.對象歸檔
要使用對象歸檔,對象必須實(shí)現(xiàn)NSCoding協(xié)議.大部分Object C對象都符合NSCoding協(xié)議,也可以在自定義對象中實(shí)現(xiàn)NSCoding協(xié)議,要實(shí)現(xiàn)NSCoding協(xié)議,實(shí)現(xiàn)兩個(gè)方法
3.SQLite3
SQLite的數(shù)據(jù)庫權(quán)限只依賴于文件系統(tǒng),沒有用戶帳戶的概念作喘。SQLite有數(shù)據(jù)庫級鎖定理疙,沒有網(wǎng)絡(luò)服務(wù)器。它需要的內(nèi)存泞坦,其它開銷很小沪斟,適合用于嵌入式設(shè)備。你需要做的僅僅是把它正確的編譯到你的程序暇矫。
4.Core Data
Core Data本質(zhì)上是使用SQLite保存數(shù)據(jù)主之,但是它不需要編寫任何SQL語句。
要使用Core Data李根,需要在Xcode中的數(shù)據(jù)模型編輯器中設(shè)計(jì)好各個(gè)實(shí)體以及定義好他們的屬性和關(guān)系槽奕。之后,通過操作這些對象房轿,結(jié)合Core Data完成數(shù)據(jù)的持久化:
132.網(wǎng)絡(luò)通信用過哪些方式?
(附網(wǎng)址:http://blog.csdn.net/chang6520/article/details/7967698)
同樣也是代碼解釋
iOS設(shè)備的網(wǎng)絡(luò)通信的方法粤攒,有如下兩個(gè)大類:
1、使用socket的方式進(jìn)行通信囱持。
以TCP為利夯接,對于TCP來說,是要區(qū)分服務(wù)端和客戶端的纷妆。服務(wù)端:通常的方法是服務(wù)端啟動(dòng)后監(jiān)聽盔几,是否有客戶端連接,如果有連接掩幢,則建立與客戶端的通信逊拍。客戶端的方法通常是連接服務(wù)端际邻,當(dāng)連接成功之后芯丧,就希望發(fā)送數(shù)據(jù)了。
2世曾、使用asynsocket類庫進(jìn)行通信缨恒。
133.如何處理多個(gè)網(wǎng)絡(luò)請求并發(fā)的情況?
答:
(附網(wǎng)址:http://www.cnblogs.com/yanhuaxuanlan/p/4683557.html)
答案都是代碼,大家可以打開網(wǎng)址仔細(xì)閱讀
1.并發(fā)當(dāng)有多個(gè)線程在操作時(shí),如果系統(tǒng)只有一個(gè)CPU,則它根本不可能真正同時(shí)進(jìn)行一個(gè)以上的線程,它只能把CPU運(yùn)行時(shí)間劃分成若干個(gè)時(shí)間段,再將時(shí)間段分配給各個(gè)線程執(zhí)行轮听,在一個(gè)時(shí)間段的線程代碼運(yùn)行時(shí)骗露,其它線程處于掛起狀。.這種方式我們稱之為并發(fā)(Concurrent)蕊程。
2.并行當(dāng)系統(tǒng)有一個(gè)以上CPU時(shí),則線程的操作有可能非并發(fā)椒袍。當(dāng)一個(gè)CPU執(zhí)行一個(gè)線程時(shí),另一個(gè)CPU可以執(zhí)行另一個(gè)線程藻茂,兩個(gè)線程互不搶占CPU資源惕鼓,可以同時(shí)進(jìn)行,這種方式我們稱之為并行(Parallel)提针。
3.區(qū)別并發(fā)和并行是即相似又有區(qū)別的兩個(gè)概念腥寇,并行是指兩個(gè)或者多個(gè)事件在同一時(shí)刻發(fā)生;而并發(fā)是指兩個(gè)或多個(gè)事件在同一時(shí)間間隔內(nèi)發(fā)生。
134.簡單介紹一下KVC和KVO,他們都可以應(yīng)用在哪些場景?
答:
(附網(wǎng)址:http://blog.csdn.net/zhaozy55555/article/details/8598374
http://www.cnblogs.com/kenshincui/p/3871178.html)
KVC:NSKeyValueCoding的簡稱,是一種可以直接通過字符串的名字(key)來訪問類屬性的機(jī)制,而不是通過調(diào)用的Setter惭婿、Getter方法訪問。
KVC的操作方法由NSKeyValueCoding協(xié)議提供叶雹,NSObject就實(shí)現(xiàn)了這個(gè)協(xié)議财饥,也就是說如果對象是NSObject的子對象那么就支持KVC操作,KVC有兩種操作方法折晦,一種是設(shè)值钥星,一種是取值,可以理解為getter和setter满着,不過稍微有所不同的是谦炒,設(shè)置對象值的方法中有兩個(gè),setValue:屬性值forKey:屬性名(一般的設(shè)置风喇,比如說是說設(shè)置NSString,NSNumber等基本類類型宁改,setetValue:屬性值forKeyPath:屬性路徑
2.KVO:NSKeyValueObserving的簡稱,當(dāng)指定的對象的屬性被修改了魂莫,允許對象接受到通知的機(jī)制还蹲。每次指定的被觀察對象的屬性被修改的時(shí)候,KVO都會(huì)自動(dòng)的去通知相應(yīng)的觀察者豁鲤,相當(dāng)于設(shè)計(jì)模式中的觀察者模式秽誊。
Key-Value Observing (KVO)建立在KVC之上鲸沮,能夠觀察一個(gè)對象的KVC key path值的變化琳骡,接下來的做的實(shí)例是在iOS中視圖的ViewDidLoad中實(shí)現(xiàn)的,跟KVC類似讼溺,不過可以監(jiān)聽值的變化楣号,實(shí)現(xiàn)起來很簡單addObserver添加觀察,observeValueForKeyPath觀察變化之后的事件怒坯,最后需要銷毀以下監(jiān)聽事件炫狱,
135.實(shí)現(xiàn)多線程有哪些方法,分別有什么區(qū)別?
答: (http://www.cnblogs.com/hanjun/p/3667874.html)
1.NSThread
2.NSOperationQueue
3.GCD
區(qū)別:
Thread是這三種范式里面相對輕量級的,但也是使用起來最負(fù)責(zé)的剔猿,你需要自己管理thread的生命周期视译,線程之間的同步。線程共享同一應(yīng)用程序的部分內(nèi)存空間归敬,它們擁有對數(shù)據(jù)相同的訪問權(quán)限酷含。你得協(xié)調(diào)多個(gè)線程對同一數(shù)據(jù)的訪問鄙早,一般做法是在訪問之前加鎖,這會(huì)導(dǎo)致一定的性能開銷椅亚。在iOS中我們可以使用多種形式的thread:
Cocoa threads:使用NSThread或直接從NSObject的類方法performSelectorInBackground:withObject:來創(chuàng)建一個(gè)線程限番。如果你選擇thread來實(shí)現(xiàn)多線程,那么NSThread就是官方推薦優(yōu)先選用的方式呀舔。
Cocoa operations是基于Obective-C實(shí)現(xiàn)的弥虐,類NSOperation以面向?qū)ο蟮姆绞椒庋b了用戶需要執(zhí)行的操作,我們只要聚焦于我們需要做的事情媚赖,而不必太操心線程的管理霜瘪,同步等事情,因?yàn)镹SOperation已經(jīng)為我們封裝了這些事情惧磺。NSOperation是一個(gè)抽象基類粥庄,我們必須使用它的子類。iOS提供了兩種默認(rèn)實(shí)現(xiàn):NSInvocationOperation和NSBlockOperation豺妓。
Grand Central Dispatch (GCD): iOS4才開始支持惜互,它提供了一些新的特性,以及運(yùn)行庫來支持多核并行編程琳拭,它的關(guān)注點(diǎn)更高:如何在多個(gè)cpu上提升效率训堆。
136.The ios/osx’s graphics is bassed onOpenGL . what is OpenGL?
iOS的/ OS X的圖形是基于OpenGL。什么是OpenGL白嘁?
(附網(wǎng)址:https://developer.apple.com/opengl/)
官方的解釋:OpenGL是硬件基礎(chǔ)圖形加速在OS X的權(quán)力核心動(dòng)畫坑鱼,核心形象,和石英的極端和給你的應(yīng)用程序訪問驚人的3D圖形處理能力絮缅。使用工業(yè)標(biāo)準(zhǔn)的圖形API創(chuàng)建一系列應(yīng)用程序鲁沥,包括游戲,動(dòng)畫制作軟件耕魄,以及醫(yī)療成像解決方案画恰。
百度的解釋:
OpenGL:(Open Graphics Library)是指定義了一個(gè)跨編程語言、跨平臺(tái)的編程接口規(guī)格的專業(yè)的圖形程序接口吸奴。它用于三維圖像(二維的亦可)允扇,是一個(gè)功能強(qiáng)大,調(diào)用方便的底層圖形庫则奥。計(jì)算機(jī)三維圖形是指將用數(shù)據(jù)描述的三維空間通過計(jì)算轉(zhuǎn)換成二維圖像并顯示或打印出來的技術(shù)考润。OpenGL就是支持這種轉(zhuǎn)換的程序庫,它源于SGI公司為其圖形工作站開發(fā)的IRIS GL读处,在跨平臺(tái)移植過程中發(fā)展成為OpenGL糊治。OpenGL被設(shè)計(jì)成獨(dú)立于硬件、獨(dú)立于窗口系統(tǒng)罚舱,在各種操作系統(tǒng)的計(jì)算機(jī)上都可用的井辜,并能在網(wǎng)絡(luò)環(huán)境下以客戶/服務(wù)器模式工作揖赴,是專業(yè)圖形處理、科學(xué)計(jì)算等高端應(yīng)用領(lǐng)域的標(biāo)準(zhǔn)圖形庫
137.What is CoreFoundation framework,andwhat is Foundation frame-work
什么是框架的CoreFoundation抑胎,什么是Foundation框架
答:
(附:文頂頂網(wǎng)址http://www.cnblogs.com/wendingding/p/3710820.html和http://blog.csdn.net/annkey123/article/details/8271867)
Core Foundation框架(CoreFoundation.framework)是一組C語言接口燥滑,它們?yōu)閕OS應(yīng)用程序提供基本數(shù)據(jù)管理和服務(wù)功能。
Foundation—基礎(chǔ)框架阿逃∶。框架中包含了很多開發(fā)中常用的數(shù)據(jù)類型,如結(jié)構(gòu)體恃锉,枚舉搀菩,類等,是其他ios框架的基礎(chǔ)破托。
如果要想使用foundation框架中的數(shù)據(jù)類型肪跋,那么包含它的主頭文件就可以了。
即#import
補(bǔ)充:core foundation框架相對底層土砂,里面的代碼幾乎都是c語言的州既,而foundation中是OC的。
138.How do you save data for you app
你如何保存你的應(yīng)用程序數(shù)據(jù)
答:
(附網(wǎng)址:應(yīng)用數(shù)據(jù)存儲(chǔ)方式
(XML屬性列表-plist): http://www.cnblogs.com/ wendingding/p/3773867.html
(偏好設(shè)置):http://www.cnblogs.com/wendingding/p/3775178.html
(歸檔):http://www.cnblogs.com/wendingding/p/3775293.html)
ios應(yīng)用數(shù)據(jù)存儲(chǔ)方式(XML屬性列表-plist)ios應(yīng)用常用的數(shù)據(jù)存儲(chǔ)方式
1.plist(XML屬性列表歸檔)
2.偏好設(shè)置
3.NSKeydeArchiver歸檔(存儲(chǔ)自定義對象)
4.SQLite3(數(shù)據(jù)庫萝映,關(guān)系型數(shù)據(jù)庫吴叶,不能直接存儲(chǔ)對象,要編寫一些數(shù)據(jù)庫的語句序臂,將對象拆開存儲(chǔ))
5.Core Data(對象型的數(shù)據(jù)庫蚌卤,把內(nèi)部環(huán)節(jié)屏蔽)
139.Do you use GIT version control?What isthe difference between merge and rebase ? If you are not using GIT ,are youusing any distributed version control system?
您是否使用Git版本控制?什么是合并和重訂之間的區(qū)別奥秆?如果你沒有使用Git逊彭,您使用的分布式版本控制系統(tǒng)?
答:建議大家使用百度翻譯打開網(wǎng)址以下均是英文解釋
(附網(wǎng)址:什么是版本控制:https://git-scm.com/book/zh/ch1-1.html
國外網(wǎng)友的解釋:http://translate.baiducontent.com/transpage?query=http%3A%2F%2Fserve.3ezy.com%2Fstackoverflow.com%2Fquestions%2F16666089%2Fwhats-the-difference-between-git-merge-and-git-rebase&from=en&to=zh&source=url
視頻的網(wǎng)址:http://www.git-tower.com/learn/git/videos/)
140.Storyboard or Xib, which do youprefer?And why
Storyboard和Xib你喜歡哪個(gè)為什么?
答:
(附網(wǎng)址:http://blog.mobilejazz.com/storyboards-xibs-best-practices/)
喜歡哪個(gè)大家可以選擇:以下是Storyboard和Xib的優(yōu)缺點(diǎn)可以參考以下
以下解釋是英文翻譯過來的(建議大家可以看網(wǎng)址原文章)
xibs是XML文件定義和配置的一組對象构订,并專門操縱主要觀點(diǎn)(UIView子類)侮叮。Xcode具有友好的編輯器,可以顯示這些意見鲫咽,它是一個(gè)運(yùn)行的應(yīng)用程序签赃,使得它的配置和設(shè)計(jì)布局非常容易(節(jié)省很多行代碼)。
即使大多數(shù)開發(fā)商關(guān)聯(lián)一個(gè)xib文件“屏幕”或“視圖控制器”分尸,是通用的容器xibs對象和可以一起使用,與其它類型的對象作為nsobjects UIViews歹嘹,或者只是一個(gè)人箩绍。
Storyboard
這是一個(gè)XML文件代表統(tǒng)一一套xibs為了定義導(dǎo)航之間的一組視圖控制器。有一個(gè)故事一個(gè)開發(fā)者可以定義多個(gè)“屏幕”(或和導(dǎo)航之間的UIViewController類)他們尺上。
作為一個(gè)差的XIB材蛛,故事是由定義的視圖和導(dǎo)航處理他們之間圆到。
xibs VS代碼的好處
視圖的可視化配置。
自動(dòng)布局的視覺形態(tài)卑吭。
大小班的視覺形態(tài)芽淡。
節(jié)省時(shí)間和代碼,而“創(chuàng)建實(shí)例”豆赏。
節(jié)省時(shí)間和代碼挣菲,而“配置對象”。
快速UITableViewCell原型掷邦。
快速配置控制動(dòng)作(ibactions)白胀。
Storyboard與xibs效益
可以直接在腳本本身原型的行。
可以定義靜態(tài)表格部分和行抚岗。
可以使用自動(dòng)布局約束添加到toplayoutguide和bottomlayoutguide或杠。
可以指定導(dǎo)航和過渡(這是一個(gè)主要的目的!)宣蔚。
可以定義多個(gè)“屏幕”(處理的)在一個(gè)地方(不需要多xibs)向抢。
對xibs VS代碼不便
容易破裂合并時(shí)(GIT)。
不復(fù)雜的自動(dòng)布局定義胚委。
不能引用(或包括)其他xibs笋额。
Storyboard與代碼xibs不便
故事情節(jié)是:大文件的加載速度慢,有時(shí)篷扩。
需要一個(gè)大屏幕顯示所有(或部分)的內(nèi)容兄猩。
容易破裂合并時(shí)(GIT)。
高概率打破它時(shí)鉴未,合并(GIT)作為故事包含很多信息枢冤。
許多警告當(dāng)支持iOS 7和iOS 8(利潤,大小班)铜秆。
不能引用(或包括)其他xibs淹真。
151. Aside from regular tasks like
reading/writing element, getting the count of an array, can you write something
else you can do to an NSArray with only the built-in SDK? E.g, how do you
filter(過濾器), map, an NSArray?
不會(huì)
152.Do you use SDWebImage? If yes, why doyou choose this library? If no, how do you load an image from Internet to anUIImageView?
翻譯:你使用SDWebImage嗎?如果使用连茧,你為什么使用這個(gè)庫核蘸,如果不使用,你是怎樣加載一張網(wǎng)絡(luò)圖片的啸驯?
答案:這個(gè)類庫提供一個(gè)UIImageView類別以支持加載來自網(wǎng)絡(luò)的遠(yuǎn)程圖片客扎。具有緩存管理、異步下載罚斗、同一個(gè)URL下載次數(shù)控制和優(yōu)化等特征徙鱼。
156.看下面的程序,第一個(gè)NSLog會(huì)輸出什么?這時(shí)str的retainCount是多少?第二個(gè)和第三個(gè)呢?為什么
NSMutableArray* ary = [[NSMutableArrayarray] retain]; //2
NSString *str = [NSStringstringWithFormat:@"test"];//1
[str retain];// 2
[ary addObject:str]; // 3
NSLog(@"%d", [str retainCount]);
[str retain];// 4
[str release];// 3
[str release];// 2
NSLog(@"%d", [str retainCount]);//2
[ary removeAllObjects]; // 1
NSLog(@"%d", [strretainCount]);
結(jié)果:3、2、1
157.Storyboard or Xib, which do you
prefer?And why袱吆?
你喜歡使用Storyboard還是Xib?為什么厌衙?
詳細(xì)解釋:“http://stackoverflow.com/questions/13834999/storyboards-vs-the-old-xib-way”
答案: The reasons for liking Storyboard:There are things you can do with
a storyboard that you can't do with a nib. A storyboard lets you create segues
between view controllers, and it lets you design table view cells in-place. One
big advantage of Storyboard is the ability to view your entire application's
GUI(圖形用戶界面)flow. Zoom out and you can see how everything interconnects andflows.
The reasons for liking Xib : There are
things you can do with a nib that you can't do with a storyboard. In a nib, you
can create references to the File's Owner placeholder(占位符). You
can create multiple top-level views, edit them, and create connections between
them. See this answer for an example of why you'd want to do that. You can add
external(外部的)object placeholders (a rarely-used feature很少使用的功能).
1.Apartfrom the historical value in the xib approach, xib's also provide modularity.Perhaps you have a library of code or wish to share a useful widget you made.Taking the xib approach would facilitate that sharing and reuse.
2.Thexib approach also allows you some greater flexibility in terms of your owncode.
3.Withxibs, while the modularity is nice, it's tougher to envision how everythingconnects and flows together. This can be a useful feature for yourself, or ifyou have a larger team to share with, to allow others to see how the app flows.
158. if you’ve started using Swift,writedown one or two features that is presenting Swift which is not Objective-C, andhow it helps you
英語翻譯:如果你已經(jīng)使用了Swift,寫出一個(gè)或兩個(gè)Swift有而OC沒有的功能,它是怎樣幫助你的绞绒?
答案:可選類型(optionals)婶希、元組(tuples)、泛型(generics)蓬衡,類型推斷(type inference)以及其他等等喻杈。(答案不全)
159. How do you do abackground task(后臺(tái)任務(wù))in iOS,indifferent ways ? And which one doyou prefer
翻譯:你怎樣用一種不同的方式做一個(gè)后臺(tái)任務(wù),你喜歡哪一種方式撤蟆?
答案:http://www.2cto.com/kf/201402/278626.html
160.static關(guān)鍵字的作用?
在C語言中奕塑,關(guān)鍵字static有三個(gè)明顯的作用:
1).在函數(shù)體,一個(gè)被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過程中維持其值不變家肯。
2).在模塊內(nèi)(但在函數(shù)體外)龄砰,一個(gè)被聲明為靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問讨衣。它是一個(gè)本地的全局變量换棚。
3).在模塊內(nèi),一個(gè)被聲明為靜態(tài)的函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用反镇。那就是固蚤,這個(gè)函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用。
161.堆和棧的區(qū)別?
堆和棧的區(qū)別:
一歹茶、堆椣ν妫空間分配區(qū)別:
1、棧(操作系統(tǒng)):由操作系統(tǒng)自動(dòng)分配釋放惊豺,存放函數(shù)的參數(shù)值燎孟,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧尸昧;
2揩页、堆(操作系統(tǒng)):一般由程序員分配釋放,若程序員不釋放烹俗,程序結(jié)束時(shí)可能由OS回收爆侣,分配方式倒是類似于鏈表。
二幢妄、堆棧緩存方式區(qū)別:
1兔仰、棧使用的是一級緩存,他們通常都是被調(diào)用時(shí)處于存儲(chǔ)空間中磁浇,調(diào)用完畢立即釋放斋陪;
2、堆是存放在二級緩存中置吓,生命周期由虛擬機(jī)的垃圾回收算法來決定(并不是一旦成為孤兒對象就能被回收)无虚。所以調(diào)用這些對象的速度要相對來得低一些。
三衍锚、堆棧數(shù)據(jù)結(jié)構(gòu)區(qū)別:
堆(數(shù)據(jù)結(jié)構(gòu)):堆可以被看成是一棵樹友题,如:堆排序;
棧(數(shù)據(jù)結(jié)構(gòu)):一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)戴质。
162.目標(biāo)~動(dòng)作機(jī)制
目標(biāo)是動(dòng)作消息的接收者度宦。一個(gè)控件,或者更為常見的是它的單元告匠,以插座變量(參見"插座變量"部分)
的形式保有其動(dòng)作消息的目標(biāo)戈抄。
動(dòng)作是控件發(fā)送給目標(biāo)的消息,或者從目標(biāo)的角度看后专,它是目標(biāo)為了響應(yīng)動(dòng)作而實(shí)現(xiàn)的方法划鸽。
程序需要某些機(jī)制來進(jìn)行事件和指令的翻譯。這個(gè)機(jī)制就是目標(biāo)-動(dòng)作機(jī)制
163.自動(dòng)釋放池是什么,如何工作?
一戚哎、什么是自動(dòng)釋放池
1裸诽、Autorelease pool
自動(dòng)釋放池(Autorelease pool)是OC的一種內(nèi)存自動(dòng)回收機(jī)制,可以將一些臨時(shí)變量通過自動(dòng)釋放池來回收統(tǒng)一釋放
自動(dòng)釋放池本事銷毀的時(shí)候型凳,池子里面所有的對象都會(huì)做一次release操作
2丈冬、autorelease
任何OC對象只要調(diào)用autorelease方法,就會(huì)把該對象放到離自己最近的自動(dòng)釋放池中(棧頂?shù)尼尫懦兀?/p>
二:O-C當(dāng)中的內(nèi)存釋放甘畅,并不是像java/.net那樣有一個(gè)自動(dòng)的釋放池埂蕊,開發(fā)人員不用去關(guān)心有關(guān)內(nèi)存釋放的問題,O-C里面的自動(dòng)釋放池比c語言的手動(dòng)內(nèi)存管理要好一些疏唾,但是相對于java/.net來說又弱一些逊抡,所以說O-C當(dāng)中的釋放屬于半自動(dòng)的釋放池。
三弯屈、如何創(chuàng)建一個(gè)自動(dòng)釋放池
//ios5.0新方式
@autoreleasepool
{
}
//ios5.0之前的老方式
NSAutoreleasePool *pool=[[NSAutoreleasePoolalloc]init];
[pool release];
四惭载、自動(dòng)釋放池如何釋放對象內(nèi)存
黃金法則:如果對一個(gè)對象使用了alloc,[mutable]copy,retain,那么必須使用相應(yīng)的release或者autorelease.
164.obj-c的優(yōu)點(diǎn)
objc優(yōu)點(diǎn):
1) Cateogies
2) Posing
3)動(dòng)態(tài)識別
4)指標(biāo)計(jì)算
5)彈性訊息傳遞
6)不是一個(gè)過度復(fù)雜的C衍生語言
7) Objective-C與C++可混合編程
缺點(diǎn):
1)不支援命名空間
2)不支持運(yùn)算符重載
3)不支持多重繼承
4)使用動(dòng)態(tài)運(yùn)行時(shí)類型,所有的方法都是函數(shù)調(diào)用准给,所以很多編譯時(shí)優(yōu)化方法都用不到泄朴。(如內(nèi)聯(lián)函數(shù)等),性能低劣露氮。
OC沒有多重繼承祖灰,Java也沒有C++才有
OC使用協(xié)議來實(shí)現(xiàn)多重繼承
165.什么時(shí)候用delegate,什么時(shí)候用Notification
1.參數(shù)的不同
使用delegate參數(shù)更加直觀,使用notification參數(shù)不那么直觀畔规,所以能使用delegate的地方局扶,盡量使用delegate
2.傳遞的長度
有時(shí)候你的頁面會(huì)一次跳好幾個(gè)頁面,那么你想把這個(gè)頁面的數(shù)據(jù)傳回到底層是很麻煩的事情,因?yàn)槟阋裠elegate指針從底層界面一直傳上來三妈。
3.傳遞多個(gè)數(shù)據(jù)
當(dāng)你在同一個(gè)對象傳遞給多個(gè)對象畜埋,用delegate就不可行了。
166.什么是KVC和KVO?
1畴蒲、KVC悠鞍,即是指NSKeyValueCoding,一個(gè)非正式的Protocol模燥,提供一種機(jī)制來間接訪問對象的屬性咖祭。而不是通過調(diào)用Setter、Getter方法訪問蔫骂。KVO就是基于KVC實(shí)現(xiàn)的關(guān)鍵技術(shù)之一么翰。
2、KVO的是KeyValue
Observe的縮寫辽旋,中文是鍵值觀察浩嫌。這是一個(gè)典型的觀察者模式,觀察者在鍵值改變時(shí)會(huì)得到通知戴已。iOS中有個(gè)Notification的機(jī)制固该,也可以獲得通知,但這個(gè)機(jī)制需要有個(gè)Center糖儡,相比之下KVO更加簡潔而直接伐坏。
167.類別的作用
作用:
1對系統(tǒng)的類或自己定義的類的擴(kuò)充(只是指,不能聲明屬性Instance variable)e.g. base64 MD5.但是不能保證所有的方法都能被調(diào)用握联。尤其是在指定一個(gè)與系統(tǒng)的方法相同的方法時(shí)一定要注意桦沉。
文件名:NSString+additions.h
NSString+additions.m
@interface NSString (Base64)
2可以聲明私有方法。
ZYViewController.m
@interfaceZYViewController (additions)
//{
//BOOL isOK;
//}
- (void)ok;
@property
@end
3可以聲明分散類的方法(NSIndexPath)
分散類體現(xiàn)出類別不僅可以擴(kuò)充系統(tǒng)的方法金闽,而且可以擴(kuò)充自己定義的類纯露。
由第3個(gè)作用可知:不管是否使用的分散類在任何的.h文件中,我只考慮類別中的方法包裹在@interface className ..@end,那么我只明確將來類別中的方法就屬于className這個(gè)類代芜。
168.淺復(fù)制和深復(fù)制的區(qū)別
簡單的來說就是埠褪,在有指針的情況下,淺拷貝只是增加了一個(gè)指針指向已經(jīng)存在的內(nèi)存挤庇,而深拷貝就是增加一個(gè)指針并且申請一個(gè)新的內(nèi)存钞速,使這個(gè)增加的指針指向這個(gè)新的內(nèi)存,采用深拷貝的情況下嫡秕,釋放內(nèi)存的時(shí)候就不會(huì)出現(xiàn)在淺拷貝時(shí)重復(fù)釋放同一內(nèi)存的錯(cuò)誤渴语!
我列舉一個(gè)例子來說吧:
你正在編寫C++程序中有時(shí)用到,操作符的重載昆咽。最能體現(xiàn)深層拷貝與淺層拷貝的驾凶,就是‘=’的重載牙甫。
看下面一個(gè)簡單的程序:
class string{
char *m_str;
public:
string(char *s){
m_str=s;
}
string()
{};
String & operator=(const string s){
m_str=s.m_str;
return *this
}
};
int main(){
string s1("abc"),s2;
s2=s1;
cout<
上面的=重載其是就是實(shí)現(xiàn)了淺拷貝原因。是由于對象之中含有指針數(shù)據(jù)類型.s1,s2恰好指向同一各內(nèi)存调违。所以是淺拷貝窟哺。而你如果修改一下原來的程序:
string&operator=(const string&s){
if(strlen(m_str)!=strlen(s.m_str))
m_str=new char[strlen(s.m_str)+1];
if(*this!=s)
strcopy(m_str,s.m_str);
return *this;
}
這樣你就實(shí)現(xiàn)了深拷貝,原因是你為被賦值對象申請了一個(gè)新的內(nèi)存所以就是深拷貝翰萨。
169.代理的作用
代理的目的是改變或傳遞控制鏈脏答。允許一個(gè)類在某些特定時(shí)刻通知到其他類糕殉,而不需要獲取到那些類的指針亩鬼。可以減少框架復(fù)雜度阿蝶。
另外一點(diǎn)雳锋,代理可以理解為java中的回調(diào)監(jiān)聽機(jī)制的一種類似。
170.我們說的OC是動(dòng)態(tài)運(yùn)行時(shí)語言是什么意思?
多態(tài)羡洁。
主要是將數(shù)據(jù)類型的確定由編譯時(shí)玷过,推遲到了運(yùn)行時(shí)。
這個(gè)問題其實(shí)淺涉及到兩個(gè)概念筑煮,運(yùn)行時(shí)和多態(tài)辛蚊。
簡單來說,運(yùn)行時(shí)機(jī)制使我們直到運(yùn)行時(shí)才去決定一個(gè)對象的類別真仲,以及調(diào)用該類別對象指定方法袋马。多態(tài):不同對象以自己的方式響應(yīng)相同的消息的能力叫做多態(tài)。
意思就是假設(shè)生物類(life)都用有一個(gè)相同的方法-eat;那人類屬于生物秸应,豬也屬于生物虑凛,都繼承了life后,實(shí)現(xiàn)各自的eat软啼,但是調(diào)用是我們只需調(diào)用各自的eat方法桑谍。
也就是不同的對象以自己的方式響應(yīng)了相同的消息(響應(yīng)了eat這個(gè)選擇器)。
因此也可以說祸挪,運(yùn)行時(shí)機(jī)制是多態(tài)的基礎(chǔ)锣披。
171.什么是ARC?請簡述一下ARC的原理贿条。
1)ARC是iOS 5推出的新功能雹仿,全稱叫ARC(Automatic Reference Counting)。簡單地說闪唆,就是代碼中自動(dòng)加入了retain/release盅粪,原先需要手動(dòng)添加的用來處理內(nèi)存管理的引用計(jì)數(shù)的代碼可以自動(dòng)地由編譯器完成了
2)、ARC的規(guī)則就是只要對象沒有強(qiáng)指針引用悄蕾,就會(huì)被釋放掉票顾,換而言之只要還有一個(gè)強(qiáng)引用指針變量指向?qū)ο蟠「。敲催@個(gè)對象就會(huì)存在內(nèi)存中。弱指針指向的對象奠骄,會(huì)被自動(dòng)變成空指針(nil指針)豆同,從而不會(huì)引發(fā)野指針錯(cuò)誤。
172.簡述視圖控制器的生命周期含鳞。
1)影锈、init函數(shù)(init;initWithFrame;initWithCoder;等)--初始化
2)、awakeFromNib--在loadView之前的工作放在這里
3)蝉绷、viewDidLoad--注意鸭廷,一個(gè)ViewController一個(gè)生命周期內(nèi)這個(gè)函數(shù)只會(huì)調(diào)用一次
4)、viewWillAppear--view將要出現(xiàn)熔吗,每次View消失再出現(xiàn)都會(huì)調(diào)用
5)辆床、viewWillLayoutSubviews--簡要對子試圖進(jìn)行布局
6)、viewDidLayoutSubivews--完成對子試圖布局
7)桅狠、viewDidAppear--視圖將要出現(xiàn)在屏幕上
---上述代碼不含部分
8)讼载、viewWillDisappear--View將要消失
9)viewDidDisappear--View已經(jīng)消失
173.請描述一下線程的生命周期。
新建(new Thread)中跌、就緒(runnable)咨堤、運(yùn)行(running)、死亡(dead)漩符、堵塞(blocked)
174.請至少列舉5個(gè)常用的設(shè)計(jì)模式一喘。
1)、代理模式2)陨仅、觀察者模式3)津滞、MVC模式4)、單例模式5)工廠模式
175.如何增強(qiáng)iOS應(yīng)用程序的性能灼伤。
初級
1触徐、使用ARC進(jìn)行內(nèi)存管理、2.在適當(dāng)?shù)那闆r下使用reuseIdentifier
3.盡可能將View設(shè)置為不透明(Opaque)4.避免臃腫的XIBs 5.不要阻塞主線程6.讓圖片的大小跟UIImageView一樣7.選擇正確的集合8.使用GZIP壓縮
中級:
9.重用和延遲加載View 10.緩存狐赡、緩存撞鹉、緩存11.考慮繪制12.處理內(nèi)存警告13.重用花銷很大的對象14.使用Sprite
Sheets 15.避免重新處理數(shù)據(jù)16.選擇正確的數(shù)據(jù)格式17.設(shè)置適當(dāng)?shù)谋尘皥D片18.降低Web內(nèi)容的影響19.設(shè)置陰影路徑20.優(yōu)化TableView 21.選擇正確的數(shù)據(jù)存儲(chǔ)方式
高級
22.加速啟動(dòng)時(shí)間23.使用Autorelease
Pool 24.緩存圖片—或者不緩存25.盡量避免Date格式化
176.請列舉至少五個(gè)iOS中常用的第三方類庫。
1).AFNetworking
2). SDWebImage
3). shareKit
4). FMDatebase
5). MMDrawerController
177.隊(duì)列和棧有什么區(qū)別颖侄。
棧(Stack):是限定只能在表的一端進(jìn)行插入和刪除操作的線性表
隊(duì)列(Queue)是限定只能在表的一段進(jìn)行插入和在另一端進(jìn)行刪除操作的的線性表
1)鸟雏、隊(duì)列是先進(jìn)先出,棧是先進(jìn)后出
2)览祖、遍歷數(shù)據(jù)速度不同孝鹊,隊(duì)列遍歷速度要快得多
178.常用的XML文件的解析方式有哪些?它們各自的區(qū)別是什么展蒂?
1)又活、有兩種解析方式:DOM解析與SAX解析
2)苔咪、DOM解析必須先完成DOM樹的創(chuàng)建,在處理規(guī)模較大XML文檔時(shí)就很耗內(nèi)存柳骄,占用資源較多
3)與DOM不同团赏,SAX是用事件驅(qū)動(dòng)模型,解析XML時(shí)每遇到一個(gè)開始或結(jié)束標(biāo)簽耐薯、或者屬性舔清、或者一條指令時(shí),程序就會(huì)產(chǎn)生一個(gè)事件進(jìn)行相應(yīng)的處理曲初,因此体谒,SAX相對于DOM來說更適合操作較大的XML文檔
179.請介紹幾個(gè)常用的git命令。
git branch查看本地所有分支复斥、git status查看當(dāng)前狀態(tài)营密、git commit提交、git branch -a查看所有的分支目锭、git
branch -r查看本地所有分支
180.請簡單描述一下自己的職業(yè)生涯規(guī)劃。
不知道
181.static關(guān)鍵字的作用
答案:
(1)設(shè)置變量的存儲(chǔ)域纷捞,函數(shù)體內(nèi)static變量的作用范圍為該函數(shù)體痢虹,不同于auto變量,該變量的內(nèi)存只被分配一次主儡,因此其值在下次調(diào)用時(shí)仍維持上次的值奖唯;
(2)限制變量的作用域,在模塊內(nèi)的static全局變量可以被模塊內(nèi)所用函數(shù)訪問糜值,但不能被模塊外其它函數(shù)訪問丰捷;
(3)限制函數(shù)的作用域,在模塊內(nèi)的static函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用寂汇,這個(gè)函數(shù)的使用范圍被限制在聲明它的模塊內(nèi)病往;
(4)在類中的static成員變量意味著它為該類的所有實(shí)例所共享,也就是說當(dāng)某個(gè)類的實(shí)例修改了該靜態(tài)成員變量骄瓣,其修改值為該類的其它所有實(shí)例所見停巷;
(5)在類中的static成員函數(shù)屬于整個(gè)類所擁有,這個(gè)函數(shù)不接收this指針榕栏,因而只能訪問類的static成員變量畔勤。
182.堆和棧的區(qū)別?
答:答:棧完全是由系統(tǒng)管理的,堆是由程序員自己控制管理的,包括內(nèi)存空間的開辟和釋放.棧是先進(jìn)后出.
183.目標(biāo)-動(dòng)作機(jī)制?
答:目標(biāo)是動(dòng)作消息的接收者。一個(gè)控件扒磁,或者更為常見的是它的單元庆揪,以插座變量(參見"插座變量"部分)
的形式保有其動(dòng)作消息的目標(biāo)。
動(dòng)作是控件發(fā)送給目標(biāo)的消息妨托,或者從目標(biāo)的角度看缸榛,它是目標(biāo)為了響應(yīng)動(dòng)作而實(shí)現(xiàn)的方法检访。
程序需要某些機(jī)制來進(jìn)行事件和指令的翻譯。這個(gè)機(jī)制就是目標(biāo)-動(dòng)作機(jī)制
184.自動(dòng)釋放池是什么,如合工作?
答:當(dāng)向一個(gè)對象發(fā)送一個(gè)autorelease消息時(shí)仔掸,Cocoa就會(huì)將該對象的一個(gè)引用放入到最新的自動(dòng)釋放池脆贵。它仍然是個(gè)正當(dāng)?shù)膶ο螅虼俗詣?dòng)釋放池定義的作用域內(nèi)的其它對象可以向它發(fā)送消息起暮。當(dāng)程序執(zhí)行到作用域結(jié)束的位置時(shí)卖氨,自動(dòng)釋放池就會(huì)被釋放,池中的所有對象也就被釋放负懦。
185. obj-c的優(yōu)缺點(diǎn)
答: objc優(yōu)點(diǎn):
1) Cateogies
2) Posing
3)動(dòng)態(tài)識別
4)指標(biāo)計(jì)算
5)彈性訊息傳遞
6)不是一個(gè)過度復(fù)雜的C衍生語言
7) Objective-C與C++可混合編程
缺點(diǎn):
1)不支援命名空間
2)不支持運(yùn)算符重載
3)不支持多重繼承
4)使用動(dòng)態(tài)運(yùn)行時(shí)類型筒捺,所有的方法都是函數(shù)調(diào)用,所以很多編譯時(shí)優(yōu)化方法都用不到纸厉。(如內(nèi)聯(lián)函數(shù)等)系吭,性能低劣。
OC沒有多重繼承颗品,Java也沒有C++才有
OC使用協(xié)議來實(shí)現(xiàn)多重繼承
186.什么時(shí)候用delegate,什么時(shí)候用Notification?
答: Delegate
消息的發(fā)送者(sender)告知接受者(receiver)某個(gè)事件將要發(fā)生, delegate同意后發(fā)送者響應(yīng)事件,delegate機(jī)制使得接受者可以改變發(fā)送者的行為.
1/傳值
b把自己的數(shù)據(jù)和對象傳給a,讓a去展示或處理
2/傳事件
delegate的優(yōu)勢:
1.非常嚴(yán)格的語法肯尺。所有將聽到的事件必須是在delegate協(xié)議中有清晰的定義。
2.如果delegate中的一個(gè)方法沒有實(shí)現(xiàn)那么就會(huì)出現(xiàn)編譯警告/錯(cuò)誤
3.協(xié)議必須在controller的作用域范圍內(nèi)定義
4.在一個(gè)應(yīng)用中的控制流程是可跟蹤的并且是可識別的躯枢;
5.在一個(gè)控制器中可以定義定義多個(gè)不同的協(xié)議则吟,每個(gè)協(xié)議有不同的delegates
6.沒有第三方對象要求保持/監(jiān)視通信過程。
7.能夠接收調(diào)用的協(xié)議方法的返回值锄蹂。這意味著delegate能夠提供反饋信息給controller
Notification
消息的發(fā)送者告知接受者事件已經(jīng)發(fā)生或者將要發(fā)送(接受者不能影響發(fā)送者的行為)
消息接受者通過keyPath的方式指定需要接受的消息類型,通常在對象初始化完成之后聲明開始接收消息在對象被銷毀前注銷接收消息.
notification優(yōu)勢:
1.不需要編寫多少代碼氓仲,實(shí)現(xiàn)比較簡單;
2.對于一個(gè)發(fā)出的通知得糜,多個(gè)對象能夠做出反應(yīng)敬扛,即1對多的方式實(shí)現(xiàn)簡單
Delegate和Notification區(qū)別
1/二者都用于傳遞消息.
delegate針對one - to - one關(guān)系receiver可以返回值給sender.
notification用于one - to - one /
many / none關(guān)系receiver無法返回值給sender.
2/delegate兩者之間必須建立聯(lián)系否則沒辦法調(diào)用代理方法.
notification不需要兩者之間有聯(lián)系.
3/delegate用于希望sender接受到receiver的某個(gè)功能值反饋
notification用于通知多個(gè)object某個(gè)事件
4/notification通過維護(hù)一個(gè)array,實(shí)現(xiàn)一對多消息的轉(zhuǎn)發(fā)
187.什么是KVC和KVO?
答: Key value coding朝抖,Key value observer.
Kvc是路徑訪問的規(guī)范啥箭,kvo是觀察某個(gè)變量的變化過程
KVO可以觀察某個(gè)對象的變量變化過程,KVC是滿足被觀察的編
碼規(guī)范槽棍。
KVC/KVO類似于代理捉蚤,通知中心。都是一種通訊方法炼七。
188.類別的作用?
答:類別主要有3個(gè)作用:
(1)將類的實(shí)現(xiàn)分散到多個(gè)不同文件或多個(gè)不同框架中缆巧。
(2)創(chuàng)建對私有方法的前向引用。
(3)向?qū)ο筇砑臃钦絽f(xié)議
189.淺復(fù)制和深復(fù)制的區(qū)別?
答:簡單的來說就是豌拙,在有指針的情況下陕悬,淺拷貝只是增加了一個(gè)指針指向已經(jīng)存在的內(nèi)存,而深拷貝就是增加一個(gè)指針并且申請一個(gè)新的內(nèi)存按傅,使這個(gè)增加的指針指向這個(gè)新的內(nèi)存捉超,采用深拷貝的情況下胧卤,釋放內(nèi)存的時(shí)候就不會(huì)出現(xiàn)在淺拷貝時(shí)重復(fù)釋放同一內(nèi)存的錯(cuò)誤!
190.代理的作用?
答:作用有兩個(gè)拼岳,一個(gè)是傳值枝誊,一個(gè)是傳事件
191.我們說的OC是動(dòng)態(tài)運(yùn)行時(shí)語言是什么意思?
多態(tài)。
答:主要是將數(shù)據(jù)類型的確定由編譯時(shí)惜纸,推遲到了運(yùn)行時(shí)叶撒。
這個(gè)問題其實(shí)淺涉及到兩個(gè)概念,運(yùn)行時(shí)和多態(tài)耐版。
簡單來說祠够,運(yùn)行時(shí)機(jī)制使我們直到運(yùn)行時(shí)才去決定一個(gè)對象的類別,以及調(diào)用該類別對象指定方法粪牲。多態(tài):不同對象以自己的方式響應(yīng)相同的消息的能力叫做多態(tài)古瓤。
意思就是假設(shè)生物類(life)都用有一個(gè)相同的方法-eat;那人類屬于生物,豬也屬于生物腺阳,都繼承了life后落君,實(shí)現(xiàn)各自的eat,但是調(diào)用是我們只需調(diào)用各自的eat方法舌狗。
也就是不同的對象以自己的方式響應(yīng)了相同的消息(響應(yīng)了eat這個(gè)選擇器)叽奥。
因此也可以說,運(yùn)行時(shí)機(jī)制是多態(tài)的基礎(chǔ)痛侍。
198.Object–C的類可以多重繼承嗎?可以實(shí)現(xiàn)多個(gè)接口嗎?
Category是什么?重寫一個(gè)類的方法用繼承好還是分類好?為什么?
答案:Object-c的類不可以多重繼承;可以實(shí)現(xiàn)多個(gè)接口魔市,通過實(shí)現(xiàn)多個(gè)接口可以完成C++的多重繼承主届;Category是類別劳曹,一般情況用分類好抱环,用Category去重寫類的方法沪么,僅對本Category有效熄诡,不會(huì)影響到其他類與原有類的關(guān)系知允。
199..屬性readwrite , readonly , assign , retain , copy , nonatomic ,各是什么作用,在哪種情況下用?
答:
assign用于簡單數(shù)據(jù)類型苞七,如NSInteger,double,bool,
retain和copy用于對象忆肾,
readwrite是可讀可寫特性白指;需要生成getter方法和setter方法時(shí)
readonly是只讀特性只會(huì)生成getter方法不會(huì)生成setter方法;不希望屬性在類外改變
assign是賦值特性较坛,setter方法將傳入?yún)?shù)賦值給實(shí)例變量印蔗;僅設(shè)置變量時(shí);
retain表示持有特性丑勤,setter方法將傳入?yún)?shù)先保留华嘹,再賦值,傳入?yún)?shù)的retaincount會(huì)+1;
copy表示賦值特性法竞,setter方法將傳入對象復(fù)制一份耙厚;需要一份新的變量時(shí)强挫。
nonatomic非原子操作,atomic原子性操作薛躬。原子性指的是一個(gè)操作不可以被中途cpu暫停然后調(diào)度,即不能被中斷,要不就執(zhí)行完,要不就不執(zhí)行俯渤,就是為了多線程安全的。
一般使用nonatomic型宝。
201.內(nèi)存管理的幾條原則是什么?按照默認(rèn)法則,哪些關(guān)鍵字生成的對象需要手動(dòng)釋放,在和property結(jié)合的時(shí)候怎樣有效的避免內(nèi)存泄露?
答:當(dāng)使用new八匠、alloc或copy方法創(chuàng)建一個(gè)對象時(shí),該對象引用計(jì)數(shù)器為1诡曙。如果不需要使用該對象臀叙,可以向其發(fā)送release或autorelease消息,在其使用完畢時(shí)被銷毀价卤。
如果通過其他方法獲取一個(gè)對象劝萤,則可以假設(shè)這個(gè)對象引用計(jì)數(shù)為1,并且被設(shè)置為autorelease慎璧,不需要對該對象進(jìn)行清理床嫌,如果確實(shí)需要retain這個(gè)對象,則需要使用完畢后release胸私。
如果retain了某個(gè)對象厌处,需要release或autorelease該對象,保持retain方法和release方法使用次數(shù)相等岁疼。
使用new阔涉、alloc、copy關(guān)鍵字生成的對象和retain了的對象需要手動(dòng)釋放捷绒。設(shè)置為autorelease的對象不需要手動(dòng)釋放瑰排,會(huì)直接進(jìn)入自動(dòng)釋放池。
202.堆和棧什么區(qū)別暖侨?
答:一椭住、堆棧空間分配區(qū)別:
1字逗、棧(操作系統(tǒng)):由操作系統(tǒng)自動(dòng)分配釋放京郑,存放函數(shù)的參數(shù)值,局部變量的值等葫掉。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧些举;
2、堆(操作系統(tǒng)):一般由程序員分配釋放挖息,若程序員不釋放金拒,程序結(jié)束時(shí)可能由OS回收,分配方式倒是類似于鏈表。
二绪抛、堆棧緩存方式區(qū)別:
1资铡、棧使用的是一級緩存,他們通常都是被調(diào)用時(shí)處于存儲(chǔ)空間中幢码,調(diào)用完畢立即釋放笤休;
2、堆是存放在二級緩存中症副,生命周期由虛擬機(jī)的垃圾回收算法來決定(并不是一旦成為孤兒對象就能被回收)店雅。所以調(diào)用這些對象的速度要相對來得低一些。
三贞铣、堆棧數(shù)據(jù)結(jié)構(gòu)區(qū)別:
堆(數(shù)據(jù)結(jié)構(gòu)):堆可以被看成是一棵樹闹啦,如:堆排序;
棧(數(shù)據(jù)結(jié)構(gòu)):一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)辕坝。
203.描述一下iOS SDK中如何實(shí)現(xiàn)MVC設(shè)計(jì)模式窍奋?
答:
MVC是模型、試圖酱畅、控制開發(fā)模式琳袄,對于iOS
SDK,所有的View都是視圖層的纺酸,它應(yīng)該獨(dú)立于模型層窖逗,由視圖控制層來控制。所有的用戶數(shù)據(jù)都是模型層餐蔬,它應(yīng)該獨(dú)立于視圖碎紊。所有的ViewController都是控制層,由它負(fù)責(zé)控制視圖樊诺,訪問模型數(shù)據(jù)矮慕。
204.iOS數(shù)據(jù)持久化方式有哪些?
205和199一樣刪除205
206.自動(dòng)釋放池是什么啄骇,如何工作?
答:當(dāng)您向一個(gè)對象發(fā)送一個(gè)autorelease消息時(shí)瘟斜,Cocoa就會(huì)將該對象的一個(gè)引用放入到最新的自動(dòng)釋放池缸夹。它仍然是個(gè)正當(dāng)?shù)膶ο螅虼俗詣?dòng)釋放池定義的作用域內(nèi)的其它對象可以向它發(fā)送消息螺句。當(dāng)程序執(zhí)行到作用域結(jié)束的位置時(shí)虽惭,自動(dòng)釋放池就會(huì)被釋放,池中的所有對象也就被釋放蛇尚。
207. if you can Android/Windows Phone,write something about the comparison between it and iOS
翻譯如果你有Android /
Windows Phone的手機(jī)芽唇,寫一些關(guān)于它與iOS設(shè)備之間的比較
答案:自己發(fā)揮
208. Write something about the differencesbetween Objective-C and C++.
翻譯寫一些關(guān)于Objective-C和C++之間的差異
答案:
1、Objective C基本上是在C +
Smalltalk基礎(chǔ)上衍生出來的,C++就是C++匆笤。除了都是從C語言分化出來的以外研侣,完全沒有任何共性。
2炮捧、最大的區(qū)別就是Objective C的成員函數(shù)調(diào)用是基于動(dòng)態(tài)綁定的庶诡,類本身并沒有限制對象可以有什么函數(shù)。相對于C++類會(huì)規(guī)定好成員有什么函數(shù)咆课。這使得Objective C的靈活性很大末誓,但是執(zhí)行效率也很低。
3书蚪、在NeXT系統(tǒng)的時(shí)代C++和Objective C都不是那么大眾的東西喇澡,C++也還沒完善,而且那個(gè)時(shí)代編譯器的有優(yōu)化能力也沒現(xiàn)在那么變態(tài)殊校。所以選擇Objective C也不是很奇怪的事晴玖。但是現(xiàn)在Objective C的劣勢就越來越明顯了,所以蘋果開發(fā)了Swift箩艺,而且就內(nèi)部消息蘋果很可能會(huì)準(zhǔn)備放棄OC窜醉。
209. __unsafe_unretained vs__weak; purposeof __block; NSString const * vs NSString *const
unsafe_unretained往往都是用來聲明屬性的,如果想聲明臨時(shí)變量就得用__strong,__weak,__unsafe_unretained,__autoreleasing;
block閉包就是能夠讀取其它函數(shù)內(nèi)部變量的函數(shù);
NSString const *HSCoder = @"漢斯哈哈哈";
"*HSCoder"不能被修改艺谆,"HSCoder"能被修改
NSString * const HSCoder = @"漢斯哈哈哈";
"HSCoder"不能被修改榨惰,"*HSCoder"能被修改
210. Write something about what you achievedby and what you learned from the UITableView class
首先,Controller需要實(shí)現(xiàn)兩個(gè)delegate静汤,分別是UITableViewDelegate和UITableViewDataSource然后UITableView對象的delegate要設(shè)置為self,注冊cell,之后給定分區(qū)數(shù)和行數(shù),注意cell的重用機(jī)制,可以設(shè)置系統(tǒng)cell或者自定義cell
211.你對天健公司有哪些了解琅催?你為什么愿意成為天健公司的一員?
212. Object C中創(chuàng)建線程的方法是什么?如果在主線程中執(zhí)行代碼,方法是什么?如果想延時(shí)執(zhí)行代碼,方法又是什么?
線程創(chuàng)建有三種方法:使用NSThread創(chuàng)建虫给、使用GCD的dispatch藤抡、使用子類化的NSOperation,然后將其加入NSOperationQueue;
在主線程執(zhí)行代碼,方法是performSelectorOnMainThread抹估,
如果想延時(shí)執(zhí)行代碼可以用performSelector:onThread:withObject: afterDelay:或者使用GCD的函數(shù):dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 2秒后異步執(zhí)行這里的代碼...
});
213.描述一下iOS SDK中如何實(shí)現(xiàn)MVC的開發(fā)模式
MVC是模型缠黍、視圖、控制器開發(fā)模式药蜻,對于iOS
SDK瓷式,所有的View都是視圖層的,它應(yīng)該獨(dú)立于模型層语泽,由視圖器來控制贸典。所有的用戶數(shù)據(jù)都是模型層,它應(yīng)該獨(dú)立于視圖踱卵。所有的ViewController都是視圖器廊驼,由它負(fù)責(zé)控制視圖,訪問模型數(shù)據(jù)。
214.簡述淺拷貝和深拷貝
答案:淺層復(fù)制:只復(fù)制指向?qū)ο蟮闹羔樁士妫粡?fù)制引用對象本身绳锅。
深層復(fù)制:復(fù)制引用對象本身。
意思就是說我有個(gè)A對象饥漫,復(fù)制一份后得到A_copy對象后榨呆,對于淺復(fù)制來說,A和A_copy指向的是同一個(gè)內(nèi)存資源庸队,復(fù)制的只不過是是一個(gè)指針积蜻,對象本身資源
還是只有一份,那如果我們對A_copy執(zhí)行了修改操作,那么發(fā)現(xiàn)A引用的對象同樣被修改彻消,這其實(shí)違背了我們復(fù)制拷貝的一個(gè)思想竿拆。深復(fù)制就好理解了,內(nèi)存中存在了
兩份獨(dú)立對象本身。
用網(wǎng)上一哥們通俗的話將就是:
淺復(fù)制好比你和你的影子宾尚,你完蛋丙笋,你的影子也完蛋
深復(fù)制好比你和你的克隆人,你完蛋煌贴,你的克隆人還活著御板。
215.在iPhone應(yīng)用中如何保存數(shù)據(jù)?
XML屬性列表(plist)歸檔
Preference(偏好設(shè)置)
NSKeyedArchiver歸檔(NSCoding)
SQLite3
Core Data
216.ViewController的didReceiveMemoryWarning怎么被調(diào)用:
1、當(dāng)程序收到內(nèi)存警告時(shí)候ViewController會(huì)調(diào)用didReceiveMemoryWarning這個(gè)方法牛郑。
2怠肋、調(diào)用了這個(gè)方法之后,對view進(jìn)行釋放并且調(diào)用viewDidUnload方法
3淹朋、從iOS3.0開始笙各,不需要重載這個(gè)函數(shù),把釋放內(nèi)存的代碼放到viewDidUnload中去础芍。
217.寫一個(gè)委托的interface
1.聲明一個(gè)協(xié)議(只有.h文件)
#import
@protocal協(xié)議名superMan<父協(xié)議NSObject>
@property NSString* name;
-(void)method;
@end
2.使一個(gè)類遵守協(xié)議
@interface TRMan:NSObject
多個(gè)協(xié)議要用杈抢,隔開
3.使用協(xié)議
id<協(xié)議名superMan>obj=[[TRMan alloc]init];
@ protocol MyDelegate
@interface MyClass : NSObject
@property(nonatomic,weak)id delegate;
@end
協(xié)議也可以沒有獨(dú)立文件,寫在類里
#import
@class MyClass;
@protocol MyClassDelegate
-(void)protocolMethod;
@end
@interface MyClass : NSObject
@property(nonatomic,weak)id delegate;
@end
218.線程與進(jìn)程的區(qū)別與聯(lián)系
進(jìn)程仑性,是并發(fā)執(zhí)行的程序在執(zhí)行過程中分配和管理資源的基本單位惶楼,是一個(gè)動(dòng)態(tài)概念,竟?fàn)幱?jì)算機(jī)系統(tǒng)資源的基本單位诊杆。每一個(gè)進(jìn)程都有一個(gè)自己的地址空間鲫懒,即進(jìn)程空間或(虛空間)。進(jìn)程空間的大小只與處理機(jī)的位數(shù)有關(guān)刽辙,一個(gè)16位長處理機(jī)的進(jìn)程空間大小為216,而32位處理機(jī)的進(jìn)程空間大小為232甲献。進(jìn)程至少有5種基本狀態(tài)宰缤,它們是:初始態(tài),執(zhí)行態(tài),等待狀態(tài)慨灭,就緒狀態(tài)朦乏,終止?fàn)顟B(tài)。
線程氧骤,在網(wǎng)絡(luò)或多用戶環(huán)境下呻疹,一個(gè)服務(wù)器通常需要接收大量且不確定數(shù)量用戶的并發(fā)請求,為每一個(gè)請求都創(chuàng)建一個(gè)進(jìn)程顯然是行不通的筹陵,——無論是從系統(tǒng)資源開銷方面或是響應(yīng)用戶請求的效率方面來看刽锤。因此,操作系統(tǒng)中線程的概念便被引進(jìn)了朦佩。
線程并思,是進(jìn)程的一部分,一個(gè)沒有線程的進(jìn)程可以被看作是單線程的语稠。線程有時(shí)又被稱為輕權(quán)進(jìn)程或輕量級進(jìn)程宋彼,也是CPU調(diào)度的一個(gè)基本單位。
219.mvc設(shè)計(jì)模式是什么?你還熟悉什么設(shè)計(jì)模式
答:系統(tǒng)分為三個(gè)部分: Model. View. Controller.在cocoa中,你的程序中的每一個(gè)object
(對象)都將明顯地僅屬于這三部分中的一個(gè),而完全不屬于另外兩個(gè).MVC課一幫助確保幫助實(shí)現(xiàn)程序最大程度的可重用性.各MVC元素彼此獨(dú)立運(yùn)作,通過分開這些元素,可以構(gòu)建可維護(hù),可獨(dú)立更新的程序組建.
Delegate設(shè)計(jì)模式
Target-action設(shè)計(jì)模式
單例模式
220.什么是沙箱模式?哪些操作屬于私有api范疇
某個(gè)iphone工程進(jìn)行文件操作有此工程對應(yīng)的指定的位置仙畦,不能逾越输涕。
iphone沙箱模型的有四個(gè)文件夾,分別是什么慨畸,永久數(shù)據(jù)存儲(chǔ)一般放在什么位置莱坎,得到模擬器的路徑的簡單方式是什么.
documents,tmp先口,app型奥,Library。
(NSHomeDirectory())碉京,
手動(dòng)保存的文件在documents文件里
Nsuserdefaults保存的文件在tmp文件夾里
Documents目錄:您應(yīng)該將所有de應(yīng)用程序數(shù)據(jù)文件寫入到這個(gè)目錄下厢汹。這個(gè)目錄用于存儲(chǔ)用戶數(shù)據(jù)或其它應(yīng)該定期備份的信息。
AppName.app目錄:這是應(yīng)用程序的程序包目錄谐宙,包含應(yīng)用程序的本身烫葬。由于應(yīng)用程序必須經(jīng)過簽名,
所以您在運(yùn)行時(shí)不能對這個(gè)目錄中的內(nèi)容進(jìn)行修改凡蜻,否則可能會(huì)使應(yīng)用程序無法啟動(dòng)搭综。Library目錄:這個(gè)目錄下有兩個(gè)子目錄:Caches和Preferences
Preferences目錄包含應(yīng)用程序的偏好設(shè)置文件。您不應(yīng)該直接創(chuàng)建偏好設(shè)置文件划栓,而是應(yīng)該使用NSUserDefaults類來取得和設(shè)置應(yīng)用程序的偏好.
Caches目錄用于存放應(yīng)用程序?qū)S玫闹С治募医恚4鎽?yīng)用程序再次啟動(dòng)過程中需要的信息。tmp目錄:這個(gè)目錄用于存放臨時(shí)文件忠荞,保存應(yīng)用程序再次啟動(dòng)過程中不需要的信息蒋歌。獲取這些目錄路徑的方法:
1帅掘,獲取家目錄路徑的函數(shù):
NSString*homeDir=NSHomeDirectory();
2,獲取Documents目錄路徑的方法:
NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*docDir=[pathsobjectAtIndex:0];
3堂油,獲取Caches目錄路徑的方法:
NSArray*paths=NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES);
NSString*cachesDir=[pathsobjectAtIndex:0];
4修档,獲取tmp目錄路徑的方法:
NSString*tmpDir=NSTemporaryDirectory();
5,獲取應(yīng)用程序程序包中資源文件路徑的方法:
例如獲取程序包中一個(gè)圖片資源(apple.png)路徑的方法:
NSString*imagePath=[[NSBundlemainBundle]pathForResource:@”apple”ofType:@”png”];UIImage*appleImage=[[UIImagealloc]initWithContentsOfFile:imagePath];
代碼中的mainBundle類方法用于返回一個(gè)代表應(yīng)用程序包的對象府框。
文件IO寫入
1吱窝,將數(shù)據(jù)寫到Documents目錄:
-(BOOL)writeApplicationData:(NSData*)datatoFile:(NSString*)fileName{
NSArray*paths=
NSUserDomainMask,YES);NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSString*docDir=[pathsobjectAtIndex:0];
if(!docDir){
NSLog(@”Documentsdirectorynotfound!”);returnNO;
}
NSString*filePath=[docDirstringByAppendingPathComponent:fileName];
return[datawriteToFile:filePathatomically:YES];
}
2,從Documents目錄讀取數(shù)據(jù):
-(NSData*)applicationDataFromFile:(NSString*)fileName{
NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*docDir=[pathsobjectAtIndex:0];
NSString*filePath=[docDirstringByAppendingPathComponent:fileName];
NSData*data=[[[NSDataalloc]initWithContentsOfFile:filePath]autorelease];
returndata;
}
NSSearchPathForDirectoriesInDomains這個(gè)主要就是返回一個(gè)絕對路徑用來存放我們需要儲(chǔ)存的文件迫靖。
-(NSString*)dataFilePath{
NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*documentsDirectory=[pathsobjectAtIndex:0];
return[documentsDirectorystringByAppendingPathComponent:@"shoppingCar.plist"];}
NSFileManager*fm=[NSFileManagerdefaultManager];
if(![fmfileExistsAtPath:[selfdataFilePath]]){
//下面是對該文件進(jìn)行制定路徑的保存
[fmcreateDirectoryAtPath:[selfdataFilePath]withIntermediateDirectories:YESattributes:nilerror:nil];
//取得一個(gè)目錄下得所有文件名
NSArray*files=[fmsubpathsAtPath:[selfdataFilePath]];
//讀取某個(gè)文件
NSData*data=[fmcontentsAtPath:[selfdataFilePath]];
//或者
NSData*data=[NSDatadataWithContentOfPath:[selfdataFilePath]];
}
iphone常見私有api的應(yīng)用(比如直接發(fā)送短信院峡,訪問沙箱之外的磁盤文件).
221.描述一下iOS SDK中如何實(shí)現(xiàn)MVC的開發(fā)模式
MVC是模型、視圖袜香、控制器開發(fā)模式撕予,對于iOS
SDK,所有的View都是視圖層的蜈首,它應(yīng)該獨(dú)立于模型層实抡,由視圖器來控制。所有的用戶數(shù)據(jù)都是模型層欢策,它應(yīng)該獨(dú)立于視圖吆寨。所有的ViewController都是視圖器,由它負(fù)責(zé)控制視圖踩寇,訪問模型數(shù)據(jù)啄清。
222.簡述淺拷貝和深拷貝
//淺拷貝就比如像引用類型,而深拷貝就比如值類型俺孙。
淺拷貝是指源對象與拷貝對象共用一份實(shí)體辣卒,僅僅是引用的變量不同(名稱不同)。對其中任何一個(gè)對象的改動(dòng)都會(huì)影響另外一個(gè)對象睛榄。舉個(gè)例子荣茫,一個(gè)人一開始叫張三,后來改名叫李四了场靴,可是還是同一個(gè)人啡莉,不管是張三缺胳膊少腿還是李四缺胳膊少腿,都是這個(gè)人倒霉旨剥。
深拷貝是指源對象與拷貝對象互相獨(dú)立咧欣,其中任何一個(gè)對象的改動(dòng)都不會(huì)對另外一個(gè)對象造成影響。舉個(gè)例子轨帜,一個(gè)人名叫張三魄咕,后來用他克隆(假設(shè)法律允許)了另外一個(gè)人蚌父,叫李四蚕礼,不管是張三缺胳膊少腿還是李四缺胳膊少腿都不會(huì)影響另外一個(gè)人祈争。比較典型的就是Value(值)對象秀仲,如預(yù)定義類型Int32,Double来颤,以及結(jié)構(gòu)(struct)嗡午,枚舉(Enum)等囤躁。
C#中有兩種類型變量,一種是值類型變量荔睹,一種是引用類型變量狸演。對于前者,copy是屬于全盤復(fù)制僻他;而對于后者宵距,一般的copy只是淺copy,相當(dāng)于只傳遞一個(gè)引用指針一樣吨拗。因此對于后者進(jìn)行真正copy的時(shí)候满哪,也是最費(fèi)事的,具體的說劝篷,必須為其實(shí)現(xiàn)ICloneable接口中提供的Clone方法哨鸭。
淺拷貝(影子克隆):只復(fù)制對象的基本類型,對象類型,仍屬于原來的引用.
深拷貝(深度克隆):不緊復(fù)制對象的基本類,同時(shí)也復(fù)制原對象中的對象.就是說完全是新對象產(chǎn)生的.
223.在iPhone應(yīng)用中如何保存數(shù)據(jù)
//ios程序中數(shù)據(jù)數(shù)據(jù)存儲(chǔ)有下列5種方式
XML屬性列表(plist)歸檔、Preference(偏好設(shè)置)娇妓、NSKeyedArchiver歸檔(NSCoding)像鸡、SQLite3、Core Data
每個(gè)iOS應(yīng)用都有自己的應(yīng)用沙盒(應(yīng)用沙盒就是文件系統(tǒng)目錄)哈恰,與其他文件系統(tǒng)隔離只估。應(yīng)用的數(shù)據(jù)必須待在自己的沙盒里,其他應(yīng)用不能訪問該沙盒
224.假設(shè)有一個(gè)雙向循環(huán)列隊(duì)着绷,每個(gè)節(jié)點(diǎn)保存了一個(gè)自然數(shù)蛔钙,目前呈10,9蓬戚,4夸楣,11的隊(duì)列,代碼寫出一個(gè)向其中插入數(shù)字20的算法
//沒找到
225.描述下tableView cell的重用機(jī)制,談?wù)勀闶侨绾蝺?yōu)化UITableView
//重用機(jī)制簡單的說意思一行一行的cell都是在復(fù)用的子漩,滑動(dòng)tableview的時(shí)候豫喧,剛離開視圖的cell會(huì)被放到復(fù)用池中,等下一個(gè)cell需要顯示時(shí)幢泼,會(huì)先看復(fù)用池中有沒有cell如果有的時(shí)候紧显,就從復(fù)用池中拿出來cell,沒有的話就重新創(chuàng)建cell
使用不透明視圖缕棵。
不透明的視圖可以極大地提高渲染的速度孵班。因此如非必要涉兽,可以將table cell及其子視圖的opaque屬性設(shè)為YES(默認(rèn)值)。
其中的特例包括背景色篙程,它的alpha值應(yīng)該為1(例如不要使用clearColor)枷畏;圖像的alpha值也應(yīng)該為1,或者在畫圖時(shí)設(shè)為不透明虱饿。
不要重復(fù)創(chuàng)建不必要的table
cell拥诡。
前面說了,UITableView只需要一屏幕的UITableViewCell對象即可氮发。因此在cell不可見時(shí)渴肉,可以將其緩存起來,而在需要時(shí)繼續(xù)使用它即可爽冕。
而UITableView也提供了這種機(jī)制仇祭,只需要簡單地設(shè)置一個(gè)identifier即可:
staticNSString *CellIdentifier = @"xxx"; UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:CellIdentifier];if (cell == nil) { cell =[[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:CellIdentifier] autorelease]; }值得一提的是,cell被重用時(shí)颈畸,它內(nèi)部繪制的內(nèi)容并不會(huì)被自動(dòng)清除乌奇,因此你可能需要調(diào)用setNeedsDisplayInRect:或setNeedsDisplay方法。
此外承冰,在添加table cell的時(shí)候华弓,如果不需要?jiǎng)赢嬓Ч詈貌灰褂胕nsertRowsAtIndexPaths:withRowAnimation:方法困乒,而是直接調(diào)用reloadData方法寂屏。因?yàn)榍罢邥?huì)對所有indexPaths調(diào)用tableView:cellForRowAtIndexPath:方法,即便該cell并不需要顯示(不知道是不是bug)娜搂,這就可能創(chuàng)建大量多余的cell迁霎。勘誤:只是在模擬器上測試如此百宇,真機(jī)調(diào)試時(shí)沒有這種bug考廉。
減少視圖的數(shù)目。
UITableViewCell包含了textLabel携御、detailTextLabel和imageView等view昌粤,而你還可以自定義一些視圖放在它的contentView里。然而view是很大的對象啄刹,創(chuàng)建它會(huì)消耗較多資源涮坐,并且也影響渲染的性能。
如果你的table
cell包含圖片誓军,且數(shù)目較多袱讹,使用默認(rèn)的UITableViewCell會(huì)非常影響性能。奇怪的是昵时,使用自定義的view捷雕,而非預(yù)定義的view椒丧,明顯會(huì)快些。
當(dāng)然救巷,最佳的解決辦法還是繼承UITableViewCell壶熏,并在其drawRect:中自行繪制:
-(void)drawRect:(CGRect)rect { if (image) { [image drawAtPoint:imagePoint];self.image = nil; } else { [placeHolder drawAtPoint:imagePoint]; } [textdrawInRect:textRect withFont:font lineBreakMode:UILineBreakModeTailTruncation];}不過這樣一來,你會(huì)發(fā)現(xiàn)選中一行后浦译,這個(gè)cell就變藍(lán)了久橙,其中的內(nèi)容就被擋住了。最簡單的方法就是將cell的selectionStyle屬性設(shè)為UITableViewCellSelectionStyleNone管怠,這樣就不會(huì)被高亮了。
此外還可以創(chuàng)建CALayer缸榄,將內(nèi)容繪制到layer上渤弛,然后對cell的contentView.layer調(diào)用addSublayer:方法。這個(gè)例子中甚带,layer并不會(huì)顯著影響性能她肯,但如果layer透明,或者有圓角鹰贵、變形等效果晴氨,就會(huì)影響到繪制速度了。解決辦法可參見后面的預(yù)渲染圖像碉输。
不要做多余的繪制工作籽前。
在實(shí)現(xiàn)drawRect:的時(shí)候,它的rect參數(shù)就是需要繪制的區(qū)域敷钾,這個(gè)區(qū)域之外的不需要進(jìn)行繪制枝哄。
例如上例中,就可以用CGRectIntersectsRect阻荒、CGRectIntersection或CGRectContainsRect判斷是否需要繪制image和text挠锥,然后再調(diào)用繪制方法。
預(yù)渲染圖像侨赡。
你會(huì)發(fā)現(xiàn)即使做到了上述幾點(diǎn)蓖租,當(dāng)新的圖像出現(xiàn)時(shí),仍然會(huì)有短暫的停頓現(xiàn)象羊壹。解決的辦法就是在bitmap context里先將其畫一遍蓖宦,導(dǎo)出成UIImage對象,然后再繪制到屏幕舶掖,詳細(xì)做法可見《利用預(yù)渲染加速iOS設(shè)備的圖像顯示》球昨。
不要阻塞主線程。
做到前幾點(diǎn)后眨攘,你的table
view滾動(dòng)時(shí)應(yīng)該足夠流暢了主慰,不過你仍可能讓用戶感到不爽嚣州。常見的現(xiàn)象就是在更新數(shù)據(jù)時(shí),整個(gè)界面卡住不動(dòng)共螺,完全不響應(yīng)用戶請求该肴。
出現(xiàn)這種現(xiàn)象的原因就是主線程執(zhí)行了耗時(shí)很長的函數(shù)或方法,在其執(zhí)行完畢前藐不,無法繪制屏幕和響應(yīng)用戶請求匀哄。其中最常見的就是網(wǎng)絡(luò)請求了,它通常都需要花費(fèi)數(shù)秒的時(shí)間雏蛮,而你不應(yīng)該讓用戶等待那么久涎嚼。
解決辦法就是使用多線程,讓子線程去執(zhí)行這些函數(shù)或方法挑秉。這里面還有一個(gè)學(xué)問法梯,當(dāng)下載線程數(shù)超過2時(shí),會(huì)顯著影響主線程的性能犀概。因此在使用ASIHTTPRequest時(shí)立哑,可以用一個(gè)NSOperationQueue來維護(hù)下載請求,并將其maxConcurrentOperationCount設(shè)為2姻灶。而NSURLRequest則可以配合GCD來實(shí)現(xiàn)铛绰,或者使用NSURLConnection的setDelegateQueue:方法。
當(dāng)然产喉,在不需要響應(yīng)用戶請求時(shí)捂掰,也可以增加下載線程數(shù),以加快下載速度:
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollViewwillDecelerate:(BOOL)decelerate { if (!decelerate) {queue.maxConcurrentOperationCount = 5; } } -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {queue.maxConcurrentOperationCount = 5; } -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {queue.maxConcurrentOperationCount = 2; }此外镊叁,自動(dòng)載入更新數(shù)據(jù)對用戶來說也很友好尘颓,這減少了用戶等待下載的時(shí)間。例如每次載入50條信息晦譬,那就可以在滾動(dòng)到倒數(shù)第10條以內(nèi)時(shí)疤苹,加載更多信息:
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell*)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if (count - indexPath.row< 10 && !updating) { updating = YES; [self update]; } }// update方法獲取到結(jié)果后,設(shè)置updating為NO還有一點(diǎn)要注意的就是當(dāng)圖片下載完成后敛腌,如果cell是可見的卧土,還需要更新圖像:
NSArray*indexPaths = [self.tableView indexPathsForVisibleRows];for (NSIndexPath *visibleIndexPathin indexPaths) { if (indexPath == visibleIndexPath) { MyTableViewCell *cell =(MyTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath]; cell.image= image; [cell setNeedsDisplayInRect:imageRect]; break; } }//也可不遍歷,直接與頭尾相比較像樊,看是否在中間即可尤莺。最后還是前面所說過的insertRowsAtIndexPaths:withRowAnimation:方法,插入新行需要在主線程執(zhí)行生棍,而一次插入很多行的話(例如50行)颤霎,會(huì)長時(shí)間阻塞主線程。而換成reloadData方法的話,瞬間就處理完了友酱。
226.做過IM開發(fā)么,談?wù)剬MPPFramework的了解
//XMPPFramework是一個(gè)OS X/iOS平臺(tái)的開源項(xiàng)目晴音,使用Objective-C實(shí)現(xiàn)了XMPP協(xié)議(RFC-3920),同時(shí)還提供了用于讀寫XML的工具缔杉,大大簡化了基于XMPP的通信應(yīng)用的開發(fā)锤躁。
XMPP中常用對象們
XMPPStream:xmpp基礎(chǔ)服務(wù)類
XMPPRoster:好友列表類
XMPPRosterCoreDataStorage:好友列表(用戶賬號)在core
data中的操作類
XMPPvCardCoreDataStorage:好友名片(昵稱,簽名或详,性別系羞,年齡等信息)在coredata中的操作類
XMPPvCardTemp:好友名片實(shí)體類,從數(shù)據(jù)庫里取出來的都是它
xmppvCardAvatarModule:好友頭像
XMPPReconnect:如果失去連接,自動(dòng)重連
XMPPRoom:提供多用戶聊天支持
XMPPPubSub:發(fā)布訂閱
源碼地址:http://code.google.com/p/xmppframework/霸琴,目前需要使用git才能download到源碼椒振。
227.你是如何實(shí)現(xiàn)多屏幕適配的
//一、iOS屏幕適配發(fā)展歷程
設(shè)備
適配技術(shù)
4及以前(iPad未出)
直接用代碼計(jì)算
有了iPad
autoResizing
有不同屏幕的iPhone后
autoLayout
有更多不同屏幕的iPhone后
sizeClass
二梧乘、各個(gè)技術(shù)的特性
1杠人、autoLayout
幫我們確定在不同設(shè)備、不同(父view)環(huán)境下宋下,同一個(gè)可視單元所應(yīng)具有合適的位置和尺寸(任何兩個(gè)視圖的關(guān)系都可以確定)
1. autoLayout的用法:
?直接建立約束條件
?[self.viewaddConstraint: [NSLayoutConstraintconstraintWithItem:blueView attribute:NSLayoutAttributeLeftrelatedBy:NSLayoutRelationEqual toItem:redView attribute:NSLayoutAttributeLeftmultiplier:1 constant:0]];
這樣雖然代碼量比較大,但是是絕對可行的辦法辑莫,也是使用autoLayout最根本的辦法之一学歧。
?使用VFL語言
- (void)viewDidLoad {
[super viewDidLoad];
UIButton *button=[[UIButtonalloc]init];
[button setTitle:@"點(diǎn)擊一下"forState:UIControlStateNormal];
button.translatesAutoresizingMaskIntoConstraints=NO;
[button setBackgroundColor:[UIColorblackColor]];
[self.view addSubview:button];
NSArray *constraints1=[NSLayoutConstraint
constraintsWithVisualFormat:@"H:|-[button]-|"options:0 metrics:nil
views:NSDictionaryOfVariableBindings(button)];
NSArray *constraints2=[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-20-[button(==30)]"options:0metrics:nil
views:NSDictionaryOfVariableBindings(button)];
[self.viewaddConstraints:constraints1];
[self.viewaddConstraints:constraints2];
}
?使用使用第三方庫,如:Masonry各吨、UIView+AutoLayout……
autoLayout的好處:
?你基本上可以不用考慮3.5寸和4寸以及即將上市的x.x寸屏幕不同分辨率的問題枝笨,你終于可以不用在viewDidLoad方法里判斷不同分辨率下,不同控件應(yīng)該放在哪里揭蜒,或者針對不同分辨率寫不同的storyboard和xib横浑;
?你可以拋棄那些根據(jù)不同文字來計(jì)算tableViewCell、UILabel高度的代碼了屉更,因?yàn)閍utolayout會(huì)幫你自動(dòng)計(jì)算好徙融;
?如果你的布局在橫屏豎屏下變化不是特別大,你不用再為橫著豎著寫兩套代碼或者寫兩個(gè)storyboard/xib了瑰谜;
2.sizeClass
在iOS8中欺冀,新增了Size Classes特性,它是對當(dāng)前所有iOS設(shè)備尺寸的一個(gè)抽象萨脑。那我們就只把屏幕的寬和高分別分成三種情況:Compact:緊湊隐轩、Regular:寬松、Any:任意渤早。
這樣寬和高三三一整合职车,一共9中情況。如下圖所示,針對每一種情況悴灵。我們可以在每種情況下設(shè)置不同的布局(包括控件的約束扛芽,甚至是控件是否顯示)
sizeClass.png
對sizeClass的理解:sizeClass的實(shí)質(zhì)是將iOS屏幕分成了不同的抽象概念,這些不同的抽象組合称勋,對應(yīng)著不同的設(shè)備屏幕胸哥。所以,利用sizeClass可以針對同一套UI赡鲜,來適配所有的屏幕空厌。注意:這些所有的適配,都是利用autoLayout來實(shí)現(xiàn)的银酬,sizeClass只是負(fù)責(zé)提供不同的屏幕尺寸嘲更。
228.談?wù)勀懔私獾脑O(shè)計(jì)模式,你用過哪些,他們的優(yōu)缺點(diǎn)
//(一)代理模式
應(yīng)用場景:當(dāng)一個(gè)類的某些功能需要由別的類來實(shí)現(xiàn),但是又不確定具體會(huì)是哪個(gè)類實(shí)現(xiàn)揩瞪。
優(yōu)勢:解耦合
敏捷原則:開放-封閉原則
實(shí)例:tableview的數(shù)據(jù)源delegate赋朦,通過和protocol的配合,完成委托訴求李破。
列表row個(gè)數(shù)delegate
自定義的delegate
(二)觀察者模式
應(yīng)用場景:一般為model層對宠哄,controller和view進(jìn)行的通知方式,不關(guān)心誰去接收嗤攻,只負(fù)責(zé)發(fā)布信息毛嫉。
優(yōu)勢:解耦合
敏捷原則:接口隔離原則,開放-封閉原則
實(shí)例:Notification通知中心妇菱,注冊通知中心承粤,任何位置可以發(fā)送消息,注冊觀察者的對象可以接收闯团。
kvo辛臊,鍵值對改變通知的觀察者,平時(shí)基本沒用過房交。
(三)MVC模式
應(yīng)用場景:是一中非常古老的設(shè)計(jì)模式彻舰,通過數(shù)據(jù)模型,控制器邏輯候味,視圖展示將應(yīng)用程序進(jìn)行邏輯劃分淹遵。
優(yōu)勢:使系統(tǒng),層次清晰负溪,職責(zé)分明透揣,易于維護(hù)
敏捷原則:對擴(kuò)展開放-對修改封閉
實(shí)例:model-即數(shù)據(jù)模型,view-視圖展示川抡,controller進(jìn)行UI展現(xiàn)和數(shù)據(jù)交互的邏輯控制辐真。
(四)單例模式
應(yīng)用場景:確保程序運(yùn)行期某個(gè)類须尚,只有一份實(shí)例,用于進(jìn)行資源共享控制侍咱。
優(yōu)勢:使用簡單耐床,延時(shí)求值,易于跨模塊
敏捷原則:單一職責(zé)原則
實(shí)例:[UIApplication sharedApplication]楔脯。
注意事項(xiàng):確保使用者只能通過getInstance方法才能獲得撩轰,單例類的唯一實(shí)例。
java昧廷,C++中使其沒有公有構(gòu)造函數(shù)堪嫂,私有化并覆蓋其構(gòu)造函數(shù)。
object c中木柬,重寫allocWithZone方法皆串,保證即使用戶用alloc方法直接創(chuàng)建單例類的實(shí)例,
返回的也只是此單例類的唯一靜態(tài)變量眉枕。
(五)策略模式
應(yīng)用場景:定義算法族恶复,封裝起來,使他們之間可以相互替換速挑。
優(yōu)勢:使算法的變化獨(dú)立于使用算法的用戶
敏捷原則:接口隔離原則谤牡;多用組合,少用繼承姥宝;針對接口編程拓哟,而非實(shí)現(xiàn)。
實(shí)例:排序算法伶授,NSArray的sortedArrayUsingSelector;經(jīng)典的鴨子會(huì)叫流纹,會(huì)飛案例糜烹。
注意事項(xiàng):1,剝離類中易于變化的行為漱凝,通過組合的方式嵌入抽象基類
2疮蹦,變化的行為抽象基類為,所有可變變化的父類
3茸炒,用戶類的最終實(shí)例愕乎,通過注入行為實(shí)例的方式,設(shè)定易變行為
防止了繼承行為方式壁公,導(dǎo)致無關(guān)行為污染子類感论。完成了策略封裝和可替換性。
(六)工廠模式
應(yīng)用場景:工廠方式創(chuàng)建類的實(shí)例紊册,多與proxy模式配合,創(chuàng)建可替換代理類饺鹃。
優(yōu)勢:易于替換盏袄,面向抽象編程,application只與抽象工廠和易變類的共性抽象類發(fā)生調(diào)用關(guān)系掀亥。
敏捷原則:DIP依賴倒置原則
實(shí)例:項(xiàng)目部署環(huán)境中依賴多個(gè)不同類型的數(shù)據(jù)庫時(shí),需要使用工廠配合proxy完成易用性替換
注意事項(xiàng):項(xiàng)目初期妥色,軟件結(jié)構(gòu)和需求都沒有穩(wěn)定下來時(shí)搪花,不建議使用此模式,因?yàn)槠淞觿菀埠苊黠@嘹害,
增加了代碼的復(fù)雜度撮竿,增加了調(diào)用層次,增加了內(nèi)存負(fù)擔(dān)吼拥。所以要注意防止模式的濫用倚聚。
229.數(shù)據(jù)持久化存儲(chǔ)方案有哪些?
//同223題
230.網(wǎng)絡(luò)通信用過哪些方式?
答
1、使用socket的方式進(jìn)行通信凿可。
2惑折、使用asynsocket類庫進(jìn)行通信。
231.現(xiàn)有100個(gè)數(shù)字的亂序數(shù)組,請用一種方法將它排序.只需寫出過程就行.如果亂序數(shù)組里的元素增加到10000個(gè),請?jiān)俅螌⑺判?
答:
int n = array.Length;
for (int i = 0; i < n - 1; i++){
for (int j = 0 ; j > n - i - 1; j++){
if (array[j] > array[j + 1]) {
int temp = array[j ];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
232.用你擅長的語言,寫出獲取當(dāng)前系統(tǒng)時(shí)間的代碼枯跑。
答:
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:[[NSLocale alloc]initWithLocaleIdentifier:@"en_US"]];
[formatter setDateFormat:@"yy-MM-dd HH:mm"];
NSString *currentTime = [formatter stringFromDate:[NSDate date]];
NSLog(@"%@",currentTime);
233.請描述下“極客幫SOHO”是如何替程序員賺到錢的惨驶。
答:
極客邦SOHO是獨(dú)立程序員兼職任務(wù)協(xié)同平臺(tái),專業(yè)服務(wù)程序員敛助,IT技術(shù)的兼職粗卜,眾包服務(wù),交易服務(wù)纳击,兼職服務(wù)续扔,幫助程序員賺錢looip.cncoding.net,外快焕数。
234.寫一個(gè)標(biāo)準(zhǔn)的宏MIN,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè).
答
#define MIN(X,Y)((X)>(Y)?(Y):(X))
235.Obj-c有多重繼承嗎?不是的話有什么替代方法?
答:
cocoa中所有的類都是NSObject的子類纱昧,多繼承在這里是用protocol委托代理來實(shí)現(xiàn)的。你不用去考慮繁瑣的多繼承堡赔,虛基類的概念识脆。多態(tài)特性在obj-c中通過委托來實(shí)現(xiàn)。
236.Static全局變量與普通的全局變量有什么區(qū)別?static局部變量和普通局部變量有什么區(qū)別?static函數(shù)與普通函數(shù)有什么區(qū)別?
答:
static全局變量與普通的全局變量有什么區(qū)別:static全局變量只初使化一次善已,防止在其他文件單元中被引用;
static局部變量和普通局部變量有什么區(qū)別:static局部變量只被初始化一次灼捂,下一次依據(jù)上一次結(jié)果值;
static函數(shù)與普通函數(shù)有什么區(qū)別:static函數(shù)在內(nèi)存中只有一份换团,普通函數(shù)在每個(gè)被調(diào)用中維持一份拷貝
237.MVC模式的理解
答:
MVC悉稠,全稱Model(模型)-View(視圖)-Controller(控制器),這是一種開發(fā)模式艘包,他的好處是可以將界面和業(yè)務(wù)邏輯分離偎球。
Model(模型)洒扎,是程序的主體部分,主要包含業(yè)務(wù)數(shù)據(jù)和業(yè)務(wù)邏輯衰絮。在模型層袍冷,還會(huì)涉及到用戶發(fā)布的服務(wù),在服務(wù)中會(huì)根據(jù)不同的業(yè)務(wù)需求猫牡,更新業(yè)務(wù)模型中的數(shù)據(jù)胡诗。
View(視圖),是程序呈現(xiàn)給用戶的部分淌友,是用戶和程序交互的接口煌恢,用戶會(huì)根據(jù)具體的業(yè)務(wù)需求,在View視圖層輸入自己特定的業(yè)務(wù)數(shù)據(jù)震庭,并通過界面的事件交互瑰抵,將對應(yīng)的輸入?yún)?shù)提交給后臺(tái)控制器進(jìn)行處理。
Controller(控制器)器联,Controller是用來處理用戶輸入數(shù)據(jù)二汛,已經(jīng)更新業(yè)務(wù)模型的部分〔ν兀控制器中接收了用戶與界面交互時(shí)傳遞過來的數(shù)據(jù)肴颊,并根據(jù)數(shù)據(jù)業(yè)務(wù)邏輯來執(zhí)行服務(wù)的調(diào)用和更新業(yè)務(wù)模型的數(shù)據(jù)和狀態(tài)。
238.用變量a給出下面的定義
a)一個(gè)整型數(shù)(An integer)
b)一個(gè)指向整型數(shù)的指針(A pointer to an integer)
c)一個(gè)指向指針的的指針渣磷,它指向的指針是指向一個(gè)整型數(shù)(A pointer to a pointer to an integer)
d)一個(gè)有10個(gè)整型數(shù)的數(shù)組(An array of 10 integers)
e)一個(gè)有10個(gè)指針的數(shù)組婿着,該指針是指向一個(gè)整型數(shù)的(An array of 10 pointers to integers)
f)一個(gè)指向有10個(gè)整型數(shù)數(shù)組的指針(A pointer to an array of 10 integers)
g)一個(gè)指向函數(shù)的指針,該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)(A pointer to a function that takes an integer as an argument and returns an integer)
h)一個(gè)有10個(gè)指針的數(shù)組醋界,該指針指向一個(gè)函數(shù)竟宋,該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)(An array of ten pointers to functions that take an integer argument and return an integer)
答案:
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int);
// A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int);
// An array of 10 pointers to functions that take an integer argument and return an integer
301、在一個(gè)數(shù)組中存在一萬條以上的字符串形纺,現(xiàn)在要對數(shù)組中所有字符串進(jìn)行拼接操作丘侠,請寫出拼接方法(要考慮到性能及內(nèi)存占用情況,ARC模式)挡篓。
NSString *string = [arraycomponentsJoinedByString:@","];
302、請舉例說明代理和通知兩種方式分別適合在什么情況下使用帚称?
代理:一般控件用的比較多官研,其實(shí)也可以用block實(shí)現(xiàn),如果實(shí)現(xiàn)的接口比較多的話闯睹,建議用代理戏羽,如UITableview。
通知:這東西是全局的楼吃,而且是同步的始花,如果你要全局發(fā)送消息妄讯,并且做的事情時(shí)間不長,不會(huì)阻塞線程的話酷宵,建議使用亥贸。
303、是否使用過SQLite或者FMDataBase對數(shù)據(jù)庫進(jìn)行操作浇垦,并試述對事務(wù)概念的理解炕置。
FMDatabase是IOS中Sqlite數(shù)據(jù)庫操作類
304、以下兩種GCD隊(duì)列創(chuàng)建有什么不同男韧?
dispatch_queue_t queue = dispatch_queue_create("MyQueue",DISPATCH_QUEUE_SERIAL);
dispatch_queue_t queue =dispatch_queue_create(@“MyQueue", DISPATCH_QUEUE_CONCURRENT);
//生成一個(gè)串行隊(duì)列朴摊,隊(duì)列中的block按照先進(jìn)先出(FIFO)的順序去執(zhí)行,實(shí)際上為單線程執(zhí)行此虑。第一個(gè)參數(shù)是隊(duì)列的名稱甚纲,在調(diào)試程序時(shí)會(huì)非常有用,所有盡量不要重名了朦前。
//生成一個(gè)并發(fā)執(zhí)行隊(duì)列介杆,block被分發(fā)到多個(gè)線程去執(zhí)行
305、運(yùn)行以下代碼會(huì)打印什么結(jié)果况既?為什么这溅?
dispatch_queue_t queue =dispatch_queue_create("MyQueue", DISPATCH_QUEUE_SERIAL);
dispatch_apply(3, queue, ^(size_t i) {
NSLog(@"apply loop:%zu", i);
dispatch_apply(3, queue, ^(size_t j) {
NSLog(@"apply loop inside:%zu", j);
});
});
apply loop:0
306、簡單說明你對block的理解以及使用block有什么好處棒仍。
答:block是對象悲靴,它封裝了一段代碼,這段代碼可以在任何時(shí)候執(zhí)行莫其。block可以作為函數(shù)參數(shù)或者函數(shù)的返回值癞尚,而其本身又可以帶輸入?yún)?shù)或返回值。它和傳統(tǒng)的函數(shù)指針很類似乱陡,但是有區(qū)別:block是inline的浇揩,并且它對局部變量是只讀的。
好處: Blocks更清晰憨颠。比如一個(gè)viewController中有多個(gè)彈窗事件胳徽,Delegate就得對每個(gè)事件進(jìn)行判斷識別來源。而Blocks就可以在創(chuàng)建事件的時(shí)候區(qū)分開來了爽彤。這也是為什么現(xiàn)在蘋果API中越來越多地使用Blocks而不是Delegate养盗。
307、setValue:forKey和setObject:forKey的區(qū)別是什么适篙?
答: 1, setObject:forkey:中value是不能夠?yàn)閚il的往核,不然會(huì)報(bào)錯(cuò)。
setValue:forKey:中value能夠?yàn)閚il嚷节,但是當(dāng)value為nil的時(shí)候聂儒,會(huì)自動(dòng)調(diào)用removeObject:forKey方法
2, setValue:forKey:中key的參數(shù)只能夠是NSString類型虎锚,而setObject:forKey:的可以是任何類型
308、try-catch-finally的作用和使用方法衩婚。
Java:
1窜护,一個(gè)方法內(nèi)可以有多個(gè)try…catch…finally語句塊,還可以彼此嵌套谅猾,比如下面這個(gè)方法:
2柄慰,如果一個(gè)有返回值的方法內(nèi)有多個(gè)try…catch…finally語句塊,return語句要么寫在任意一個(gè)try…catch內(nèi)税娜,要么寫在方法的最后坐搔,否則編譯無法通過,如果return語句寫在方法的最后敬矩,那么以上try…catch…finally語句中的每一個(gè)finally塊內(nèi)的代碼都將會(huì)執(zhí)行概行;
3,無論方法內(nèi)是否發(fā)生異常(jvm可以處理的異常)弧岳,finally塊內(nèi)的代碼都將會(huì)執(zhí)行凳忙。
309、請寫出同步網(wǎng)絡(luò)請求和異步網(wǎng)絡(luò)請求函數(shù)禽炬。
答:首先在ios模擬器上創(chuàng)建一個(gè)text窗口(我起名叫tongbu):
//同步網(wǎng)絡(luò)請求函數(shù)
//獲取名叫tongbu文本框的內(nèi)容
NSString *txt=self.tongbu.text;
//創(chuàng)建url對象
NSURL *url=[NSURLURLWithString:txt];
//創(chuàng)建請求對象
NSURLRequest*req=[NSURLRequest requestWithURL:url];
//發(fā)起同步涧卵,趕回?cái)?shù)據(jù)給data
NSData*data=[NSURLConnection sendSynchronousRequest:req returningResponse:nilerror:nil];
//異步網(wǎng)絡(luò)請求
在ViewController.m文件上的- (void)viewDidLoad方法里
NSString*txt2=self.tongbu.text;
//創(chuàng)建url對象
NSURL *url2=[NSURLURLWithString:txt2];
//創(chuàng)建請求對象
NSURLRequest*req2=[NSURLRequest requestWithURL:url2];
//發(fā)送請求并建立一個(gè)代理
[NSURLConnectionconnectionWithRequest:req2 delegate:self];
//因?yàn)榇砣耸亲约核宰屪约鹤袷貐f(xié)議
協(xié)議在ViewController.h文件里
@interface ViewController :
UIViewController//因?yàn)榇韺ο笫菍ο笏宰屪约鹤袷貐f(xié)議
//同時(shí)創(chuàng)建一個(gè)NSMutableData類型的對象來接從網(wǎng)絡(luò)上接收的數(shù)據(jù),同時(shí)創(chuàng)建3個(gè)協(xié)議方法來進(jìn)行接收數(shù)據(jù)
@property(retain,nonatomic)NSMutableData*data;
//協(xié)議方法
//1連接接收響應(yīng)腹尖,表示成功建立連接
-(void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse *)response{
self.data=[[NSMutableData alloc]init];//創(chuàng)建代理對象柳恐,并初始化數(shù)據(jù)
}
//2連接接收數(shù)據(jù)
//形參(NSData *)表示接收到的數(shù)據(jù)
-(void)connection:(NSURLConnection*)connection didReceiveData:(NSData *)data{
[self.data
appendData:data];//向data反復(fù)添加數(shù)據(jù)
}
//3連接成功
-(void)connectionDidFinishLoading:(NSURLConnection*)connection{
NSLog(@"連接成功");
}
310、從用戶體驗(yàn)角度舉例說明同步和異步热幔。
答:1.同步意為著線程阻塞乐设,在主線程中使用此方法會(huì)不響應(yīng)任何用戶事件。所以绎巨,在應(yīng)用程序設(shè)計(jì)時(shí)近尚,大多被用在專門的子線程增加用戶體驗(yàn),或用異步請求代替场勤。
2.異步請求的好處是不阻塞當(dāng)前線程戈锻,但相對于同步請求略為復(fù)雜,至少要添加兩個(gè)回調(diào)方法來獲取異步事件
答:從用戶的體驗(yàn)來說,異步請求數(shù)據(jù)的APP比同步請求的APP操作更加流暢,快捷,
312和媳、聲明NSString類型的屬性時(shí)格遭,用copy和strong的區(qū)別是什么?
copy修飾的NSString,在初始化時(shí),如果來源是NSMutableString的話,會(huì)對來源進(jìn)行一次深拷貝,將來源的內(nèi)存地址復(fù)制一份,這樣,兩個(gè)對象就一點(diǎn)關(guān)系就沒有了,無論你怎么操作來源,都不會(huì)對自己的NSString有任何影響
313窗价、談?wù)凮bject-C的內(nèi)存管理方式及過程如庭?
從一段內(nèi)存被申請之后叹卷,就存在一個(gè)變量用于保存這段內(nèi)存被使用的次數(shù)撼港,我們暫時(shí)把它稱為計(jì)數(shù)器坪它,當(dāng)計(jì)數(shù)器變?yōu)?的時(shí)候,那么就是釋放這段內(nèi)存的時(shí)候帝牡,比如說往毡,當(dāng)在程序A里面一段內(nèi)存被成功申請完成之后,那么這個(gè)計(jì)數(shù)器就從0變成了1(我們把這個(gè)過程叫做alloc)然后程序B也需要使用這個(gè)內(nèi)存靶溜,那么計(jì)數(shù)器就從1變成了2(我們把這個(gè)過程叫做retain)緊接著程序A不再需要這段內(nèi)存了开瞭,那么程序A就把這個(gè)計(jì)數(shù)器減1(我們把這個(gè)過程叫做release)程序B也不再需要這段內(nèi)存的時(shí)候,那么也把計(jì)數(shù)器減1(這個(gè)過程還是release)當(dāng)系統(tǒng)(也就是Foundation)發(fā)現(xiàn)這個(gè)計(jì)數(shù)器變成了0罩息,那么就會(huì)調(diào)用內(nèi)存回收程序把這段內(nèi)存回收(我們把這個(gè)過程叫做dealloc)
314嗤详、static全局變量與普通的全局變量有什么區(qū)別?static普通函數(shù)有什么區(qū)別瓷炮?
全局變量(外部變量)的說明之前再冠以static就構(gòu)成了靜態(tài)的全局變量葱色。全局變量本身就是靜態(tài)存儲(chǔ)方式,靜態(tài)全局變量當(dāng)然也是靜態(tài)存儲(chǔ)方式娘香。這兩者在存儲(chǔ)方式上并無不同苍狰。這兩者的區(qū)別雖在于非靜態(tài)全局變量的作用域是整個(gè)源程序,當(dāng)一個(gè)源程序由多個(gè)源文件組成時(shí)烘绽,非靜態(tài)的全局變量在各個(gè)源文件中都是有效的淋昭。而靜態(tài)全局變量則限制了其作用域,即只在定義該變量的源文件內(nèi)有效安接,在同一源程序的其它源文件中不能使用它翔忽。由于靜態(tài)全局變量的作用域局限于一個(gè)源文件內(nèi),只能為該源文件內(nèi)的函數(shù)公用赫段,因此可以避免在其它源文件中引起錯(cuò)誤呀打。從以上分析可以看出,把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲(chǔ)方式即改變了它的生存期糯笙。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域贬丛,限制了它的使用范圍。static函數(shù)與普通函數(shù)有什么區(qū)別给涕?只在當(dāng)前源文件中使用的函數(shù)應(yīng)該說明為內(nèi)部函數(shù)(static)豺憔,內(nèi)部函數(shù)應(yīng)該在
當(dāng)前源文件中說明和定義。對于可在當(dāng)前源文件以外使用的函數(shù)够庙,應(yīng)該在一個(gè)頭文件中說明恭应,要使用這些函數(shù)的源文件要包含這個(gè)頭文件。
315耘眨、Objective-C堆和棧的區(qū)別昼榛?
答:管理方式:對于棧來講,是由編譯器自動(dòng)管理剔难,無需我們手工控制胆屿;對于堆來說奥喻,釋放工作由程序員控制,容易產(chǎn)生memory leak非迹。
申請大谢防稹:
棧:在Windows下,棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域憎兽。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的冷离,在WINDOWS下,棧的大小是2M(也有的說是1M纯命,總之是一個(gè)編譯時(shí)就確定的常數(shù))西剥,如果申請的空間超過棧的剩余空間時(shí),將提示overflow亿汞。因此蔫耽,能從棧獲得的空間較小。
堆:堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu)留夜,是不連續(xù)的內(nèi)存區(qū)域匙铡。這是由于系統(tǒng)是用鏈表來存儲(chǔ)的空閑內(nèi)存地址的,自然是不連續(xù)的碍粥,而鏈表的遍歷方向是由低地址向高地址鳖眼。堆的大小受限于計(jì)算機(jī)系統(tǒng)中有效的虛擬內(nèi)存。由此可見嚼摩,堆獲得的空間比較靈活钦讳,也比較大。
碎片問題:對于堆來講枕面,頻繁的new/delete勢必會(huì)造成內(nèi)存空間的不連續(xù)愿卒,從而造成大量的碎片,使程序效率降低潮秘。對于棧來講琼开,則不會(huì)存在這個(gè)問題,因?yàn)闂J窍冗M(jìn)后出的隊(duì)列枕荞,他們是如此的一一對應(yīng)柜候,以至于永遠(yuǎn)都不可能有一個(gè)內(nèi)存塊從棧中間彈出
分配方式:堆都是動(dòng)態(tà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)行釋放,無需我們手工實(shí)現(xiàn)碌嘀。
分配效率:棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu)碾篡,計(jì)算機(jī)會(huì)在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行筏餐,這就決定了棧的效率比較高。堆則是C/C++函數(shù)庫提供的牡拇,它的機(jī)制是很復(fù)雜的魁瞪。
316、__block和__weak修飾符的區(qū)別是什么惠呼?
答:1导俘,在MRC時(shí)代,__block修飾剔蹋,可以避免循環(huán)引用旅薄;ARC時(shí)代,__block修飾泣崩,同樣會(huì)引起循環(huán)引用問題少梁;
2,__block不管是ARC還是MRC模式下都可以使用矫付,可以修飾對象凯沪,還可以修飾基本數(shù)據(jù)類型;
3买优,__weak只能在ARC模式下使用妨马,也只能修飾對象,不能修飾基本數(shù)據(jù)類型杀赢;
4烘跺,__block對象可以在block中被重新賦值,__weak不可以脂崔;
317滤淳、如何解決TableView卡頓的問題?
1.答:使用不透明視圖砌左。
2.不要重復(fù)創(chuàng)建不必要的table
cell娇钱。
3.減少視圖的數(shù)目。
4.不要做多余的繪制工作绊困。
5.預(yù)渲染圖像文搂。
6.不要阻塞主線程。當(dāng)然秤朗,在不需要響應(yīng)用戶請求時(shí)煤蹭,也可以增加下載線程數(shù),以加快下載速度:
318、簡要說下Http通信協(xié)議的原理硝皂,與Socket協(xié)議的區(qū)別有哪些常挚?
答:HTTP協(xié)議:簡單對象訪問協(xié)議,對應(yīng)于應(yīng)用層稽物,HTTP協(xié)議是基于TCP連接的
tcp協(xié)議:對應(yīng)于傳輸層
ip協(xié)議:對應(yīng)于網(wǎng)絡(luò)層
TCP/IP是傳輸層協(xié)議奄毡,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸;而HTTP是應(yīng)用層協(xié)議贝或,主要解決如何包裝數(shù)據(jù)吼过。
Socket是對TCP/IP協(xié)議的封裝,Socket本身并不是協(xié)議咪奖,而是一個(gè)調(diào)用接口(API)盗忱,通過Socket,才能使用TCP/IP協(xié)議羊赵。
http連接:http連接就是所謂的短連接趟佃,即客戶端向服務(wù)器端發(fā)送一次請求想罕,服務(wù)器端響應(yīng)后連接即會(huì)斷掉冈欢;
socket連接:socket連接就是所謂的長連接冒冬,理論上客戶端和服務(wù)器端一旦建立起連接將不會(huì)主動(dòng)斷掉蜜氨;但是由于各種環(huán)境因素可能會(huì)是連接斷開凄杯,比如說:服務(wù)器端或客戶端主機(jī)down了麻掸,網(wǎng)絡(luò)故障织狐,或者兩者之間長時(shí)間沒有數(shù)據(jù)傳輸骗绕,網(wǎng)絡(luò)防火墻可能會(huì)斷開該連接以釋放網(wǎng)絡(luò)資源芹血。
319贮泞、MVC是什么?有什么特性幔烛?你還熟悉哪些設(shè)計(jì)模式啃擦,請簡要說明。
他們有重復(fù)的
320饿悬、autorelease和垃圾回收機(jī)制(gc)有什么關(guān)系令蛉?
答:autorelease只是延遲釋放,gc是每隔一段時(shí)間詢問程序,看是否有無指針指向的對象,若有,就將它回收。他們兩者沒有什么關(guān)系狡恬。
321珠叔、假設(shè)類名為MyManager的類有以下單例方法,請寫出單例方法的實(shí)現(xiàn):+(MyManager *)sharedManager弟劲;
答:+ (MyManager*)sharedManager
{
static MyManager *sharedMyManagerInstance = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
sharedMyManagerInstance =[[self alloc] init];
});
return sharedMyManagerInstance;
}
322祷安、全局變量可不可以定義在可被多個(gè).C文件包含的頭文件中?為什么兔乞?
答:可以.在不適用static或者const(隱式static)情況下,變量的定義只能出現(xiàn)一次汇鞭,否則會(huì)導(dǎo)致重復(fù)定義凉唐。但卻可以聲明多次。因此全局變量不可以定義在頭文件中霍骄。因?yàn)楫?dāng)該頭文件被多個(gè)c文件包含的話台囱,會(huì)導(dǎo)致重復(fù)定義。因此一般做法是在某個(gè)特定的頭文件中聲明读整,而在另外一個(gè)特定的c文件中定義簿训。需要使用就包含前者。
323米间、TCP/IP通信建立的過程怎樣强品,端口有什么作用?
答:發(fā)出將建立通信會(huì)話的第一個(gè)數(shù)據(jù)包之前车伞,發(fā)送方主機(jī)上的TCP/IP協(xié)議執(zhí)行以下四個(gè)不同的步驟:
1.TCP/IP將主機(jī)名或NetBIOS名稱解析為IP地址。
2.使用目標(biāo)IP地址和IP路由表喻喳,TCP/IP確定要使用的接口和下一躍點(diǎn)IP地址另玖。
3.對于共享訪問技術(shù)(例如,以太網(wǎng)表伦、令牌環(huán)和分布式光纖數(shù)據(jù)接口(FDDI))上的單播IP流量谦去,地址解析協(xié)議(ARP)將下一躍點(diǎn)IP地址解析為媒體訪問控制(MAC)地址(也稱為數(shù)據(jù)鏈接層地址)。
對于以太網(wǎng)和FDDI上的多播IP流量蹦哼,目標(biāo)多播IP地址會(huì)被映射到相應(yīng)的多播MAC地址鳄哭。對于令牌環(huán)上的多播IP流量,使用功能地址0xC0-00-00-04-00-00纲熏。對于共享訪問技術(shù)上的廣播流量妆丘,MAC地址會(huì)被映射到0xFF-FF-FF-FF-FF-FF。4.之后局劲,IP數(shù)據(jù)報(bào)會(huì)被發(fā)送到通過ARP解析的MAC地址勺拣、多播映射或MAC級廣播地址。
網(wǎng)絡(luò)訪問要通過不同的協(xié)議進(jìn)行鱼填,各種協(xié)議要通過不同的端口進(jìn)行訪問药有,如25端口是郵件端口,3389超級終端(就是木馬程序最想打開的端口)苹丸,8000=騰訊OICQ服務(wù)器端等等很多很多愤惰,記住常用的幾個(gè)就可以了。
端口:說白了就相當(dāng)于門,每個(gè)門都對應(yīng)著相對的TCP/IP