11.深拷貝和淺拷貝的理解.
深拷貝;拷貝的內容.
淺拷貝:拷貝的指針.
深拷貝如:
NSMutableDictionary? * dic = [@{} mutableCopy];
NSMutableArray? * ary = [@[] mutableCopy];
12.怎么實現一個singleton的類.
單例是一種設計模式,對象只有一個.缺點:對象不會被釋放,如果創建很多的話會占用很多內存,優點:可以當做工具類使用.
static SortDetailsModelDown * single = nil;
+(SortDetailsModelDown *)shareSortDetailsModelDown{
@synchronized(self){
if (!single) {
single = [[SortDetailsModelDown alloc]init];
}
}
return single;
}
13.什么是安全釋放?
先釋放再置空.
14.RunLoop是什么?
事件循環,是線程里面的一個組件.主線程的RunLoop是自動開啟的.分為:計時源(timer source),事件源(輸入源):input source.防止CPU中斷(保證程序執行的線程不會被系統終止).
Runloop提供了一種異步執行代碼的機制,并不能并行執行任務,是事件接收和分發機制的一個實現.每一個線程都有其對應的RunLoop,但是默認非主線程的RunLoop是沒有運行的,需要為RunLoop添加至少一個事件源,然后run它.
一般情況下我們是沒有必要去啟動線程的RunLoop的,除非你在一個單獨的線程中需要長時間的檢測某個事件.
RunLoop,正如其名所示,是線程進入和被線程用來響應事件以及調用事件處理函數的地方.
input source傳遞異步事件,通常是來自其他線程和不同程序的消息.
timer source傳遞同步事件.
當有事件發生時,RunLoop會根據具體的事件類型通知應用程序作出響應.
當沒有事件發生時,RunLoop會進入休眠狀態,從而到達省電的目的.
當事件再次發生時,RunLoop會被重新喚醒,處理事件.
一般在開發中很少會主動創建RunLoop,而通常會把事件添加到RunLoop中.
15.什么是序列化和反序列化,可以用來做什么?如何在OC中實現復雜對象的存儲.
序列化和反序列化:歸檔和反歸檔,進行本地化,進行數據存儲.
CoreData:數據托管.有四種存儲方式:xml,sqlite,二進制,內存.
遵循NSCoding協議之后,進行歸檔即可實現復雜對象的存儲.
16.寫一個標準宏MIN,這個宏輸入兩個參數并返回較小的一個.
#define MIN(A,B) (A)>(B)?(B):(A)
17.iPhone OS 有沒有垃圾回收機制,簡易闡述一下OC內存管理.
木有.引用計數,ARC和MRC,swift(自動引用計數).
18.簡述應用程序按HOME鍵進入后臺時的生命周期,以及從后臺進入前臺時的生命周期.
前者:- (void)applicationWillResignActive:(UIApplication *)application
- (void)applicationDidEnterBackground:(UIApplication *)application
后者:- (void)applicationWillEnterForeground:(UIApplication *)application
- (void)applicationDidBecomeActive:(UIApplication *)application
另:
各個程序運行狀態時代理的回調:
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
告訴代理進程啟動但還沒進入狀態保存
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
告訴代理啟動基本完成程序準備開始運行
- (void)applicationWillResignActive:(UIApplication *)application
當應用程序將要入非活動狀態執行,在此期間,應用程序不接收消息或事件,比如來電話了
- (void)applicationDidBecomeActive:(UIApplication *)application
當應用程序入活動狀態執行,這個剛好跟上面那個方法相反
- (void)applicationDidEnterBackground:(UIApplication *)application
當程序被推送到后臺的時候調用。所以要設置后臺繼續運行,則在這個函數里面設置即可
- (void)applicationWillEnterForeground:(UIApplication *)application
當程序從后臺將要重新回到前臺時候調用,這個剛好跟上面的那個方法相反。
- (void)applicationWillTerminate:(UIApplication *)application
當程序將要退出是被調用,通常是用來保存數據和一些退出前的清理工作。這個需要要設置UIApplicationExitsOnSuspend的鍵值。
- (void)applicationDidFinishLaunching:(UIApplication*)application
當程序載入后執行
在上面8個方法對應的方法中鍵入NSLog打印。
現在啟動程序看看執行的順序:
啟動程序
lifeCycle[40428:11303] willFinishLaunchingWithOptions
lifeCycle[40428:11303] didFinishLaunchingWithOptions
lifeCycle[40428:11303] applicationDidBecomeActive
按下home鍵
lifeCycle[40428:11303] applicationWillResignActive
lifeCycle[40428:11303] applicationDidEnterBackground
雙擊home鍵,再打開程序
lifeCycle[40428:11303] applicationWillEnterForeground
lifeCycle[40428:11303] applicationDidBecomeActive
19.ViewController的alloc,loadView,viewDidLoad,viewWillAppear,viewDidUnload,dealloc,init分別是在什么時候調用?在自定義ViewController的時候這幾個函數里面應該做什么工作?
alloc:申請內存時調用.
loadView:加載視圖時調用.
viewDidLoad;視圖已經加載后調用.
viewWillAppear:視圖將要出現時調用.
viewDidUnload:視圖已經加載但是沒有加載出來時調用.
dealloc:銷毀該視圖時調用.
init;初始化該視圖時調用.
20.描述應用程序的啟動順序.
a.程序入口main函數創建UIApplication實例和UIApplication代理實例.
b.在UIApplication代理實例中重寫啟動方法,設置根ViewController
c.在第一ViewController中添加控件,實現應用程序界面.