1.簡述OC中內存管理機制
OC的內存管理機制是自動引用技術,內存管理的原則是誰開辟誰釋放,分為ARC和MRC,MRC的話就是需要我們程序員手動管理內存,ARC不需要我們手動管理內存,系統會自行管理。
2.readwrite,readonly,assign,retain,copy,nonatomic、atomic、strong、weak屬性的作用?
readWrite讀寫特性,可讀可寫.
readonly只讀,只有getter,沒有setter.
assign一般用於基本數據類型和ID類型.
copy拷貝,一般用於NSString.分為深拷貝和淺拷貝,深拷貝拷貝的是對象,淺拷貝拷貝的是指針.
nonatomic非原子性,不考慮線程安全,優點是效率高.
atomic原子性,優點是線程安全,缺點是效率低.
strong強引用,和MRC下的retain一樣.weak弱引用,類似MRC下的assign.但是要注意的是strong和weak都是修飾對象類型的屬性的,不能修飾基本數據類型.ARC下仍然使用assign修飾基本數據類型.
3.關於iOS多線程問題
仔細閱讀:http://www.cocoachina.com/ios/20150731/12819.html
4.提升UITableView性能的幾點建議
1.cell高度計算 (可以先根據內容高度數組,返回cell時直接用數組返回高度)
2.cells的重用
3.cell快速滑動的時候不加載圖片,停止滑動的時候加載圖片
4.避免阻塞主線程
5.緩存下載的圖片
6.不要過多使用Xib(如果可以的話使用storyboard)
7.使用CoreGraphics
8.透明度
也可仔細閱讀:http://www.cocoachina.com/ios/20150729/12795.html
6. 線程同步和異步的區別?
同步:一個線程要等待上一個線程執行完之後才能執行,生活中的例子(上廁所)。
異步:同時去做兩個或者多個線程。比如邊聽歌邊看報。
7.堆和棧的區別?
棧區(stack)--由編譯器自動分配釋放,存放函數的參數值、局部變量的值。先進後出
堆區(heap)--一般由程序員分配釋放。先進先出
全局區(靜態區)(static)--全局變量和靜態變量。程序結束後由系統釋放。
文字常量區--常量字符串存放在這裡。程序結束後由系統釋放。
程序代碼區—存放函數體的二進制文件。
8.iOS類是否可以多繼承?
不可以,可以通過delegate和protocol和類目來實現類似多繼承。
9.iOS本地數據存儲都有哪幾種方式?iOS如何實現復雜對象的存儲?
1.Write寫入方式:永久保存在磁盤中。只支持NSString、NSData、NSArray、NSDictionary。
2.NSKeyedArchiver(歸檔)采用歸檔的形式來保存數據,該數據對象需要遵守NSCoding協議
3.SQLite(FMDB)注意FMDB不是數據庫,而是一個SQLITE管理框架.
4.CoreData切記coredata不是數據庫,他的存儲核心思想是托管對象。只是咱們經常用的存儲文件為SQLite.還可以用XML,二進制等方式.
10.iOS的動態性
1.動態類型。如id類型。實際上靜態類型因為其固定性和可預知性而使用得更加廣泛。靜態類型是強類型,而動態類型屬於弱類型。運行時決定接收者。
2. 動態綁定。讓代碼在運行時判斷需要調用什麼方法,而不是在編譯時。
3. 動態載入。讓程序在運行時添加代碼模塊以及其他資。
11.深拷貝和淺拷貝的理解?
深拷貝拷貝的是內容,淺拷貝拷貝的是指針。如果子類對象的地址改變就是深拷貝反之淺拷貝。
12.什麼是安全釋放
在對象dealloc中release之後再把指針置為nil
13.怎樣實現一個singleton。
+(ZMYSingleton*)sharedInstance{
staticLOSingleton*sharedInstance=nil;
staticdispatch_once_tonceToken; //線程鎖
dispatch_once(&onceToken,^{
//最多調用一次
sharedInstance=[[ZMYSingletonalloc]init];
});
returnsharedInstance;
}
13.RunLoop是什麼?
一個RunLoop就是一個事件處理的循環,用來不停的調度工作以及處理輸入時間。使用runloop的目的是讓你的線程在有工作的時候忙於工作,而沒工作的時候處於休眠狀態。主要是是為了減少 cpu無謂的空轉。每個線程都有Runloop,主線程的Runloop時默認開啟的,手動開辟的子線程Runloop是默認不開啟 的,如果需要開啟,需要調用API[[NSRunloopcurrentRunloop]run]開啟.
最常見的需要開啟Runloop的是在子線程裡面調用計時器(NSTimer),如果不開啟runloop循環方法就不能正常執行.
14.寫一個標准宏MIN,這個宏輸入兩個參數並返回較小的一個?
#definekMIN(X,Y)((X)>(Y))?(Y):(X)
15.簡述應用程序按Home鍵進入後台時的生命周期,以及從後台回到前台時的生命周期?
進入後台生命周期走:
-(void)applicationWillResignActive:(UIApplication*)application;
-(void)applicationDidEnterBackground:(UIApplication*)application;
回到前台生命周期走:
-(void)applicationWillEnterForeground:(UIApplication*)application;
-(void)applicationDidBecomActive:(UIApplication*)application;
16.ViewController的loadView,viewDidLoad,viewWillAppear,viewDidUnload,dealloc、init分別是在什麼時候調 用的?在自定義ViewController的時候這幾個函數裡面應該做什麼工作?
loadView:沒有正在使用nib視圖頁面,子類將會創建自己的自定義視圖層
viewDidLoad:試圖被加載後調用
viewWillAppear:試圖即將出現的時候調用
viewDidUnload:
17.描述應用程序的啟動順序。
1、main函數創建UIApplication實例和UIApplication代理實例
2、在UIApplication代理實例中重寫啟動方法,設置第一ViewController
3、在第一ViewController中添加控件,實現對應的程序界面。
18.為什麼寫代理的屬性都是assign而不是retain?請舉例說明。
防止循環引用,
Teacher*teacher=[[Teacheralloc]init];
Student*student=[[Studentalloc]init];t
eacher.delegate=student;
student.delegate=teacher;
在teacher中dealloc會release當前的Delegate,就會觸發student對象release,繼而也會導致student執行dealloc,在student中也會release自己的delegate,產生循環了。
19.UIImage初始化一張圖片有幾種方法?簡述各自的優缺點。
兩種:
1、從資源讀取,先在緩存裡面查看圖片是否存在,沒有的話將圖片添加進緩存再使用.有的話直接使用緩存裡的.圖片用的次數比較多,使 用這種方式.缺點是效率低下.UIImage*image=[UIImageimageNamed:@”1.png”];
2.從手機本地讀取,直接加 載圖片.在圖片使用率低的圖片時使用. //讀取本地圖片非resourceNSString*aPath3=[NSStringstringWithFormat:@"%@/Documents/%@.jpg",NSHomeDirectory(),@"test"];[UIImageimageWithContentsOfFile:aPath3]
20.這段代碼有什麼問題嗎:
@implementationPerson
-(void)setAge:(int)newAge{
self.age=newAge;
}
@end
死循環
21.用OC寫一個冒泡排序
NSMutableArray *array = [NSMutableArrayarrayWithArray:@[@"3",@"1",@"10",@"5",@"2",@"7",@"12",@"4",@"8"]];
for (inti = 0; i < array.count;i ++) {
for (intj = 0; j < array.count- 1 - i; j++) {
if([[array objectAtIndex:j]integerValue] > [[array objectAtIndex:j + 1]integerValue]) {
[arrayexchangeObjectAtIndex:j withObjectAtIndex:j + 1];
}
}
}
NSLog(@"%@",array);
22.簡述你對UIView、UIWindow和CALayer的理解
UIView繼承於UIResponder,而UIResponder繼承於NSObject,可以響應用戶事件。UIView構建界面,用來顯示內容,側重於對內容的管理。
CALayer繼承於NSObject,不能響應事件。側重於對內容的繪制,以及對內容進行動畫處理,依賴於UIView來顯示。
UIWindow是特殊的UIView,通常一個app只有一個UIWindow,我們可以創建一個視圖控制器,並添加到 UIWindow上面,這樣的話這個視圖控制器就是app的第一響應者(First Responder).
23.frame和bounds區別:
frame:view在父視圖坐標 中的位置
bounds:view在本地坐標中的位置
center:view的中心點在父視圖中的位置
也可仔細閱讀:http://blog.csdn.net/mad1989/article/details/8711697
24.寫一個完整的代理
25.分析json、xml的區別?json、xml解析方式的底層是如何處理的?
XML是擴展通用標記語言(SGML),適合Web傳輸。提供統一的方法來描述和交換數據。
JSON(JavaScriptObjectNotation)一種輕量級的數據交換格式,具有良好的可讀和便於快速編寫的特性。可在不同平台之間進行數據交換。
26.ViewController的didReceiveMemoryWarning是在什麼時候被調用的?默認的操作是什麼?
在出現內存警告的時候調用,釋放掉暫時沒使用的可重用對象。這個方法不能手動調用!!!
27.面向對象的三大特征,並作簡單的介紹
封裝、繼承、多態。
封裝:是把客觀事物封裝成抽象的類,隱藏內部的實現,對外部提供接口。
繼承:可以使用現有類的所有功能,並且在無需重新編寫原來的類的情況下對這些功能進行擴展。
多態:不同的對象以自己的方式響應相同的的消息叫做多態。
28.簡單說一下懶加載
用到的時候初始化,不用的話不初始化只是一個指針,不占用內存空間
29.分別描述類目(categories)和延展(extensions)是什麼?以及兩者的區別?繼承和類目在實現中有何區別?為什麼Category只能為對象添加方法,卻不能添加成員變量?
category類目:在不知道源碼的情況下為一個類擴展方法,
extension:為一個類聲明私有方法和變量。
繼承是創建了一個新的類。
30.#import、#include和@class有什麼區別
#includeC語言中引入頭文件,可能出現交叉編譯
#import在OC中引入自己創建的頭文件
#import””是引入自己創建類的頭文件
#import<>是引入系統類的頭文件
#import不會出現交叉編譯
@class對一個類進行聲明,告訴編譯器有這個類,但是類的定義什麼的都不知道.
31.談談你對MVC的理解?為什麼要用MVC?在Cocoa中MVC是怎麼實現的?你還熟悉其他的OC設計模式或別的設計模式嗎?
MVC是Model-VIew-Controller模型-視圖-控制器。 model數據模型,view是對這些數據的顯 示,viewcontroller就是把model拿到view中顯示,起到model和view之間橋梁的作用。MVC可以實現程序最大程 度的可重用性。MVC各元素分開也能便於代碼的更新、維護以及提高代碼的重用性.
單例模式,delegate設計模式,target-action設計模式
32.字符串替換方法:
[stringstringByReplacingOccurrencesOfString:@"png"withString:@""]
33.對於語句NSString*testObject=[[NSDataalloc]init]; testObject在編譯時和運行時分別是什麼類型的對象?
編譯的時候是NSString類型,運行的時候是NSData類型
34.什麼是沙盒(sandbox)?沙盒包含哪些文件,描述每個文件的使用場景。如何獲取這些文件的路徑?如何獲取應用程序包中文件的路徑?
iOS應用程序只能在為該程序創建的文件系統中讀取文 件,不可以去其它地方訪問,此區域就是沙盒,用來保存所有的非代碼文件。(例如圖像,圖標,聲音,映像,屬性列表,文本文件等。)
默認每個沙盒有3個文件夾:Documents,Library和tmp。
Documents:保存程序中建立的或在程序中浏覽到的文件數據
iTunes備份和恢復的時候會包括此目錄
Library/Caches:存放緩存文件,iTunes不會備份此目錄,目錄下文件在應用退出時不刪除
tmp:提供一個即時創建臨時文件的地方。
iTunes在與iPhone同步時,備份所有的Documents和Library文件。
iPhone在重啟時,會丟棄所有的tmp文件。
35.isKindOfClass、isMemberOfClass作用分別是什麼?
-(BOOL)isKindOfClass:classObj判斷是否是這個類或者是這個類子類的實例
-(BOOL)isMemberOfClass:classObj判斷是否是這個類的實例
36.iOS中UIViewController的生命周期及iOS程序執行順序:
視圖控制對象生命周期
init-初始化程序
viewDidLoad-加載視圖
viewWillAppear-UIViewController對象的視圖即將加入窗口時調用;
viewDidApper-UIViewController對象的視圖已經加入到窗口時調用;
viewWillDisappear-UIViewController對象的視圖即將消失、被覆蓋或是隱藏時調用;
viewDidDisappear-UIViewController對象的視圖已經消失、被覆蓋或是隱藏時調用;
viewVillUnload-當內存過低時,需要釋放一些不需要使用的視圖時,即將釋放時調用;
viewDidUnload-當內存過低,釋放一些不需要的視圖時調用。
具體可參考:http://blog.csdn.net/huifeidexin_1/article/details/7566226
37. 簡述多線程。
答:Grand Central Dispatch簡稱GCD 解決多核並行運算的一種方案,主要有兩種隊列:並行、串行。
NSOperationQueue以隊列的形式實現了多線程,基於GCD的封裝。
NSThread 輕量級多線程,不常用 缺點:需要自己管理線程的生命周期,線程同步。線程同步對數據的加鎖會有一定的系統開銷
39. 該問題涉及編譯器的“內存對齊”問題:
例如:
對於結構體來說,按成員中所占字節最大的是float類型,占用4個字節,一共有3個成員,所以總的占用字節為:4*3=12.可通過編譯器命令來設定: #progmapack(2)
40. TCP/IP 建立連接的過程:
在TCP/IP協議中,TCP協議提供可靠的連接服務,采用三次握手建立連接;
第一次握手:建立連接時,客戶端發送連接請求到服務器,並進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器收到客戶端連接請求,向客戶端發送允許連接應答,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的允許連接應答,向服務器發送確認,客戶端和服務器進入通信狀態,完成三次握手。
(所謂的三次握手,就是要有三次連接信息的發送、接收過程。TCP連接的建立需要進行三次連接信息的發送、接收。)
41.什麼是UDP和TCP的區別是什麼?
TCP 的全稱是傳輸控制協議,這種協議可以提供面向連接的、可靠的、點到點的通信。
UDP 的全稱是用戶數據包協議。他可以提供非連接的不可靠的點到多點的通信,是osi參考模型中一種無連接的傳輸層協議,提供面向事務的簡單的不可靠信息傳輸,_IETFRFC 768 是UDP 的正式規范;
選擇何種協議,看程序注重那個方面,可靠抑或快速。
42.static關鍵字的作用
靜態全局變量
優點:
1、節省內存。靜態變量只存儲一處,但供所有對象使用。
2、它的值是可以更新的。
3、可提高時間效率。只要某個對象對靜態變量更新一次,所有的對象都能訪問更新後的值。
43.iOS系統框架分為幾層,分別是什麼
1、Core OS是核心操作系統層,包括內存管理、文件系統、電源管理以及一些其他的操作系統任務。
2、Core Services是核心服務層,用來訪問iOS的一些服務。
3、Media是媒體層,通過它我們可以在應用程序中使用各種媒體文件,進行音頻與視頻的錄制,圖形的繪制,以及制作基礎的動畫效果。
4、Cocoa Touch是可觸摸層,本質上來說它負責用戶在iOS設備上的觸摸交互操作。