父類完成深拷貝時,子類如何完成深度拷貝。父類沒有完成深拷貝時,子類如何完成深度拷貝。
• 深拷貝同淺拷貝的區別:淺拷貝是指針拷貝,對一個對象停止淺拷貝,相當於對指向對象的指針停止復制,發生一個新的指向這個對象的指針,那麼就是有兩個指針指向同一個對象,這個對象銷毀後兩個指針都應該置空。深拷貝是對一個對象停止拷貝,相當於對對象停止復制,發生一個新的對象,那麼就有兩個指針辨別 指向兩個對象。當一個對象改動或許被銷毀後拷貝出來的新的對象不受影響。
• 完成深拷貝需求完成NSCoying協議,完成- (id)copyWithZone:(NSZone *)zone 辦法。當對一個property屬性含有copy修飾符的時分,在停止賦值操作的時分實踐上就是調用這個辦法。
• 父類完成深拷貝之後,子類只需重寫copyWithZone辦法,在辦法外部調用父類的copyWithZone辦法,之後完成自己的屬性的處置
• 父類沒有完成深拷貝,子類除了需求對自己的屬性停止處置,還要對父類的屬性停止處置。
KVO,NSNotification,delegate及block區別
• KVO就是cocoa框架完成的察看者形式,普通同KVC搭配運用,經過KVO可以監測一個值的變化,比方View的高度變化。是一對多的關系,一個值的變化會告訴一切的察看者。
• NSNotification是告訴,也是一對多的運用場景。在某些狀況下,KVO和NSNotification是一樣的,都是形態變化之後告知對方。NSNotification的特點,就是需求被察看者先自動收回告訴,然後察看者注冊監聽後再來停止呼應,比KVO多了發送告訴的一步,但是其優 點是監聽不局限於屬性的變化,還可以對多種多樣的形態變化停止監聽,監聽范圍廣,運用也更靈敏。
• delegate 是代理,就是我不想做的事情交給他人做。比方狗需求吃飯,就經過delegate告訴主人,主人就會給他做飯、盛飯、倒水,這些操作,這些狗都不需求關 心,只需求調用delegate(代理人)就可以了,由其他類完成所需求的操作。所以delegate是一對一關系。
• block是delegate的另一種方式,是函數式編程的一種方式。運用場景跟delegate一樣,相比delegate更靈敏,而且代理的完成更直觀。
• KVO普通的運用場景是數據,需求是數據變化,比方股票價格變化,我們普通運用KVO(察看者形式)。delegate普通的運用場景是行為,需求是需求他人幫我做一件事情,比方買賣股票,我們普通運用delegate。
Notification 普通是停止全局告訴,比方利好音訊一出,告訴大家去買入。delegate是強關聯,就是委托和代理單方相互知道,你委托他人買股票你就需求知道經紀人, 經紀人也不要知道自己的顧客。Notification是弱關聯,利好音訊收回,你不需求知道是誰發的也可以做出相應的反響,同理發音訊的人也不需求知道 接納的人也可以正常收回音訊。
將一個函數在主線程執行的4種辦法
• GCD辦法,經過向主線程隊列發送一個block塊,使block裡的辦法可以在主線程中執行。
dispatch_async(dispatch_get_main_queue(), ^{
需求執行的辦法
});
• NSOperation 辦法
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue]; 客隊列
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
需求執行的辦法
}];
[mainQueue addOperation:operation];
• NSThread 辦法
[self performSelector:@selector(method) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES modes:nil];
[self performSelectorOnMainThread:@selector(method) withObject:nil waitUntilDone:YES];
[[NSThread mainThread] performSelector:@selector(method) withObject:nil];
• RunLoop辦法
[[NSRunLoop mainRunLoop] performSelector:@selector(method) withObject:nil];
如何讓計時器調用一個類辦法
• 計時器只能調用實例辦法,但是可以在這個實例辦法外面調用靜態辦法。
• 運用計時器需求留意,計時器一定要參加RunLoop中,並且選好model才干運轉。scheduledTimerWithTimeInterval辦法創立一個計時器並參加到RunLoop中所以可以直接運用。
• 假如計時器的repeats選擇YES闡明這個計時器會反復執行,一定要在適宜的機遇調用計時器的invalid。不能在dealloc中調用, 由於一旦設置為repeats 為yes,計時器會強持有self,招致dealloc永遠不會被調用,這個類就永遠無法被釋放。比方可以在viewDidDisappear中調用,這 樣當類需求被回收的時分就可以正常進入dealloc中了。
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES];
-(void)timerMethod
{
調用類辦法
[[self class] staticMethod];
}
-(void)invalid
{
[timer invalid];
timer = nil;
}
如何重寫類辦法
• 1、在子類中完成一個同基類名字一樣的靜態辦法
• 2、在調用的時分不要運用類名調用,而是運用[self class]的方式調用。原理,用類名調用是早綁定,在編譯期綁定,用[self class]是晚綁定,在運轉時決議調用哪個辦法。
NSTimer創立後,會在哪個線程運轉。
• 用scheduledTimerWithTimeInterval創立的,在哪個線程創立就會被參加哪個線程的RunLoop中就運轉在哪個線程
• 自己創立的Timer,參加到哪個線程的RunLoop中就運轉在哪個線程。
id和NSObject*的區別
• id是一個 objc_object 構造體指針,定義是typedef struct objc_object *id
• id可以了解為指向對象的指針。一切oc的對象 id都可以指向,編譯器不會做類型反省,id調用任何存在的辦法都不會在編譯階段報錯,當然假如這個id指向的對象沒有這個辦法,該解體還是會解體的。
• NSObject *指向的必需是NSObject的子類,調用的也只能是NSObjec外面的辦法否則就要做強迫類型轉換。
• 不是一切的OC對象都是NSObject的子類,還有一些承繼自NSProxy。NSObject *可指向的類型是id的子集。
以下內容後續補充
IOS 中心框架
• CoreAnimation
• CoreGraphics
• CoreLocation
• AVFoundation
• Foundation
IOS中心機制
• UITableView 重用
• ObjC內存管理;自動釋放池,ARC如何完成
• runloop
• runtime
• Block的定義、特性、內存區域、如何完成
• Responder Chain
• NSOperation
• GCD
數據構造
• 8大排序算法
• 二叉樹完成
• 二分查找完成
面向對象編程
• 封裝、承繼、多態
• 設計形式6個准繩
• 設計一個類的功用,如何劃分粒度(單一職責)
• 接口隔離。
• 假如有一個鳥類,有飛的舉措,一個鴕鳥承繼它是適宜的嗎(裡氏交換)
• 類之間的依賴如何依賴巧合度最小(依賴倒轉)
高層依賴低層,低層不能依賴高層。依賴接口,不能依賴詳細的類。
• 假如A要調用C函數,但C是B的成員類,應該如何設計?(迪米特規律)
• 如何設計類,能做到只添加代碼,而不修正代碼,有哪些經歷(開放封鎖)
經過設計形式處理。
計算機技術
• 計算機網絡:TCP/IP、HTTPCDN、SPDY
• 計算機平安:RSA、AES、DES
• 操作零碎:線程、進程、堆棧、死鎖、調度算法
IOS新特性、新技術
• iOS7 UIDynamic、SpritKit、新規劃、扁平化
• iOS8 使用順序擴展、HealthKit、SceneKit、CoreLocation、TouchID、PhotoKit
• iOS9
• Apple Watch
• 第三方庫:SDWebImage、A.network、JSONKit、wax
**********************筆記**********************
************************************************
簡述OC中內存管理機制.
答:內存管理機制:運用援用計數管理,分為ARC和MRC,MRC需求順序員自己管理內存,ARC則不需求.但是並不是一切對象在ARC環境下均不需求管理內存,子線程和循環援用並不是這樣.與retain配對運用的是release,retain代表援用計數+1,release代表援用計數-1,當援用計數減為0時,對象則被零碎自動銷毀.與alloc配對運用的是dealloc,alloc代表為對象開拓內存空間,dealloc則代表銷毀對象的內存空間.
2.readwrite,readonly,assign,retain,copy,nonatomic,atomic,strong,weak的作用?
答:讀寫屬性:readonly和readwrite; 語義屬性:assign/retain/copy; 原子性:nonatomic.
①.readwrite代表可讀,可寫,即有setter和getter辦法,是默許屬性.readonly代表只可讀,即只要get辦法,由於不會生成setter辦法,所以它不可以和copy/retain/assign組合運用.
②.weak和assign均是弱援用,assign修飾根本數據類型,weak修飾對象類型.strong和weak用於ARC下(ARC下的代理運用weak,block塊運用copy).strong相當於retain.weak相當於assign;assign/retain/copy這些屬性用於指定set訪問器的語義,也就是說,這些屬性決議了以何種方式對數據成員賦值.
assign,直接賦值,援用計數不改動,適用於根本數據類型.
retain,淺拷貝,運用的是原來的內存空間,只能適用於Objective-C對象類型,而不能適用於Core Foundation對象(retain會添加對象的援用計數,而根本數據和Core Foundation對象都沒有援用計數).
copy:對象的拷貝,新請求一塊內存空間,並把原始內容復制到那片空間.新對象的援用計數為1,此屬性只對那些遵照了NSCopy協議的對象類型無效.
③.nonatomic,非原子性訪問,不加同步,是異步操作.默許為atomic,原子操作,atomic是Objc運用的一種線程維護技術,根本下去講,是避免在寫未完成的時分被另外一個線程讀取,形成數據錯誤,而這種機制是耗費零碎內存資源的,所以在挪動端,都選擇nonatomic.
3.內存分為5個區,辨別是棧區,堆區,全局區,文字常量區,順序代碼區.
棧區:由編譯器自動分配釋放,不需求管理內存.
堆區:普通有順序員分配釋放.
全局區:寄存全局變量和靜態變量.
常量區:寄存常量字符串.
代碼區:寄存二進制代碼.
3.類變量的@protected,@private,@public,@package,聲明各有什麼含義?
@protected 受維護的.本類,子類可見.
@private 公有的,類內可用
@public 私有的,類內,子類,內部均可用
@package 可見度在@protected和@public之間,這個類型最常用於框架類的實例變量.
4.線程是什麼?進程又是什麼?區別和聯絡.
進程:正在運轉的順序,擔任順序的內存分配.
線程:線程是進程中一個獨立執行的控制單元(途徑),一個進程至多包括一條線程,即主線程.
創立線程的目的:開拓一條新的執行途徑,運轉指定的代碼,與主線程的代碼完成同時執行.
5.對多線程開發的了解,iOS中有幾種完成多線程的方式.
多線程的運用場景:避免卡頓,可以同時完成多個義務,且不影響主線程,把耗時操作放在子線程中執行,但是會耗費內存.
完成多線程的方式:
①.NSThread(內存需求自己管理.觸發),
②.NSOperationQueue(不再關注線程,以後可執行義務個數queue.maxConcurrentOperationCount)
③.GCD
④:Theard
詳解三種完成多線程的方式:
GCD:
GCD外面包括了串行隊列、並行隊列、客隊列、全局隊列。
Dispatch_queue_t q = dispatch_queue_create(“qqq”,DISPATCH_QUEUE_SERIAL);創立一個串行隊列
Dispatch_sync(q,^{
});開啟同步義務
Dispatch_async(q,^{
});開啟異步義務
並行隊列:DISPATCH_QUEUE_CONCURRENT
客隊列:dispatch_queue_t q = dispatch_get_main_queue();
全局隊列:dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
NSThread
獲取以後線程:NSThread * current = [NSThread currentThread];
獲取主線程:NSThread * main = [NSThread mainThread];
運用NSThread創立線程的兩種方式:
- (id)initWithtarget:(id)target selector:(SEL)selector object:(id)argument;
+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;
暫停以後線程:
[NSThread sleepForTimeInterval:2];
NSOperationQueue
創立一個操作隊列:NSOperationQueue * queue = [[NSOperationQueue alloc]init];
添加NSOperation到NSOperationQueue中:[queue addOperation:operation];
添加一組operation:[queue addOperations:operations waitUntilFinished:NO];
添加一個block方式的operation:[queue addOperationWithBlock:^(){
}];
添加NSOperation的依賴對象:[operation2 addDependency:operation1];
設置隊列的最大操作數:[queue setMaxConcurrentOperationCount:1];
等候options完成:[operation waitUntilFinished];
暫停、持續queue:[queue setSuspended:YES] [queue setSuspend:NO]
6.線程同步和異步的區別?ios中如何完成線程的同步?
同步:義務順序執行,下一個義務依賴於上一義務的完成.
異步:義務執行順序不定,一同執行.
完成:設置依賴:NSOpreationQueue GCD中的串行隊列.
7.iOS類能否可以多承繼,假如沒有,怎樣完成?
不可以多承繼.可以經過類目,延展,協議完成多承繼.
類目:類目也叫分類,英文category,在沒有原類.m文件的根底上,給該類添加辦法.類目裡不能添加實例變量,不能添加和原始類辦法名相反的辦法,否則會發作掩蓋.一個類可以添加多個類目,類目中的辦法可以成為原始類的一局部,和原始類辦法級別相反,可以被子類承繼.
延展:Extension,是一種特殊方式的類目,次要是在一個類的.m外面聲明與完成.作用:就是給某類添加公有辦法或許公有變量.
雖然延展是給一個類定義公有辦法,但是OC沒有相對的公有辦法,其實還是可以調用的,延展外面聲明的變量只能在該類外部運用,外界訪問不了.假如是新建文件建的的某類延展.h文件,則不能添加實例變量,假如括號裡沒有類目名,則以為延展外面的辦法為全都必需完成,假如有,則可選完成.
類目寫的辦法必需完成,延展寫的辦法非必需.
8.棧和堆的區別?
棧:內存零碎管理(零碎開拓,零碎釋放),先進後出.
堆:內存自己管理(自己開拓,自己釋放).先進先出.
9.iOS本地數據存儲都有幾種方式?
①.NSkeyedArchiver:采用歸檔的方式來保管數據,該數據對象需求恪守NSCoding協議,並且該對象對應的類必需提供encodeWithCoder:和initWithCoder:辦法.前一個辦法通知零碎怎樣對對象停止編碼,然後一個辦法則是通知零碎怎樣對對象停止解碼.
②.NSUserDefaults:用來保管使用順序設置和屬性,用戶保管的數據.用戶再次翻開順序或許開機後這些數據依然存在.NSUserDefaults可以存儲的數據類型包括:NSData,NSString,NSNumber,NSDate,NSArray.NSDictionary,其他類型的數據需求先行轉換.
③.Write寫入方式:永世保管在磁盤中.詳細:a.取得文件保管的途徑.b.生成該途徑下的文件,c,往文件中寫入數據.d.從文件中讀出數據.
④.SQLite:采用SQLite數據庫來存儲數據,SQLite作為一種輕量級數據庫.詳細:a.添加SQLite相關的庫以及頭文件,b.運用數據庫存數數據:翻開數據庫,編寫數據庫語句,執行,封閉數據庫.另:寫入數據庫,字符串可以采用char方式,而從數據庫中取出char類型,當char類型有表示中文字符時,會呈現亂碼,這是由於數據庫默許運用ascII編碼方式,所以想要正確從數據庫中取出中文,需求運用NSString來承受從數據庫取出的字符串.
⑤.CoreData:原理是對SQLite的封裝,開發者不需求接觸sql語句,就可以對數據庫停止操作.
10.ios靜態類型和靜態綁定
多態:父類指針指向子類對象.
靜態類型:只要在運轉期,才干確定其真正類型.
靜態加載:依據不同的條件,加載不同的資源.32和64位.
11.深拷貝和淺拷貝的了解.
深拷貝;拷貝的內容.
淺拷貝:拷貝的指針.
深拷貝如:
NSMutableDictionary * dic = [@{} mutableCopy];
NSMutableArray * ary = [@[] mutableCopy];
12.怎樣完成一個單例的類.
單例是一種設計形式,對象只要一個.缺陷:對象不會被釋放,假如創立很多的話會占用很多內存,優點:可以當唱工具類運用.
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:數據托管.有四種存儲方式:XmlRss/ target=_blank class=infotextkey>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:視圖將要呈現時調用.
dealloc:銷毀該視圖時調用.
init;初始化該視圖時調用.
20.描繪使用順序的啟動順序.
a.順序入口main函數創立UIApplication實例和UIApplication代理實例.
b.在UIApplication代理實例中重寫啟動辦法,設置根ViewController
c.在第一ViewController中添加控件,完成使用順序界面.
21.為什麼很多內置類如UITableViewControl的delegate屬性都是assign而不是retain?
避免循環援用.
如:對象A援用了對象B,對象B援用了對象C,對象C援用了對象B,這個時分B的援用計數是2,而C的援用計數是1,當A不再運用B的時分,就釋放了B的一切權,這個時分C還援用對象B,所以B不會釋放,援用計數為1,由於B也援用著對象C,B不釋放,那麼C也就不會被釋放,所以他們的援用計數都為1,並且永遠不會被釋放,構成了循環援用.
22.運用UITableView的時分必需要完成的幾種辦法?
2個數據源辦法.辨別是:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
23.寫一個遍歷結構器.
+(id)leftModelWith{
leftModel * model = [self alloc]init];
return model;
}
24.UIImage初始化一張圖片有幾種辦法?簡述其特點?
3種,
imageNamed:零碎會先反省零碎緩存中能否有該名字的image,假如有的話,則直接前往,假如沒有,則先加載圖像到緩存,然後再前往.
initWithContentsOfFile:零碎不會反省緩存,而直接從文件零碎中記載並前往.
imageWithCGImage:scale:orientation 當scale= 1的時分圖像為原始大小,orientation指定繪制圖像的方向.
25.person的retainCount值,並解釋為什麼?
Person * per = [Person alloc]init];
self.person = per;
1或許2.看person是什麼類型修飾的.
alloc+1,assign+0,retain+1.
26.上面這段代碼有何問題?
@implementation Person
- (void)setAge:(int)newAge {
self.age = newAge;
}
@end
死循環
27. 這段代碼有什麼問題,如何修正
for (int i = 0; i < someLargeNumber; i++) {
NSString *string = @”Abc”;
string = [string lowercaseString];
string = [string stringByAppendingString:@"xyz"];
NSLog(@“%@”, string);
}
參加自動釋放池@autoreleasepool{};
for (int i = 0; i < someLargeNumber; i++) {
@antoreleasepool {
NSString *string = @”Abc”;
string = [string lowercaseString];
string = [string stringByAppendingString:@"xyz"];
NSLog(@“%@”, string);
}
}
28.截取字符串"20 | http://www.baidu.com"中,"|"字符後面和前面的數據,辨別輸入它們。
["20 | http://www.baidu.com" componentSeparatedByString:@"|"];
29.用obj-c 寫一個冒泡排序.
NSMutableArray *ary = [@[@"1", @"2", @"3", @"4", @"6", @"5"] mutableCopy];
for (int i = 0; i < ary.count - 1; i++) {
for (int j = 0; j < ary.count - i - 1; j++) {
if ([ary[j] integerValue] < [ary[j + 1] integerValue]) {
[ary exchangeObjectAtIndex:j withObjectAtIndex:j + 1];
}
}
}
NSLog(@"%@", ary);
30.簡述對UIView.UIWindow和CALayer的了解.
UIWindow是使用的窗口,承繼於UIResponder.
UIView承繼於UIView,是創立窗口中的一個視圖,可以呼應交互事情.一個順序只要一個主Window,可以有多個window.
CALayer圖層,一個view可有多個圖層,不可以呼應事情.
31.寫一個完好的代理,包括聲明,完成.
代理:恪守協議的對象.
@class MyView;
第一步:指定協議:(協議名:類名+Delegate)
@protocol MyViewDelegate <NSObject>
@required
-(void)changeViewBackgroudColor:(MyView *)view;
@optional
-(void)test;
@end
@interface MyView : UIView
第二步:指定代理
@property (nonatomic,assign)id<MyView> delegate;
@end
第三步:代理遵照協議.
第四步:代理完成協議外面的必需完成的辦法和其他可選辦法.
第五步:委托方告訴代理開端執行辦法.
32.剖析json.XmlRss/ target=_blank class=infotextkey>Xml的區別,底層如何完成?
Json:鍵值對.數據小,不復雜.便於解析,有框架支持,合適輕量級傳輸.作為數據包個數傳輸的時分效率更高.
Xml:標簽套內容.xml數據兩較大,比擬復雜.合適大數據量的傳輸.xml有豐厚的編碼工具,比方:Dom4j,JDom.解析方式有兩種,一是經過文芳模型解析,另外一種遍歷節點.
33.ViewController的didReceiveMemoryWarning是在什麼時分被調用的?
1.當使用順序的內存運用接近零碎的最大內存運用時,使用會向零碎發送內存正告,這時分零碎會調用辦法向一切ViewController發送內存正告.
2.翻開零碎相機.
3.加載高清圖片.
默許操作:把外面沒有用的對象停止釋放.
34.面向對象的三大特征,復雜引見.
封裝:代碼模塊化,方便當前調用.
承繼:子類承繼父類的一切辦法和屬性.
多態:父類指針指向子類對象.
35.重寫一個NSString類型的,retain方式聲明name屬性的setter和getter辦法.
屬性的三大特性:語義特性,原子特性,讀寫特性.
同時重寫setter和getter辦法,@synchronized name = _name,關聯屬性和實例變量.
- (void)setName:(NSString *)name{
if(_name != name){
[_name retain];
[_name release];
_name = name;
}
}
- (NSString *)name{
return [[_name retain]autorelease];
}
36.簡述NotificationCenter.KVC,KVO,Delegate?並闡明它們之間的區別?
NotificationCenter:音訊中心.音訊告訴.
KVC:應用鍵-值直接訪問類中的某個屬性.
[self setValue:@"123" forKeyPath:@"name"];
NSLog(@"%@",[self valueForKeyPath:@"name"]);
KVO:應用鍵-途徑直接訪問類中的某個屬性,也就是察看者形式(KVO+告訴中心).基於KVC和告訴中心,察看的是實例變量.
Delegate:用於多個類之間的傳值.
37.What is lazy loading?
懶加載
38.對MVC的了解,益處?
MVC:是一種架構.model:數據處置,view:視圖顯示,controller:邏輯控制,擔任視圖和模型之間的通訊.
高類聚,低耦合,進步代碼的復用性.
39.監測鍵盤的彈出.
告訴.
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector() name:UIKeyboardWillShowNotification object:nil];
40. 5個ios,sdk庫和第三方庫.
零碎庫:UIKit框架:擔任使用順序的圖形及事情驅動的關鍵根底,如:用戶界面管理,圖形和窗口支持.
Mapkit框架:地圖.
Message UI框架:電子郵件
AV Foundation框架:可用於音頻播放.
OpenAL框架:用於播放,可播放高質,高功能的網絡音頻
Core Data框架:將數據存儲在SQLite數據庫.
Core Media框架:播放視頻.
第三方:SDWebImage :簡化圖片處置
ShareSDK 分享
SVProgressHUD 輕量級菊花
A.networkin 方便網絡開發
FreeStreamer 播放音頻
41.引見呼應者鏈.
當用戶點擊屏幕,可以發生呼應的對象組成的鏈.
承繼自NSResponder,呼應者鏈可以中綴.
42.傳值方式:
告訴,單例,代理,屬性,block.
43.NSString * test = [[NSData alloc] init],test在編譯時和運轉時辨別是什麼類型的對象?
編譯時是NSString,運轉時是NSData.NSData
44.OC中對象的交互是如何完成的?
音訊機制.
45.給定一個字符串,判別字符串中能否還有png,有就刪除.
stringContains,運用@""直接交換完成刪除
46.目的-舉措機制.
Target - action
47.什麼是沙盒?沙盒裡包括哪些文件,如何獲取文件途徑.
沙盒:順序可操作的磁盤空間,零碎為之開拓.
包括了3個文件夾.
1.Documents:寄存一些比擬重要的文件,但是放入Documents中的文件不能過大.
2.Library :是一個資源庫,存儲一些不太重要的數據.外面包括了兩個子文件夾,Caches文件夾,用於緩存,
Preferences文件夾,零碎偏好設置,用戶對使用順序的設置,如密碼.perferences途徑無法找到,只能經過NSUserDefaults.
如:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
48.引見一下XMPP?
基於XML的點對點通訊協議,完成通訊功用.
優點:可以跨平台開發.
缺陷:丟包,只能發文字(圖片發送發的是鏈接).
49.使用順序如何省電?
獲取懇求不能過頻.優化算法.
50.寫一個遞歸辦法,計算n的階乘.
-(NSInteger)digui:(NSInteger)i{
if (i>0) {
return i*[self digui:(i-1)];
}else{
return 1;
}
}
[[NSUserDefaults standardUserDefaults]setObject:@([self digui:3]) forKey:@"value"];
51.NSArray 和 NSMutableArray 的區別?多線程下那個更平安.
NSArray: 不可變數組.
NSMutableArray: 可變數組.
多線程下NSArray更平安.
52.取出一個數組中的反復元素.
1.放進集
2.遍歷刪除
3.放進字典作為key,再取出key
54.isKindOfClass,isMemberOfClass作用辨別是什麼?
isKindOfClass是某個類的實例或許子類的實例.
isMemberOfClass是某個類的實例
55.請辨別寫出SEL,id的意思?
SEL:選擇器.
id:范類型
OC中的對象就是C言語的指針.
56.iPhone上,能被使用順序直接調用的零碎順序是什麼?
能:相冊,相機,通訊錄,音樂.
不能:計算器,天氣,日歷,指南針.
57.以.mm為擴展名的文件裡,可以包括哪些代碼?
C++,C,OC
58.說說後台如何運轉順序.
在plist配置Application does not run inbackground設置NO(默許就是NO)的前提下.
添加required background modes,值是App registers for location updates和App plays auto or streams audio/video using AirPlay
59.sizeof和strlen的區別和聯絡?
sizeof:占用空間大小.
strlen:字符串大小.
60.sprintf,strcpy,memcpy的功用?運用上要留意哪些中央?
sprintf:將某些類型轉換成字符串類型
strcpy:拷貝字符串,會越界,'/0'
memcpy:拷貝內存
61.寫一個函數完成strlen的功用?
int sl(const char *s)
{
int length = 0;
while (*s!='') {
s++;
length++;
}
return length;
}
62.寫一個代碼片完成輸出一個字符串"20130322152830",輸入一個NSDate類型的對象,打印該對象輸入2013-03-11 15:28:32
NSString * str = @"20130322152832";
NSDateFormatter * format = [[NSDateFormatter alloc]init];
format.dateFormat = @"yyyyMMddHHmmss";//設置格式
NSLog(@"%@",[[format dateFromString:str] dateByAddingTimeInterval:8*60*60]);
63.用變量a寫出以下定義
a、一個整型數int a = 10
b、一個指向整型數的指針int *p = 10
c、一個指向指針的指針,它指向的指針是指向一個整型數int **p =10
d、一個有10個整型數的數組 int a[10]
e、一個有10個指針的數組,該指針是指向一個整型數的int *a[10]
f、一個指向有10個整型數數組的指針int *a = {1,2,3,4,5,6,7,8,9,10};
g、一個指向函數的指針,該函數有一個整型參數,並前往一個整型數
int *a(int b){
return b;
}
64.cocoa和 cocoa touch?
cocoa包括Foundation和AppKit框架,可用於開發Mac OS X零碎的使用順序
cocoa touch包括Foundation和UIKit框架,可用於開發iPhone OS 零碎的使用順序
Cocoa時Mac OS X的開發環境,cocoa Touch是 Iphone OS的開發環境
65.網絡從下往上分為幾層?
從下往上:物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、使用層。
IP 協議對應網絡層,TCP 協議對應傳輸層,HTTP 協議對應於使用層。
socket 則是對TCP/IP協議的封裝和使用。也可以說,TCP/IP協議是傳輸層協議,次要處理數據如何在網絡中傳輸,而 HTTTP 是使用層協議,次要處理
66.熱更新幾種完成方式
http://www.jianshu.com/p/8cec322531ae
67.多線程的底層完成?
線程:進程中一個特立獨行的控制單元(途徑)。多線程:一個進程至多有一個線程,即主線程。
①、Mach 是第一個以多線程方式處置義務的零碎,因而多線程的底層完成機制就是基於 Mach 的線程。
②、開發中很少用到 Mach 級的線程,由於 Mach級的線程沒有提供多線程的根本特征,線程之間是獨立的。
④、開發中完成多線程的方案:
NSThread、GCD、NSOperationQueue.NSOperation
68.線程之間怎樣通訊?
①.performSelect:onThread:withObject:waitUntilDone:
②.NSMachPort
69.網絡圖片問題中怎樣處理一個相反的網絡地址反復懇求的問題.
應用字典:圖片地址為 key, 下載操作為 value.value
70.用 NSOperation和 NSOperationQueue處置 A.B.C三個線程,要求執行完 A.B 後才干執行?
創立隊列
NSOperationQueue * queue = [[NSOperationQueue alloc]init];
創立三個操作
NSOperation * A = [NSBlockOperation blockOperationWithBlock:^{
NSLog{@"A"};
}];
NSOperation * B = [NSBlockOperation blockOperationWithBlock:^{
NSLog{@"B"};
}];
NSOperation * C = [NSBlockOperation blockOperationWithBlock:^{
NSLog{@"C"};
}];
添加依賴
[C addDependency:a];
[C addDependency:b];
執行操作
[queue addOperation:a];
[queue addOperation:b];
[queue addOperation:c];
71.GCD外部怎樣完成的?
1 IOS和OS X的中心是XNU內核,GCD是基於XUN內核完成的
2 GCD的API全部在libdispatch庫中
3 GCD的底層完成次要有Dispatch Queue 和Dispatch Source
Dispatch Queue :管理block操作
Dispatch Source :處置事情(比方線程間通訊)
72.怎樣保證多人開發停止內存洩露反省。
運用Analuze停止代碼的靜態剖析,為防止費事,多人開發盡量運用ARC.
73、非自動內存管理狀況下怎樣做單例形式。
創立一個單例對象的靜態實例,並初始化為nil。
創立一個類的類工廠辦法,當且僅當這個類的實例為nil時生成一個類的實例。
完成NScopying協議,掩蓋allocWithZone:辦法,確保用戶在直接分配對象時,不會發生另一個對象。
掩蓋release、autorelease、retain、retainCount辦法,確保單例的形態。
74、關於類辦法(靜態辦法)默許是autorelease的,一切類辦法都會這樣嗎?
①、零碎自帶的絕大數類辦法前往的對象,都是經過autorelease.
75、block在ARC中和MRC中的辦法有何區別?需求留意什麼?
①.關於沒有援用內部變量的Block,無論在ARC還是MRC下,類型都是_NSGlobalBlock_,這品種型的block可以了解為一種全局的block,不需求思索作用域的問題。同時,對它停止Copy和Retain操作也是有效的。
②.防止循環援用。
依據isa指針,block一共有3品種型的block
_NSConcreteGlobalBlock 全局靜態
_NSConcreteStackBlock 保管在棧中,出函數作用域就銷毀
_NSConcreteMallocBlock 保管在堆中,retainCount == 0銷毀
76.什麼狀況下會發作內存洩露和內存溢出?
當順序在請求內存後,無法釋放曾經請求的內存空間(例如一個對象或許變量在用完後沒有釋放,這個對象就不斷占用著內存),一次內存洩露可以疏忽,但假如洩露過多的話,就會形成內存溢出。
當順序在請求內存時,但存入了更大的數據,呈現內存溢出。
77.[NSArray arrayWithobject<id>]這個辦法添加對象後,需求對這個數組停止釋放操作嗎?
不需求,這個對象會被放到自動釋放池中。
78.自動釋放池如何完成?
自動釋放池以棧的方式完成,當你創立一個新的自動釋放池時,它將被添加到棧頂,當一個對象收到發送autorelease音訊時,它將添加到以後線程的處於棧頂的自動釋放池中,當自動釋放池被回收時,它們從棧中被刪除並且會給池子裡一切對象都做一次release操作。
79.KVO外部完成原理?
①.KVO是基於runtime機制完成的。
②.當某個類的對象第一次被察看時,零碎就會在運轉期靜態的創立該類的一個派生類,在這個派生類中重寫基類中任何被察看屬性的setter辦法。
派生類在被重寫setter辦法中完成了真正的告訴機制。(Person->NSKVONotification Person)
80.能否把比擬耗時的操作放在NSNotificationCenter中。
假如在異步線程收回的告訴,那麼就可以把耗時操作放到NSNotificationCenter中
假如在主線程發的告訴,那麼就不可以把耗時操作放到NSNotificationCenter中。
81.Foundation對象與Core Foundation對象有何區別?
Foundation對象是OC的,Core Foundation對象是C對象。
數據類型之間的轉換:
ARC:_bridge_retained、_bridge_transfer
非ARC:_bridge
82、不必第三變量,交流AB的值。
A=A+B
B=A-B
A=A-B
或許
A=A^B
B=A^B
A=A^B
83.復雜描繪下對單例形式設計的了解?
節省內存資源,一個使用就一個對象。
84.runtime完成的機制是什麼?怎樣用,普通用於干嘛。
運轉機遇制,runtime庫外面包括了跟類、成員變量、辦法相關的API,比方獲取類外面的一切成員變量,為類靜態添加成員變量、靜態改動類的辦法完成,為類靜態添加新的辦法等,需求導入<objc/message.h><objc/message.h>
①.runtime,運轉機遇制,它是一套C言語庫。
②.實踐上我們編寫的一切OC代碼,最終都是轉換成為了runtime庫的東西,比方類轉換成了runtime庫外面的構造體等數據類型,辦法轉換成了runtime庫外面的C言語函數,平常調辦法都是轉成了objc_msgSend函數(所以說OC有個音訊發送機制)
③、因而,可以說runtime是OC的底層完成,是OC的幕後執行者。
④、有了runtime庫,能做什麼呢?可以獲取類外面的一切成員變量、為類靜態的添加成員變量、靜態的改動類的辦法完成、為類靜態添加新的辦法等等。
85.能否運用Core Text 或許 Core Image ?
Core Text
隨意修正文本的款式
圖文混排(純C言語)
Core Image(濾鏡處置)
可以調理圖片的各種屬性(比照度、色溫、色差等)
86、NSNotification和KVO的區別和用法是什麼?什麼時分應該運用告訴,什麼時分應該運用KVO,他們的完成有何區別?假如用protocol和delegate來完成類似的功用能夠嗎?能夠的話有何問題?不能夠的話why?
告訴比擬靈敏,一個告訴能被多個對象承受,一個對象可以承受多個告訴。
代理不交標准,但是代碼較多(默許是一對一)
KVO功能不好(底層會發生新的類),只能監聽某個對象屬性的變化,不引薦運用。
87、block外部的完成原理。
Objective-C是對C言語的擴展,block的完成是基於指針和函數指針。
88、怎樣處理緩存池滿的問題?
iOS中不存在緩存池滿的狀況,通常在對象需求創立時才創立,比方UITableView中普通只會創立剛開端在屏幕中的cell,之後都是從緩存池裡取,不會再創立新對象。
89、控制器View的生命周期及相關函數是什麼?你在開發中是如何運用的?
1、首先判別控制器能否有視圖,假如沒有就調用loadView辦法創立:經過storyBoard或許代碼。
2、隨後調用viewDidLoad,可以停止下一步的初始化操作,只會被調用一次。
3、在視圖顯示之前調用viewWillAppear,該函數可以屢次調用。
4、視圖viewDidAppear
5、在規劃變化前後,調用viewWill/DidLayoutSubViews處置相關信息。
90、有些圖片加載比擬慢怎樣處置?你是怎樣優化順序的功能的?
①、圖片下載放在異步線程。
②、圖片下載進程運用占位圖片。
③、假如圖片比擬大,可以運用多線程斷點下載。
91.App需求加載少量數據,給服務器發送懇求,但是服務器卡住了怎樣辦?
設置懇求超時,給用戶提示懇求超時,依據用戶操作再次懇求。
92、SDWebImage詳細如何完成?
其實就是沙盒緩存機制,次要由三塊組成:內存圖片緩存,內存操作緩存,磁盤沙盒緩存。
①、應用NSOperationQueue和NSOperation下載圖片,還運用了GCD(解析GIF圖片)。
②、應用URL作為key,NSOperation作為value.
③、應用URL作為key,UIImage作為value
93、A.netWorking完成原理。
基於NSURL.采用block的辦法處置懇求,直接前往的是json、XML數據。AFN直接操作對象是AFHTTPClient,是一個完成了NSCoding和NSCopying協議的NSObject子類。AFGTTPClient是一個封裝了一系列操作辦法的工具類。AFN默許沒有封裝同步懇求,假如開發者需求運用同步懇求,需求重寫相關的辦法(getPath:parameters:failure),對AFHTTPRequestOperation停止同步處置。
94、什麼是呼應鏈,它是怎樣任務的?
http://www.jianshu.com/p/9179e5d780c8
95、iOS 的沙盒目錄構造是怎樣的? App Bundle 外面都有什麼?
1.沙盒構造
Application:寄存順序源文件,上架前經過數字簽名,上架後不可修正
Documents:常用目錄,iCloud備份目錄,寄存數據,這裡不能存緩存文件,否則上架不被經過
Library
Caches:寄存體積大又不需求備份的數據,SDWebImage緩存途徑就是這個
Preference:設置目錄,iCloud會備份設相信息
tmp:寄存暫時文件,不會被備份,而且這個文件下的數據有能夠隨時被肅清的能夠
2.App Bundle 外面有什麼
Info.plist:此文件包括了使用順序的配相信息.零碎依賴此文件以獲取使用順序的相關信息
可執行文件:此文件包括使用順序的入口和經過靜態銜接到使用順序target的代碼
資源文件:圖片,聲響文件一類的
其他:可以嵌入定制的數據資源
iOS 的簽名機制大約是怎樣的?
假定,我們有一個APP需求發布,為了避免中途竄改APP內容,保證APP的完好性,以及APP是由指定的私鑰發的。首先,先將APP內容經過摘要算法,失掉摘要,再用私鑰對摘要停止加密失掉密文,將源文本、密文、和私鑰對應的公鑰一並發布即可。那麼如何驗證呢?
驗證方首先檢查公鑰能否是私鑰方的,然後用公鑰對密文停止解密失掉摘要,將APP用異樣的摘要算法失掉摘要,兩個摘要停止比對,假如相等那麼一切正常。這個進程只需有一步出問題就視為有效。
iOS 7的多義務添加了哪兩個新的 API? 各自的運用場景是什麼?
後台獲取(Background Fetch):後台獲取運用場景是用戶翻開使用之前就使app無機會執行代碼來獲取數據,刷新UI。這樣在用戶翻開使用的時分,最新的內容將已然出現在用戶眼前,而省去了一切的加載進程。
推送喚醒(Remote Notifications):運用場景是使設備在接納到遠端推送後讓零碎喚醒設備和我們的後台使用,並先執行一段代碼來預備數據和UI,然後再提示用戶有推送。這時用戶假如解鎖設備進入使用後將不會再有任何加載進程,新的內容將直接失掉出現。
96、UIScrollView 大約是如何完成的,它是如何捕獲、呼應手勢的?
我對UIScrollView的了解是frame就是他的contentSize,bounds就是他的可視范圍,經過改動bounds從而到達讓用戶誤以為在滾動,以下是一個復雜的UIScrollView完成
在頭文件定義一個contentSize屬性
@interface MyScrollView : UIView
@property (nonatomic) CGSize contentSize;
@end
@implementationMyScrollView
- (instancetype)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self == nil) {
return nil;
}
添加一個滑入手勢
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithtarget:self action:@selector(panGesture:)];
[self addGestureRecognizer:pan];
return self;
}
- (void)panGesture:(UIPanGestureRecognizer *)gestureRecognizer{
改動bounds
CGPoint translation = [gestureRecognizer translationInView:self];
CGRect bounds = self.bounds;
CGFloat newBoundsOriginX = bounds.origin.x - translation.x;
CGFloat minBoundsOriginX = 0.0;
CGFloat maxBoundsOriginX = self.contentSize.width - bounds.size.width;
bounds.origin.x = fmax(minBoundsOriginX, fmin(newBoundsOriginX, maxBoundsOriginX));
CGFloat newBoundsOriginY = bounds.origin.y - translation.y;
CGFloat minBoundsOriginY = 0.0;
CGFloat maxBoundsOriginY = self.contentSize.height - bounds.size.height;
bounds.origin.y = fmax(minBoundsOriginY, fmin(newBoundsOriginY, maxBoundsOriginY));
self.bounds = bounds;
[gestureRecognizer setTranslation:CGPointZero inView:self];
}
第二個問題團體了解是處理手勢抵觸,對自己添加的手勢停止捕捉和呼應
讓UIScrollView恪守UIGestureRecognizerDelegate協議,完成這個辦法,在這裡辦法裡對添加的手勢停止處置就可以處理抵觸
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
97、Objective-C 如何對已有的辦法,添加自己的功用代碼以完成類似記載日志這樣的功用?
這標題次要調查的是runtime如何交流辦法
先在分類中添加一個辦法,留意不能重寫零碎辦法,會掩蓋
+ (NSString *)myLog
{
這裡寫打印行號,什麼辦法,哪個類調用等等
}
然後交流辦法
加載分類到內存的時分調用
+ (void)load
{
獲取imageWithName辦法地址
Method description = class_getClassMethod(self, @selector(description));
獲取imageWithName辦法地址
Method myLog = class_getClassMethod(self, @selector(myLog));
交流辦法地址,相當於交流完成方式
method_exchangeImplementations(description, myLog);
}
98、+load 和 +initialize 的區別是什麼?
+(void)load;
當類對象被引入項目時, runtime 會向每一個類對象發送 load 音訊
load 辦法會在每一個類甚至分類被引入時僅調用一次,調用的順序:父類優先於子類, 子類優先於分類
load 辦法不會被類自動承繼
+(void)initialize;
也是在第一次運用這個類的時分會調用這個辦法
99、如何讓Category 支持屬性?
運用runtime可以完成
頭文件
@interface NSObject (test)
@property (nonatomic, copy) NSString *name;
@end
.m文件
@implementation NSObject (test)
定義關聯的key
static const char *key = "name";
- (NSString *)name
{
依據關聯的key,獲取關聯的值。
return objc_getAssociatedObject(self, key);
}
- (void)setName:(NSString *)name
{
第一個參數:給哪個對象添加關聯
第二個參數:關聯的key,經過這個key獲取
第三個參數:關聯的value
第四個參數:關聯的戰略
objc_setAssociatedObject(self, key, name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
100、NSOperation 相比於 GCD 有哪些優勢?
提供了在 GCD 中不那麼容易復制的有用特性。
可以很方便的取消一個NSOperation的執行
可以更容易的添加義務的依賴關系
提供了義務的形態:isExecuteing, isFinished.
101、strong / weak / unsafe_unretained 的區別?
weak只能修飾OC對象,運用weak不會使計數器加1,對象銷毀時修飾的對象會指向nil,strong等價與retain,能使計數器加1,且不能用來修飾數據類型
unsafe_unretained等價與assign,可以用來修飾數據類型和OC對象,但是不會使計數器加1,且對象銷毀時也不會將對象指向nil,容易形成野指針錯誤
102、如何為 Class 定義一個對外只讀對內可讀寫的屬性?
在頭文件中將屬性定義為readonly,在.m文件中將屬性重新定義為readwrite
103、Objective-C 中,meta-class 指的是什麼?
meta-class 是 Class 對象的類,為這個Class類存儲類辦法,當一個類發送音訊時,就去那個類對應的meta-class中查找那個音訊,每個Class都有不同的meta-class,一切的meta-class都運用基類的meta-class(假設類承繼NSObject,那麼他所對應的meta-class也是NSObject)作為他們的類
104、UIView 和CALayer 之間的關系?
UIView顯示在屏幕上歸功於CALayer,經過調用drawRect辦法來渲染本身的內容,調理CALayer屬性可以調整UIView的外觀,UIView承繼自UIResponder,CALayer不可以呼應用戶事情
UIView是iOS零碎中界面元素的根底,一切的界面元素都承繼自它。它外部是由Core Animation來完成的,它真正的繪圖局部,是由一個叫CALayer(Core Animation Layer)的類來管理。UIView自身,更像是一個CALayer的管理器,訪問它的根繪圖和坐標有關的屬性,如frame,bounds等,實踐上外部都是訪問它所在CALayer的相關屬性
UIView有個layer屬性,可以前往它的主CALayer實例,UIView有一個layerClass辦法,前往主layer所運用的類,UIView的子類,可以經過重載這個辦法,來讓UIView運用不同的CALayer來顯示
105、+[UIView animateWithDuration:animations:completion:] 外部大約是如何完成的?
animateWithDuration:這就等於創立一個定時器
animations:這是創立定時器需求完成的SEL
completion:是定時器完畢當前的一個回調block
以上只是自己的了解,不一定正確,有對這個有研討的冤家請告知下
106、什麼時分會發作「隱式動畫」?
當改動CALayer的一個可做動畫的屬性,它並不能立即在屏幕上表現出來.相反,它是從先前的值平滑過渡到新的值。這一切都是默許的行為,你不需求做額定的操作,這就是隱式動畫
107、如何處置異步的網絡懇求?
異步懇求:會獨自開一個線程去處置網絡懇求,主線程仍然處於可交互形態,順序運轉流利
POST懇求
NSString *urlString = @"www.baidu.com";
創立url對象
NSURL *url = [NSURL URLWithString:urlString];
創立懇求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];
創立參數字符串對象
NSString *parmStr = [NSString stringWithFormat:@"參數"];
將字符串轉換為NSData對象
NSData *data = [parmStr dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];
[request setHTTPMethod:@"POST"];
創立異步銜接
[NSURLConnection connectionWithRequest:request delegate:self];
然後完成代理辦法
服務器接納到懇求時
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
}
當收到服務器前往的數據時觸發, 前往的能夠是資源片段
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
}
當服務器前往一切數據時觸發, 數據前往終了
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
}
懇求數據失敗時觸發
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"%s", __FUNCTION__);
}
108、frame 和bounds 的區別是什麼?
frame絕對於父視圖,是父視圖坐標系下的地位和大小。bounds絕對於本身,是本身坐標系下的地位和大小。
frame以父控件的左上角為坐標原點,bounds以本身的左上角為坐標原點
109、如何把一張大圖減少為1/4大小的縮略圖?
let data = UIImageJPEGRepresentation(image, 0.25)
【ios 面試題 第一彈】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!