標籤:
1.進程和線程的區別,說說線程管理。
- 進程:是活動的程式,是一個容器;是系統資源管理的最小單位;切換代價較高
- 線程:是在進程容器中運行,實際工作的代碼;是程式執行的最小單位;切換代價低
- 單線程:一個進程內只有一個線程;一個進程的資料通常載入在同一記憶體中!
- 多線程:一個進程內有多個線程;多個線程通常共用同一記憶體中的資料!
- 線程與進程切換的區別:線程完全共用相同的地址空間,切換代價低;進程的地址空間是獨立的,切換代價高
- 進程與線程之間的區別:
簡而言之,一個程式至少有一個進程,一個進程至少有一個線程.
線程的劃分尺度小於進程,使得多線程程式的並發性高。
另外,進程在執行過程中擁有獨立的記憶體單元,而多個線程共用記憶體,從而極大地提高了程式的運行效率。
線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程式啟動並執行入口、順序執行序列和程式的出口。但是線程不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個線程執行控制。
從邏輯角度來看,多線程的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分派。這就是進程和線程的重要區別。
進程是具有一定獨立功能的程式關於某個資料集合上的一次運行活動,進程是系統進行資源分派和調度的一個獨立單位.
線程是進程的一個實體,是CPU調度和指派的基本單位,它是比進程更小的能獨立啟動並執行基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程式計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共用進程所擁有的全部資源.
一個線程可以建立和撤銷另一個線程;同一個進程中的多個線程之間可以並發執行.
進程和線程的主要差別在於它們是不同的作業系統資源管理方式。進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變數,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,所以多進程的程式要比多線程的程式健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共用某些變數的並行作業,只能用線程,不能用進程。
- 線程的好處
(1)易於調度。
(2)提高並發性。通過線程可方便有效地實現並發性。進程可建立多個線程來執行同一程式的不同部分。
(3)開銷少。建立線程比建立進程要快,所需開銷很少。。
(4)利於充分發揮多處理器的功能。通過建立多線程進程(即一個進程可具有兩個或更多個線程),每個線程在一個處理器上運行,從而實現應用程式的並發性,使每個處理器都得到充分運行。
2.簡述MVC。
MVC是Model-VIew-Controller,就是模型-視圖-控制器。即Model,View,Controller。
Model = 你的程式是什麼,就是你的程式將要實現的功能,或者是它所能乾的事情;Controller = 如何使你的模型呈現給使用者(程式邏輯),是串連M和V的橋樑;View = 在螢幕上你所看到的,你在螢幕上看到的組件都可以歸類為View。
MVC可以協助確保協助實現程式最大程度的可重用性。各MVC元素彼此獨立運作,通過分開這些元素,可以構建可維護,可獨立更新的程式組建。
3.簡述KVO和KVC。
KVO,即:Key-Value Observing,它提供一種機制,當指定的對象的屬性被修改後,則對象就會接受到通知。簡單的說就是每次指定的被觀察的對象的屬性被修改後,KVO就會自動通知相應的觀察者了。
KVC是KeyValueCoding的簡稱,它是一種可以直接通過字串的名字(key)來訪問類屬性(執行個體變數)的機制。而不是通過調用Setter、Getter方法訪問。
MVC模型中,資料庫(dataModal)發生變化時,引起view改變,用這種方式實現非常方便,kvc 常和 kvo 一起使用
4. 編寫程式碼完成提取視圖(custom)的當前顯示內容為映像,並儲存到相簿中。
UIImageWriteToSavedPhotosAlbum([custom image], nil, nil,nil);
5.描述視圖控制器的兩層迴圈和每個方法的作用。
運行APP —> 載入視圖 —> 調用viewDidLoad方法 —> 調用viewWillAppear方法 —> 調用viewDidAppear方法 —> 正常運行
釋放對象所有權 <— 調用viewDidUnload <— 收到記憶體警告 <— 調用viewDidDisappear <— 調用viewWillDisappear <— APP需要調用另一個view
當我們建立一個UIViewController類的對象時,通常系統會產生幾個預設的方法,這些方法大多與視圖的調用有關,但是在視圖調用時,這些方法的調用順序如何,需要整理下。
通常上述方法包括如下幾種,這些方法都是UIViewController類的方法:
- (void)viewDidLoad;
- (void)viewDidUnload;
- (void)viewWillAppear:(BOOL)animated;
- (void)viewDidAppear:(BOOL)animated;
- (void)viewWillDisappear:(BOOL)animated;
- (void)viewDidDisappear:(BOOL)animated;
下面介紹下APP在運行時的調用順序。
1)- (void)viewDidLoad;
一個APP在載入時會先通過調用loadView方法或者載入IB中建立的初始介面的方法,將視圖載入到記憶體中。然後會調用viewDidLoad方法來進行進一步的設定。通常,我們對於各種初始資料的載入,初始設定等很多內容,都會在這個方法中實現,所以這個方法是一個很常用,很重要的方法。
但是要注意,這個方法只會在APP剛開始載入的時候調用一次,以後都不會再調用它了,所以只能用來做初始設定。
2) - (void)viewDidUnload;
在記憶體足夠的情況下,軟體的視圖通常會一直儲存在記憶體中,但是如果記憶體不夠,一些沒有正在顯示的viewcontroller就會收到記憶體不夠的警告,然 後就會釋放自己擁有的視圖,以達到釋放記憶體的目的。但是系統只會釋放記憶體,並不會釋放對象的所有權,所以通常我們需要在這裡將不需要在記憶體中保留的對象釋 放所有權,也就是將其指標置為nil。
這個方法通常並不會在視圖變換的時候被調用,而只會在系統退出或者收到記憶體警告的時候才會被調用。但是由於我們需要保證在收到記憶體警告的時候能夠對其作出反應,所以這個方法通常我們都需要去實現。
另外,即使在裝置上按了Home鍵之後,系統也不一定會調用這個方法,因為IOS4之後,系統允許將APP在後台掛起,並將其繼續滯留在記憶體中,因此,viewcontroller並不會調用這個方法來清除記憶體。
3)- (void)viewWillAppear:(BOOL)animated;
系統在載入所有資料後,將會在螢幕上顯示視圖,這時會先調用這個方法。通常我們會利用這個方法,對即將顯示的視圖做進一步的設定。例如,我們可以利用這個方法來設定裝置不同方向時該如何顯示。
另外一方面,當APP有多個視圖時,在視圖間切換時,並不會再次載入viewDidLoad方法,所以如果在調入視圖時,需要對資料做更新,就只能在這個方法內實現了。所以這個方法也非常常用。
4) - (void)viewDidAppear:(BOOL)animated;
有時候,由於一些特殊的原因,我們不能在viewWillApper方法裡,對視圖進行更新。那麼可以重寫這個方法,在這裡對正在顯示的視圖進行進一步的設定。
5) - (void)viewWillDisappear:(BOOL)animated;
在視圖變換時,當前視圖在即將被移除、或者被覆蓋時,會調用這個方法進行一些善後的處理和設定。
由於在IOS4之後,系統允許將APP在後台掛起,所以在按了Home鍵之後,系統並不會調用這個方法,因為就這個APP本身而言,APP顯示的view,仍是掛起時候的view,所以並不會調用這個方法。
6) - (void)viewDidDisappear:(BOOL)animated;
我們可以重寫這個方法,對已經消失,或者被覆蓋,或者已經隱藏了的視圖做一些其他動作。
6.使用Block變數,完成對NSArray執行個體對象array{@"abc",@"bcd",@"123",@"9987",} 從大到小排列。
[array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2){
return [obj1 compare:obj2];
}];
7.描述static修飾符、const修飾符的區別。
const :主要的目的是防止修改對象的內容,定義的常量在函數執行之後其空間會被釋放;
static主要的目的是作為類範圍的全域函數。不能訪問類的非待用資料成員,定義的靜態常量在函數執行後不會被釋放其空間。
8.JSON和XML介面上的區別以及資料模式
- 可讀性:JSON和XML的可讀性可謂不相上下,一邊是簡易的文法,一邊是規範的標籤形式,很難分出勝負。
- 可擴充性:XML天生有很好的擴充性,JSON當然也有,沒有什麼是XML能擴充,JSON不能的。不過JSON在Javascript主場作戰,可以儲存Javascript綜合物件,有著xml不可比擬的優勢。
- 編碼難度:XML有豐富的編碼工具,比如Dom4j、JDom等,JSON也有提供的工具。
- 是否易於在伺服器端建立資料:json相對於XML並不是望塵莫及,但還是略微遜色一籌;
- 是否易於在用戶端處理資料:請求返回的json格式響應資料是一件輕而易舉事情,可以很輕鬆的用KVC方法賦值獲得資料;處理XML響應資料,你得通過DOM樹,這是非常繁瑣且容易出錯的工作;
- 安全性:兩者差不多
資料模式:
JSON和XML的輕/重量級的區別在於:JSON只提供整體解析方案,而這種方法只在解析較少的資料時才能起到良好的效果;而XML提供了對大規模資料的逐步解析方案,這種方案很適合於對大量資料的處理。
在編碼上,雖然XML和JSON都有各自的編碼工具,但是JSON的編碼要比XML簡單,即使不藉助工具,也可以寫出JSON代碼,但要寫出好的 XML代碼就有點困難;與XML一樣,JSON也是基於文本的,且它們都使用Unicode編碼,且其與資料交換格式XML一樣具有可讀性。
主觀上來看,JSON更為清晰且冗餘更少些。JSON網站提供了對JSON文法的嚴格描述,只是描述較簡短。從總體來看,XML比較適合於標記文檔,而JSON卻更適於進行資料交換處理。
9.NSNotification的實現原理。
NSNotificationCenter 較之於 Delegate 可以實現更大的跨度的通訊機制,可以為兩個無參考關聯性的兩個對象進行通訊。NSNotificationCenter 的通訊原理使用了觀察者模式:
1. NSNotificationCenter 註冊觀察者對某個事件(以字串命名)感興趣,及該事件觸發時該執行的 Selector 或 Block
2. NSNotificationCenter 在某個時機激發事件(以字串命名)
3. 觀察者在收到感興趣的事件時,執行相應的 Selector 或 Block
10.用obj-c 寫一個冒泡排序。
NSMutableArray *p = [NSMutableArray arrayWithObjects:@"12",@"22",@"52",@"42",@"72",nil];
for (int i = 0; i< [p count] - 1; i++)
{
for (int j=0; j<[p count] - i - 1; j++)
{
int a = [[p objectAtIndex:i] intValue];
int b = [[p objectAtIndex:j] intValue];
if (a > b)
{
int temp = a;
[p replaceObjectAtIndex:i withObject:[NSString stringWithFormat:@"%d",b]];
[p replaceObjectAtIndex:j withObject:[NSString stringWithFormat:@"%d",temp]];
}
}
}
11.簡述一下ARC.
ARC是iOS 5推出的新功能,全稱叫 ARC(Automatic Reference Counting)。簡單地說,就是代碼中自動加入了retain/release,原先需要手動添加的用來處理記憶體管理的引用計數的代碼可以自動地由編譯器完成了。
使用ARC有什麼好處呢?
- 看到上面的例子,大家就知道了,以後寫Objective-C的代碼變得簡單多了,因為我們不需要擔心煩人的記憶體管理,擔心記憶體泄露了
- 代碼的總量變少了,看上去清爽了不少,也節省了勞動力
- 代碼高速化,由於使用編譯器管理引用計數,減少了低效代碼的可能性
12.網路的同步、非同步串連有什麼區別。
- 同步請求可以從網際網路請求資料,一旦發送同步請求,程式將停止使用者互動,直至伺服器返回資料完成,才可以進行下一步操作,
- 非同步請求不會阻塞主線程,而會建立一個新的線程來操作,使用者發出非同步請求後,依然可以對UI進行操作,程式可以繼續運行
13.Core Animation這個架構的作用。
它是一套包含圖形繪製,投影,動畫的OC類集合。它就是一個framework。通過CoreAnimation提供的介面,你可以方便完成自己所想要的動畫。
14.從程式包種讀取檔案,初始化一個資料data.
data = [NSData dataWithContentsOfFile:thepath];
擴充:
//第一種方法: NSFileManager執行個體方法讀取資料
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES);
NSString* thepath = [paths lastObject];
thepath = [thepath stringByAppendingPathComponent:@
"fd_list.txt"
];
NSLog(@
"案頭目錄:%@"
, thepath);
NSFileManager* fm = [NSFileManager defaultManager];
NSData* data = [[NSData alloc] init];
data = [fm contentsAtPath:thepath];
NSLog(@
"%@"
,[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
//第二種方法: NSData類方法讀取資料
data = [NSData dataWithContentsOfFile:thepath];
NSLog(@
"NSData類方法讀取的內容是:%@"
,[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
//第三種方法: NSString類方法讀取內容
NSString* content = [NSString stringWithContentsOfFile:thepath encoding:NSUTF8StringEncoding error:nil];
NSLog(@
"NSString類方法讀取的內容是:\n%@"
,content);
//第四種方法: NSFileHandle執行個體方法讀取內容
NSFileHandle* fh = [NSFileHandle fileHandleForReadingAtPath:thepath];
data = [fh readDataToEndOfFile];
NSLog(@
"NSFileHandle執行個體讀取的內容是:\n%@"
, [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
15.簡述屬性的設定選項的作用,nonatomic,atomic,assign,retain,copy,read,readwrite,readonly
atomic:
原子操作(原子性是指事務的一個完整操作,操作成功就提交,反之就復原. 原子操作就是指具有原子性的操作)在objective-c 屬性設定裡面 預設的就是atomic ,意思就是 setter /getter函數是一個原子操作,如果多線程同時調用setter時,不會出現某一個線程執行完setter所有語句之前,另一個線程就開始執行setter,相當於 函數頭尾加了鎖 . 這樣的話 並發訪問效能會比較低 .
nonatomic:
非原子操作 一般不需要多線程支援的時候就用它,這樣在 並發訪問的時候效率會比較高 . 在objective-c裡面通常物件類型都應該聲明為非原子性的. iOS中程式啟動的時候系統只會自動產生一個單一的主線程.程式在執行的時候一般情況下是在同一個線程裡面對一個屬性進行操作. 如果在程式中 我們確定某一個屬性會在多線程中被使用,並且需要做資料同步,就必須設定成原子性的,但也可以設定成非原子性的,然後自己在程式中用加鎖之類的來做資料同步.
在標頭檔中聲明屬性的時候使用atomic 和 nonatomic等價於在標頭檔裡面添加2個函數一個是用於設定這個屬性的,一個是用於讀取這個屬性,例如:- (nsstring *)name; - (void)setName:(NSString *)str;
atomic / nonatomic 需要和@synthesize/@dynamic配和使用才有意義.
@synthesize
如果沒有實現setter和getter方法,編譯器將會自動在生產setter和getter方法。
@dynamic
表示變數對應的屬性訪問器方法 , 是動態實 現的 , 你需要在 NSObject 中繼承而來的 +(BOOL) resolveInstanceMethod:(SEL) sel 方法中指定 動態實現的方法或者函數。
屬性修飾其他關鍵字:
getter=getterName
指定 get 方法,並需要實現這個方法 。必須返回與宣告類型相同的變數,沒有參數
setter=setterName
指定 set 方法,並需要實現這個方法 。帶一個與宣告類型相同的參數,沒有傳回值(返回空值)
當聲明為 readonly 的時候,不能指定 set 方法
readwrite
如果沒有聲明成 readonly ,那就 預設是 readwrite 。可以用來賦值,也可以被賦值
readonly
不可以被賦值
assign
所有屬性都 預設 assign ,通常用於標量(簡單變數 int , float , CGRect 等)
一種典型情況是用在對對象沒有所有權的時候,通常是 delegate ,避免造成死迴圈(如果用 retain 的話會死迴圈)
retain
屬性必須是 objc 對象,擁有對象所有權,必須在 dealloc 中 release 一次。
copy
屬性必須是 objc 對象,擁有對象所有權,必須在 dealloc 中 release 一次。且屬性必須實現 NSCopying 協議
一般常用於 NSString 類型
iOS面試題之一