1.Object-c的類能夠多重繼承麼?能夠實現多個接口麼?Category是什麼?重寫一個類的方式用繼承好仍是分類好?爲何?
Object-c的類不能夠多重繼承;能夠實現多個接口,經過實現多個接口能夠完成C++的多重繼承;Category是類別,通常狀況用分類好,用Category去重寫類的方法,僅對本Category有效,不會影響到其餘類與原有類的關係。html
2.#import 跟#include 有什麼區別,@class呢, #import<> 跟 #import」」有什麼區別?
#import是Objective-C導入頭文件的關鍵字,#include是C/C++導入頭文件的關鍵字,使用#import頭文件會自動只導入一次,不會重複導入,至關於#include和#pragma once;@class告訴編譯器某個類的聲明,當執行時,纔去查看類的實現文件,能夠解決頭文件的相互包含;#import<>用來包含系統的頭文件,#import」」用來包含用戶頭文件。前端
3.屬性readwrite,readonly,assign,retain,copy,nonatomic 各是什麼做用,在那種狀況下用?
①. readwrite 是可讀可寫特性;須要生成getter方法和setter方法時
②. readonly 是隻讀特性 只會生成getter方法 不會生成setter方法 ;不但願屬性在類外改變
③. assign 是賦值特性,setter方法將傳入參數賦值給實例變量;僅設置變量時;
④. retain 表示持有特性,setter方法將傳入參數先保留,再賦值,傳入參數的retaincount會+1;
⑤. copy 表示賦值特性,setter方法將傳入對象複製一份;須要徹底一份新的變量時。
⑥. nonatomic 非原子操做,決定編譯器生成的setter getter是不是原子操做,atomic表示多線程安全,通常使用nonatomicnode
4.寫一個setter方法用於完成@property (nonatomic,retain)NSString *name,寫一個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;
}ios
5.對於語句NSString*obj = [[NSData alloc] init]; obj在編譯時和運行時分別時什麼類型的對象?
編譯時是NSString的類型;運行時是NSData類型的對象git
6.常見的objective-c的數據類型有那些, 和C的基本數據類型有什麼區別?如:NSInteger和int
object-c的數據類型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等,這些都是class,建立後即是對象,而C語言的基本數據類型int,只是必定字節的內存空間,用於存放數值;NSInteger是基本數據類型,並非NSNumber的子類,固然也不是NSObject的子類。NSInteger是基本數據類型Int或者Long的別名(NSInteger的定義typedef long NSInteger),它的區別在於,NSInteger會根據系統是32位仍是64位來決定是自己是int仍是Long。程序員
7.id 聲明的對象有什麼特性?
id 聲明的對象具備運行時的特性,便可以指向任意類型的objcetive-c的對象;github
8.Objective-C如何對內存管理的,說說你的見解和解決方法?
Objective-C的內存管理主要有三種方式ARC(自動內存計數)、手動內存計數、內存池。
①.自動內存計數:這種方式和Java相似,在你的程序的執行過程當中。始終有一個高人在背後準確地幫你收拾垃圾,你不用考慮它何時開始工做,怎樣工做。你只須要明白,我申請了一段內存空間,當我再也不使用從而這段內存成爲垃圾的時候,我就完全的把它忘記掉,反正那個高人會幫我收拾垃圾。遺憾的是,那個高人須要消耗必定的資源,在攜帶的移動設備裏面,資源是緊俏商品因此iPhone不支持這個功能。
解決: 經過alloc – init方式建立的, 建立後引用計數+1, 此後每retain一次引用計數+1, 那麼在程序中作相應次數的release就行了.
②. (Reference Counted)手動內存計數:就是說,從一段內存被申請以後,就存在一個變量用於保存這段內存被使用的次數,咱們暫時把它稱爲計數器,當計數器變爲0的時候,那麼就是釋放這段內存的時候。好比說,當在程序A裏面一段內存被成功申請完成以後,那麼這個計數器就從0變成1(咱們把這個過程叫作alloc),而後程序B也須要使用這個內存,那麼計數器就從1變成了2(咱們把這個過程叫作retain)。緊接着程序A再也不須要這段內存了,那麼程序A就把這個計數器減1(咱們把這個過程叫作release);程序B也再也不須要這段內存的時候,那麼也把計數器減1(這個過程仍是release)。當系統(也就是Foundation)發現這個計數器變成了0,那麼就會調用內存回收程序把這段內存回收(咱們把這個過程叫作dealloc)。順便提一句,若是沒有Foundation,那麼維護計數器,釋放內存等等工做須要你手工來完成。
解決:通常是由類的靜態方法建立的, 函數名中不會出現alloc或init字樣, 如[NSString string]和[NSArray arrayWithObject:], 建立後引用計數+0, 在函數出棧後釋放, 即至關於一個棧上的局部變量. 固然也能夠經過retain延長對象的生存期.
③. (NSAutoRealeasePool)內存池:能夠經過建立和釋放內存池控制內存申請和回收的時機.
解決:是由autorelease加入系統內存池, 內存池是能夠嵌套的, 每一個內存池都須要有一個建立釋放對, 就像main函數中寫的同樣. 使用也很簡單, 好比[[[NSString alloc]initialWithFormat:@」Hey you!」] autorelease], 即將一個NSString對象加入到最內層的系統內存池, 當咱們釋放這個內存池時, 其中的對象都會被釋放.web
9. 原子(atomic)跟非原子(non-atomic)屬性有什麼區別?
①. atomic提供多線程安全。是防止在寫未完成的時候被另一個線程讀取,形成數據錯誤
②. non-atomic:在本身管理內存的環境中,解析的訪問器保留並自動釋放返回的值,若是指定了 nonatomic ,那麼訪問器只是簡單地返回這個值。objective-c
10.Object C中建立線程的方法是什麼?若是在主線程中執行代碼,方法是什麼?若是想延時執行代碼、方法又是什麼?
線程建立有三種方法:使用NSThread建立、使用GCD的dispatch、使用子類化的NSOperation,而後將其加入NSOperationQueue;在主線程執行代碼,方法是performSelectorOnMainThread,若是想延時執行代碼能夠用performSelector:onThread:withObject:waitUntilDone:算法
11. 淺複製和深複製的區別?
答案:淺層複製:只複製指向對象的指針,而不復制引用對象自己。
深層複製:複製引用對象自己。
意思就是說我有個A對象,複製一份後獲得A_copy對象後,對於淺複製來講,A和A_copy指向的是同一個內存資源,複製的只不過是是一個指針,對象自己資源
仍是隻有一份,那若是咱們對A_copy執行了修改操做,那麼發現A引用的對象一樣被修改,這其實違背了咱們複製拷貝的一個思想。深複製就好理解了,內存中存在了
兩份獨立對象自己。
用網上一哥們通俗的話將就是:
淺複製比如你和你的影子,你完蛋,你的影子也完蛋
深複製比如你和你的克隆人,你完蛋,你的克隆人還活着。
12.類別的做用?繼承和類別在實現中有何區別?
category 能夠在不獲悉,不改變原來代碼的狀況下往裏面添加新的方法,只能添加,不能刪除修改。
而且若是類別和原來類中的方法產生名稱衝突,則類別將覆蓋原來的方法,由於類別具備更高的優先級。
類別主要有3個做用:
(1)將類的實現分散到多個不一樣文件或多個不一樣框架中。
(2)建立對私有方法的前向引用。
(3)向對象添加非正式協議。
繼承能夠增長,修改或者刪除方法,而且能夠增長屬性。
13. 類別和類擴展的區別。
category和extensions的不一樣在於 後者能夠添加屬性。另外後者添加的方法是必需要實現的。extensions能夠認爲是一個私有的Category。
14. 什麼是KVO和KVC?
kvc:鍵 – 值編碼是一種間接訪問對象的屬性使用字符串來標識屬性,而不是經過調用存取方法,直接或經過實例變量訪問的機制。
不少狀況下能夠簡化程序代碼。apple文檔其實給了一個很好的例子。
kvo:鍵值觀察機制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。
具體用看到嗯哼用到過的一個地方是對於按鈕點擊變化狀態的的監控。
好比我自定義的一個button
[self addObserver:self forKeyPath:@"highlighted" options:0 context:nil];
#pragma mark KVO
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"highlighted"] ) {
[self setNeedsDisplay];
}
}
對於系統是根據keypath去取的到相應的值發生改變,理論上來講是和kvc機制的道理是同樣的。
對於kvc機制如何經過key尋找到value:
「當經過KVC調用對象時,好比:[self valueForKey:@」someKey」]時,程序會自動試圖經過幾種不一樣的方式解析這個調用。首先查找對象是否帶有 someKey 這個方法,若是沒找到,會繼續查找對象是否帶有someKey這個實例變量(iVar),若是尚未找到,程序會繼續試圖調用 -(id) valueForUndefinedKey:這個方法。若是這個方法仍是沒有被實現的話,程序會拋出一個NSUndefinedKeyException異常錯誤。(cocoachina.com注:Key-Value Coding查找方法的時候,不只僅會查找someKey這個方法,還會查找getsomeKey這個方法,前面加一個get,或者_someKey以及_getsomeKey這幾種形式。同時,查找實例變量的時候也會不只僅查找someKey這個變量,也會查找_someKey這個變量是否存在。)設計valueForUndefinedKey:方法的主要目的是當你使用-(id)valueForKey方法從對象中請求值時,對象可以在錯誤發生前,有最後的機會響應這個請求。這樣作有不少好處,下面的兩個例子說明了這樣作的好處。「來至cocoa,這個說法應該挺有道理。由於咱們知道button倒是存在一個highlighted實例變量.所以爲什麼上面咱們只是add一個相關的keypath就好了,能夠按照kvc查找的邏輯理解,就說的過去了。
15. 咱們說的OC是動態運行時語言是什麼意思?
多態。 主要是將數據類型的肯定由編譯時,推遲到了運行時。
這個問題其實淺涉及到兩個概念,運行時和多態。
簡單來講,運行時機制使咱們直到運行時纔去決定一個對象的類別,以及調用該類別對象指定方法。
多態:不一樣對象以本身的方式響應相同的消息的能力叫作多態。意思就是假設生物類(life)都用有一個相同的方法-eat;
那人類屬於生物,豬也屬於生物,都繼承了life後,實現各自的eat,可是調用是咱們只需調用各自的eat方法。
也就是不一樣的對象以本身的方式響應了相同的消息(響應了eat這個選擇器)。所以也能夠說,運行時機制是多態的基礎。
16.本身寫函數,實現strlen功能(C語言第四講 一維數組與字符數組)
注意:判斷的時候使用「\0」
17.用變量a寫出如下定義
a、一個整型數 int a;
b、一個指向整型數的指針 int *a;
c、一個指向指針的指針,它指向的指針是指向一個整型數 int **a;
d、一個有10個整型數的數組 int a[10];
e、一個有10個指針的數組,該指針是指向一個整型數的 int *a[10];
f、一個指向有10個整型數數組的指針 int (*a)[10];
g、一個指向函數的指針,該函數有一個整型參數,並返回一個整型數 int(*a)(int);
18.類變量的@protected ,@private,@public,@package,聲明各有什麼含義?(OC第二講 實例變量可見度與方法)
上面的幾個聲明代表的時類成員的做用域,@private做用範圍只能在自身類(外界既不可訪問,又不能繼承);@protected做用範圍在自身類和子類,若是什麼都不加修飾,默認是@protected(外界不可訪問,可是能夠繼承);@public做用範圍最大,能夠在任何地方被訪問(外界便可訪問,又能夠繼承);@package做用範圍在某個框架內
19.用Object-C寫一個冒泡排序
NSMutableArray *array = [NSMutableArray arrayWithArray:@[@"3",@"1",@"10",@"5",@"2",@"7",@"12",@"4",@"8"]];
NSString *tmp;
for (int i = 0; i < array.count; i ++) {
for (int j = 0; j < array.count - 1 - i; j++) {
if ([[array objectAtIndex:j] integerValue] > [[array objectAtIndex:j + 1] integerValue]) {
tmp = [array objectAtIndex:j];
[array replaceObjectAtIndex:j withObject:[array objectAtIndex:j + 1]];
[array replaceObjectAtIndex:j + 1 withObject:tmp];
}
}
}
20.簡述OC中內存管理機制。與retain配對使用的方法是dealloc仍是release,爲何?須要與alloc配對使用的方法是dealloc仍是release,爲何?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak屬性的做用? (OC第九講 內存管理初級)
OC使用了一種叫作引用計數的機制來管理對象,若是對一個對象使用了alloc、[Mutable]copy,retain,那麼你必須使用相應的realease或者autorelease。也能夠理解爲本身生成的對象,本身持有。非本身生成的對象,本身也能持有。不在須要本身持有的對象時釋放。非本身持有的對象沒法釋放。生成並持有對象<alloc,new,copy,mutableCopy等>,持有對象<retain>,釋放對象<release>,廢棄對象<dealloc>。readwrite(默認):可讀可寫,表示既有getter方法,也有setter方法。readonly:表示只有getter方法,沒有setter方法。nonatomic:不考慮線程安全。atomic(默認):線程操做安全。strong(默認):ARC下和MRC下retain同樣,weak(ARC下):和(MRC下)assign相似,區別是當weak指向的內存釋放掉後自動置爲nil,防止野指針。
unsafe_unretained聲明一個若引用,但不會自動置爲nil,可能會出現野指針。
線程安全下的setter和getter方法:
-(NSString *)value{
@synchronized(self){
return [[_value retain] autorelease];
}
}
- (void)setValue:(NSString *)aValue{
@synchronized(self){
[aValue retain];
[_value release];
_value = aValue;
}
}
21. 簡述應用程序按Home鍵進入後臺時的生命週期,以及從後臺回到前臺時的生命週期?
應用程序的狀態:
Not running:未運行,程序沒啓動
Inactive :未激活,程序在前臺運行,不過沒接受到事件,沒有事件處理的狀態下一般處於這個狀態。
Active :激活 程序在前臺而且接收到了事件
Backgound :後臺 程序在後臺並且能執行代碼,大多數程序進入這個狀態後會在在這個狀態上停留一會。
Suspended :掛起 程序在後臺不能執行代碼。
- (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
//當程序載入後執行
22.描述應用程序的啓動順序。
①、程序入口main函數建立UIApplication實例和UIApplication代理實例
②、在UIApplication代理實例中重寫啓動方法,設置第一ViewController
③、在第一ViewController中添加控件,實現對應的程序界面。
23.ViewController的alloc,loadView。viewDidLoad,viewWillAppear,viewDidUnload,dealloc、init分別是在何時調用的?在自定義ViewController的時候這幾個函數裏面應該作什麼工做?(UI第三講 自定義視圖、視圖控制器)alloc初始化當前的ViewController
loadView:沒有正在使用nib視圖頁面,子類將會建立本身的自定義視圖層
viewDidLoad:試圖被加載後調用
viewWillAppear:試圖即將出現的時候調用
viewDidUnload:<iOS6以後廢棄>當系統內存吃緊的時候會調用該方法,釋放掉當前未在window中顯示的試圖和對應的控制器
24. 說說響應鏈
當事件發生的時候,響應鏈首先被髮送給第一個響應者(每每是事件發生的視圖,也就是用戶觸摸屏幕的地方)。事件將沿着響應者鏈一直向下傳遞,直到被接受並做出處理。通常來講,第一響應這是個視圖對象或者其子類,當其被觸摸後事件就交由它處理,若是他不處理,時間就會被傳遞給視圖控制器對象UIViewController(若是存在),而後是它的父視圖對象(superview),以此類推直到頂層視圖。接下來會沿着頂層視圖(topview)到窗口 (UIwindow對象)再到程序的(UIApplication對象),若是整個過程都沒有響應這個事件,則該事件被丟棄,通常狀況下,在響應鏈中只要有對象處理事件,事件就會被傳遞典型的響應路線圖如:First Responser -> The Window ->The Applicationn -> App Delegate
25. 線程是什麼?進程是什麼?兩者有什麼區別和聯繫? (UI第二十二講 多線程編程)
線程是CPU獨立運行和獨立調度的基本單位(能夠理解爲一個進程中執行的代碼片斷),進程是資源分配的基本單位(進程是一塊包含了某些資源的內存區域)。進程是線程的容器,真正完成代碼執行的是線程,而進程則做爲線程的執行環境。一個程序至少包含一個進程,一個進程至少包含一個線程,一個進程中的多個線程共享當前進程所擁有的資源。
26.談談你對多線程開發的理解?iOS中有幾種實現多線程的方法?(UI第二十二講 多線程編程)
好處:
①、使用線程能夠把程序中佔據時間長的任務放到後臺去處理,如圖片、視頻的下載
②、發揮多核處理器的優點,併發執行讓系統運行的更快、更流暢,用戶體驗更好
缺點:
①、大量的線程下降代碼的可讀性,
②、更多的線程須要更多的內存空間
③、當多個線程對同一個資源出現爭奪的時候要注意線程安全的問題。
iOS有三種多線程編程的技術:
①、NSThread(兩種建立方式)
[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];
NSThread *myThread = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];
[myThread start];
②、NSOperationQueue
NSOperationQueue *oprationQueue = [[NSOperationQueue alloc] init];
oprationQueue addOperationWithBlock:^{
//這個block語句塊在子線程中執行
}
http://alloc.sinaapp.com/wp/?p=237
③、Grand Central Dispatch (GCD)
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 耗時的操做
dispatch_async(dispatch_get_main_queue(), ^{
// 更新界面
});
});
http://blog.csdn.net/totogo2010/article/details/8016129
PS:不顯示的建立線程的方法:
用NSObject的類方法 performSelectorInBackground:withObject:
建立一個線程:
[Obj performSelectorInBackground:@selector(doSomething) withObject:nil];
27.線程同步和異步的區別?IOS中如何實現多線程的同步?
同步:一個線程要等待上一個線程執行完以後才能執行當前的線程,生活中的例子(上廁所)。
異步:同時去作兩件或者多件事。好比邊聽歌邊看報。
28. RunLoop是什麼?
RunLoop就是一個事件處理的循環,用來不停的調度工做以及處理輸入事件。使用RunLoop的目的是讓你的線程在有工做的時候忙於工做,而沒工做的時候處於休眠狀態。runloop的設計是爲了減小cpu無謂的空轉。
使用場景:一、須要使用Port或者自定義Input Source與其餘線程進行通信;二、子線程中使用了定時器;三、Cocoa中使用任何performSelector到了線程中運行方法;四、線程執行週期性任務。僅當在爲你的程序建立輔助線程的時候,你才須要顯式運行一個 RunLoop。
29.簡述你對UIView、UIWindow和CALayer的理解
UIView繼承於UIResponder, UIResponder繼承於NSObject,UIView能夠響應用戶事件。CALayer繼承於NSObject,因此CALayer不能響應事件。
UIView構建界面,UIView側重於對內容的管理,CALayer側重於對內容的繪製。
UIView是用來顯示內容的,能夠處理用戶事件;CALayer是用來繪製內容的,對內容進行動畫處理,依賴與UIView來進行顯示,不能處理用戶事件。
30. 爲何不少內置類如UITableViewController的delegate屬性都是assign而不是retain?請舉例說明。
防止循環引用,
Student * str=[];
Teacher *teacher=[[Teacher alloc] init];
Student * student=[[Student alloc] init];
teacher.delegate=student;
student.delegate= teacher;
在teacher中dealloc會release當前的Delegate,就會觸發student對象release,繼而也會致使student執行dealloc,在student中也會release本身的delegate,產生循環了。
31. iOS的動態性
iOS的動態性來自三個方面:動態類型、動態綁定、動態載入、SEL類型
①、動態類型<弱類型>(id):在代碼的運行階段判斷代碼的類型,使用id類型可讓應用在「運行時」使用任何類型來替換。動態類型讓程序更加靈活,可是會使數據的統一性下降和代碼的可讀性。咱們經常使用靜態類型<強類型>(如NSString),使用靜態類型編譯器能夠徹底分析你的代碼,這讓代碼的性能和可預知性更高。
②、動態綁定:讓代碼在運行時判斷須要調用什麼方法,而不是在編譯時。 動態類型和動態綁定使得選擇哪一個接收者已經調用什麼方法都放到運行時去完成。
③、動態載入:應用程序能夠根據須要加載可執行代碼以及資源,而不是在啓動時就加載全部資源。
④、SEL類型 iOS在編譯的時候會根據方法的名字(包括參數序列),生成一個用來區分這個方法的惟一的ID,這個ID是SEL類型的,SEL的本質就是類方法的編號[函數地址]。(相似C語言裏面的函數指針,可是OC的類不能直接使用函數指針,這樣只能作一個@selector語法來取。注意:@selector是查找當前類(含子類)的方法。)
32. What is lazy loading?
在使用的時候纔去初始化,好比UITableViewCell的imageView屬性,懶加載對象的建立是在getter方法裏面進行建立的。
33. 談談對性能優化的見解,如何作?
從用戶體驗出發:一、程序logging不要太長、二、相同數據不作重複獲取、三、昂貴資源要重用(cell、sqlite、date),四、良好的編程習慣和程序設計:選擇正確的集合對象和算法來進行編程、選擇適合的數據存儲格式(plist、SQLite)、優化SQLite查詢語句五、數據資源方面的優化(緩存和異步加載)
解決方案:
可以發現問題
利用log或工具分析問題緣由
假設問題緣由
改進代碼和設計
http://blog.csdn.net/yangxt/article/details/8173412
34. isKindOfClass、isMemberOfClass做用分別是什麼?
-(BOOL) isKindOfClass: classObj判斷是不是這個類或者是這個類子類的實例
-(BOOL) isMemberOfClass: classObj 判斷是不是這個類的實例
35. NSAutoreleasePool 是怎麼工做的?
自動釋放池以棧的形式實現:當你建立一個新的自動釋放池時,它將被添加到棧頂。當一個對象收到發送autorelease消息時,它被添加到當前線程的處於棧頂的自動釋放池中,當自動釋放池被回收時,它們從棧中被刪除, 而且會給池子裏面全部的對象都會作一次release操做.
36. 類工廠方法是什麼
類工廠方法的實現是爲了向客戶提供方便,它們將分配和初始化合在一個步驟中, 返回被建立的對象,並
進行自動釋放處理。這些方法的形式是+ (type)className...(其中 className不包括任何前綴)。
工廠方法可能不只僅爲了方便使用。它們不但能夠將分配和初始化合在一塊兒,還能夠 爲初始化過程提供對
象的分配信息。
類工廠方法的另外一個目的是使類(好比NSWorkspace)提供單件實例。雖 然init...方法能夠確認一
個類在每次程序運行過程只存在一個實例,但它須要首先分配一個「生的」實例,而後還必須釋放該實例。
工廠 方法則能夠避免爲可能沒有用的對象盲目分配內存。
37. block在ARC中和MRC中的用法有什麼區別,須要注意什麼
①.對於沒有引用外部變量的Block,不管在ARC仍是非ARC下,類型都是__NSGlobalBlock__,這種類型的block能夠理解成一種全局的block,不須要考慮做用域問題。同時,對他進行Copy或者Retain操做也是無效的
②.應注意避免循環引用
38. 網絡圖片處理問題中怎麼解決一個相同的網絡地址重複請求的問題?
利用字典(圖片地址爲key,下載操做爲value)
39. 你用過NSOperationQueue麼?若是用過或者瞭解的話,你爲何要使用NSOperationQueue,實現了什麼?請描述它和GCD的區別和相似的地方(提示:能夠從二者的實現機制和適用範圍來描述)。
1> GCD是純C語言的API,NSOperationQueue是基於GCD的OC版本封裝
2>GCD只支持FIFO的隊列,NSOperationQueue能夠很方便地調整執行順序、設置最大併發數量
3>NSOperationQueue能夠在輕鬆在Operation間設置依賴關係,而GCD須要寫不少的代碼才能實現
4>NSOperationQueue支持KVO,能夠監測operation是否正在執行(isExecuted)、是否結束(isFinished),是否取消(isCanceld)
5> GCD的執行速度比NSOperationQueue快
任務之間不太互相依賴:GCD
任務之間有依賴\或者要監放任務的執行狀況:NSOperationQueue
40.在異步線程中下載不少圖片,若是失敗了,該如何處理?請結合RunLoop來談談解決方案.(提示:在異步線程中啓動一個RunLoop從新發送網絡請求,下載圖片)
1> 從新下載圖片
2>下載完畢, 利用RunLoop的輸入源回到主線程刷新UIImageVIUew
41.Socket的實現原理及Socket之間是如何通訊的
socket起源於Unix,而Unix/Linux基本哲學之一就是「一切皆文件」,均可以用「打開open –> 讀寫write/read –> 關閉close」模式來操做。個人理解就是Socket就是該模式的一個實現,socket便是一種特殊的文件,一些socket函數就是對其進行的操做(讀/寫IO、打開、關閉);
本地的進程間通訊(IPC)有不少種方式,但能夠總結爲下面4類:
42.描述一下複用機制
通常是對 uiscrollview 作複用機制,由於 uiscrollview 滾動窗口沒 有複用,因此要作,原理就是超過屏幕的 view 不能銷燬,而要放 在複用隊列/池裏面存放起來,而後之後要在scrollview顯示view 首先不要 alloc 建立,而要首先去複用池裏面找有沒有可複用的 view,若是沒有就 alloc 若是有就直接用。
43.代理和協議什麼區別
代理是一種概念,協議是一種技術,代理是用協議來實現的,代理 是 2 個對象之間通信的一種方式。 代理主要作反向傳值的。實現系統的一些回調方法,好比 scrollview 滑動事件,選擇照片,asi 網絡下載完成等.iOS開發和Objective-c區別
44.OC 裏怎麼實現多繼承
OC 沒有多繼承。用協議實現多繼承,把協議中的方法在實現的類 中重寫 C++有多繼承,多繼承其實用好了很方便。C++多繼承很容易出現 二一性好比:
類A { int a;}
類B: 類A,類C:類A
類D : B, C那麼 int a究竟是繼承自誰的 單繼承
45.POST 和 GET 有何區別
GET 和 POST 都是 HTTP 請求方式的 2 中。
POST 是安全的。GET 是不安全的。GET 是放在瀏覽器中地址暴露 出來了。POST 不會。可是在 App 上 GET 和 POST 都看不見。 GET 和 POST 都是和服務器提交參數/通信的一種方式。
GET 參數不能太長<1024B POST 沒有限制<4G
GET 不能上傳文件, POST 能夠上傳文件。
46.copy 和 mutableCopy 區別
copy 是拷貝,mutableCopy 是可變拷貝,好比把 NSString 經過 mutableCopy 變 成 NSMutableString, 把 NSArray 通 過 mutableCopy 變成 NSMutableArray。與之相似NSString ->NSMutableString, NSArray->NSMutableArray, NSDictionary->NSMutableDictionary, NSData->NSMutableData。
47.咱們說的OC是動態運行時語言是什麼意思?
多態。 主要是將數據類型的肯定由編譯時,推遲到了運行時。
這個問題其實淺涉及到兩個概念,運行時和多態。
簡單來講,運行時機制使咱們直到運行時纔去決定一個對象的類別,以及調用該類別對象指定方法。
多態:不一樣對象以本身的方式響應相同的消息的能力叫作多態。意思就是假設生物類(life)都用有一個相同的方法-eat;
那人類屬於生物,豬也屬於生物,都繼承了life後,實現各自的eat,可是調用是咱們只需調用各自的eat方法。
也就是不一樣的對象以本身的方式響應了相同的消息(響應了eat這個選擇器)。
所以也能夠說,運行時機制是多態的基礎?
48.在項目何時選擇使用GCD,何時選擇NSOperation?
項目中使用NSOperation的優勢是NSOperation是對線程的高度抽象,在項目中使用它,會使項目的程序結構更好,子類化NSOperation的設計思路,是具備面向對象的優勢(複用、封裝),使得實現是多線程支持,而接口簡單,建議在複雜項目中使用。
項目中使用GCD的優勢是GCD自己很是簡單、易用,對於不復雜的多線程操做,會節省代碼量,而Block參數的使用,會是代碼更爲易讀,建議在簡單項目中使用。
49.runloop和線程有什麼關係?
總的說來,Run loop,正如其名,loop表示某種循環,和run放在一塊兒就表示一直在運行着的循環。實際上,run loop和線程是緊密相連的,能夠這樣說run loop是爲了線程而生,沒有線程,它就沒有存在的必要。Run loops是線程的基礎架構部分, Cocoa 和 CoreFundation 都提供了 run loop 對象方便配置和管理線程的 run loop (如下都以 Cocoa 爲例)。每一個線程,包括程序的主線程( main thread )都有與之相應的 run loop 對象。
runloop 和線程的關係:主線程的run loop默認是啓動的。iOS的應用程序裏面,程序啓動後會有一個以下的main()函數
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
重點是UIApplicationMain()函數,這個方法會爲main thread設置一個NSRunLoop對象,這就解釋了:爲何咱們的應用能夠在無人操做的時候休息,須要讓它幹活的時候又能立馬響應。
對其它線程來講,run loop默認是沒有啓動的,若是你須要更多的線程交互則能夠手動配置和啓動,若是線程只是去執行一個長時間的已肯定的任務則不須要。
在任何一個 Cocoa 程序的線程中,均可以經過如下代碼來獲取到當前線程的 run loop 。
NSRunLoop *runloop = [NSRunLoop currentRunLoop];
50.在block內如何修改block外部變量?
默認狀況下,在block中訪問的外部變量是複製過去的,即:寫操做不對原變量生效。可是你能夠加上__block來讓其寫操做生效,示例代碼以下:
__block int a = 0;
void (^foo)(void) = ^{
a = 1;
}
f00();
//這裏,a的值被修改成1
51. GCD的隊列(dispatch_queue_t)分哪兩種類型?
串行隊列Serial Dispatch Queue
並行隊列Concurrent Dispatch Queue
52. lldb(gdb)經常使用的調試命令?
1. breakpoint 設置斷點定位到某一個函數
2. n 斷點指針下一步
3. po打印對象
53. 使用block時什麼狀況會發生引用循環,如何解決?
一個對象中強引用了block,在block中又使用了該對象,就會發射循環引用。 解決方法是將該對象使用__weak或者__block修飾符修飾以後再在block中使用。
id weak weakSelf = self; 或者 weak __typeof(&*self)weakSelf = self該方法能夠設置宏
id __block weakSelf = self;
54. 簡述NotificationCenter、KVC、KVO、Delegate?並說明它們之間的區別?
Notification:觀察者模式,controller向defaultNotificationCenter添加本身的 notification,其餘類註冊這個notification就能夠收到通知,這些類能夠在收到通知時作本身的操做(多觀察者默認隨機順序發通知給 觀察者們,並且每一個觀察者都要等當前的某個觀察者的操做作完才能輪到他來操做,能夠用NotificationQueue的方式安排觀察者的反應順序,也 能夠在添加觀察者中設定反映時間,取消觀察須要在viewDidUnload 跟dealloc中都要註銷)。
KVC鍵值編碼,能夠直接經過字符串的名字(key)來間接訪問屬性的機制,而不是經過調用getter和setter方法訪問。
KVO:觀測指定對象的屬性,當指定對象的屬性更改以後會通知相應的觀察者。
delegate:一對一,delegate遵循某個協議並實現協議聲明的方法。
55. iOS本地數據存儲都有哪幾種方式?iOS如何實現複雜對象的存儲?
1. NSKeyedArchiver(歸檔)採用歸檔的形式來保存數據,該數據對象須要遵照NSCoding協議,而且該對象對應的類必須提供encodeWithCoder:和initWithCoder:方法。2. NSUserDefaults:用來保存應用程序設置和屬性、用戶保存的數據。用戶再次打開程序或開機後這些數據仍然存在。NSUserDefaults能夠存儲的數據類型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。
3. Write寫入方式:永久保存在磁盤中。
4. SQLite(FMDB、CoreData)
NSCoding + NSKeyedArchiver實現複雜對象的存儲。
56.爲何不少內置類如UITableViewController的delegate屬性都是assign而不是retain?請舉例說明。
防止循環引用,
Student * str=[];
Teacher *teacher=[[Teacher alloc] init];
Student * student=[[Student alloc] init];
teacher.delegate=student;
student.delegate= teacher;
在teacher中dealloc會release當前的Delegate,就會觸發student對象release,繼而也會致使student執行dealloc,在student中也會release本身的delegate,產生循環了。
57. 如何監測系統鍵盤的彈出
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector( ) name:UIKeyboardWillShowNotification object:nil];
58. RunLoop是什麼?
RunLoop就是一個事件處理的循環,用來不停的調度工做以及處理輸入事件。使用RunLoop的目的是讓你的線程在有工做的時候忙於工做,而沒工做的時候處於休眠狀態。runloop的設計是爲了減小cpu無謂的空轉。
使用場景:一、須要使用Port或者自定義Input Source與其餘線程進行通信;二、子線程中使用了定時器;三、Cocoa中使用任何performSelector到了線程中運行方法;四、線程執行週期性任務。僅當在爲你的程序建立輔助線程的時候,你才須要顯式運行一個 RunLoop。
59. 說說你在項目中使用Git 的.
可視化工具(sourcetree)
服務器上建立倉庫 -> clone -> 修改 -> commit -> pull -> push
git命令行 cd 將你準備要上傳的文件夾拖拽到這裏, 自動生成路徑 -> git init -> git add .添加全部文件(只是在本地準備好,注意那個「.」表示全部文件) -> git commit -m 'version 1.2.6'引號中是說明信息 -> git remote add origingit@bitbucket.org:**********git ->git push origin master 上傳步驟到此完成
60.使用圓角效果時爲何會出現卡頓效果,如何解決這個問題?
不要在滾動視圖使用cornerRadius或者mask,添加 self.layer.shouldRasterize = YES; self.layer.rasterizationScale = [UIScreen mainScreen].scale;
採起預先生成圓角圖片,並緩存起來這個方法纔是比較好的手段。預處理圓角圖片能夠在後臺處理,處理完畢後緩存起來,再在主線程顯示,這就避免了沒必要要的離屏渲染了。
61.簡述可視化和純代碼的優缺點.
可視化: 優勢:快,易操做.缺點:團隊合做時容易出現xib代碼衝突問題.
純代碼: 優勢:團隊合做時不易出問題,並且代碼邏輯清楚,擴展性強.缺點:編寫速度沒有可視化快速.
62. UITableView如何優化.(可查看下面地址中內容,而後記住)
http://longxdragon.github.io/2015/05/26/UITableView%E4%BC%98%E5%8C%96%E6%8A%80%E5%B7%A7/
提早計算並緩存好高度(佈局),由於heightForRowAtIndexPath:是調用最頻繁的方法;
異步繪製,遇到複雜界面,遇到性能瓶頸時,可能就是突破口;
滑動時按需加載,這個在大量圖片展現,網絡加載的時候很管用!(SDWebImage已經實現異步加載,配合這條性能槓槓的)。
關注iOS開發:iOSDevTip
除了上面最主要的三個方面外,還有不少幾乎大夥都很熟知的優化點:
正確使用reuseIdentifier來重用Cells
儘可能使全部的view opaque,包括Cell自身
儘可能少用或不用透明圖層
若是Cell內現實的內容來自web,使用異步加載,緩存請求結果
減小subviews的數量
在heightForRowAtIndexPath:中儘可能不使用cellForRowAtIndexPath:,若是你須要用到它,只用一次而後緩存結果
儘可能少用addView給Cell動態添加View,能夠初始化時就添加,而後經過hide來控制是否顯示
63.你作過哪些項目?項目中有何亮點技術點?
應用介紹:如作的XXX項目用戶量達到XX萬。
一、應用中的功能豐富(如圖文混排、定位、支付、雲等等)
二、邏輯複雜(使用設計模式,多線程)
三、數據庫設計,預留冗餘等。複雜交互(如使用了html,JS等,混編實現XX功能)
四、屏幕適配(此段沒必要提第三方)
64.有沒有在AppStore上架產品?簡單描述上架過程。
有。上架過程1.登陸developer.apple.com。2.在member center中,首先建立App ID。3.建立配置文件,選擇(App Store或Ad Hoc)。4.證書和配置文件以及bundle id就建立好了。在本地項目中作出相應設置。5.設置Build Settings,debug 對應的是開發證書和開發的配置文件,release對應的是發佈證書和發佈配置文件,development對應的是測試環境,production對應的是生產環境。請你們根據實際狀況選擇對應的證書和配置文件。6.修改bundle ID (與以前在developer上建立的bundle ID保持一致)和 bundle name(app的名字)。7.打包以前,先到https://itunesconnect.apple.com 建立應用的名字填入相應的應用信息,應用截圖,基本應用的資料 以及手動發行和自動發行版本等等。8.archive打包 ,根據需求(上傳或測試)選擇證書、配置文件和scheme。9.選擇submit後會彈出一個選擇帳戶的提示框,選擇相應的開發者帳戶就好,下一步至上傳完成。
如下問題答案多樣本身度娘!
65.項目上架遇到過什麼問題?被拒緣由?
66.項目開發過程當中有沒有遇到什麼問題?如何解決?
67.寫過哪些技術文檔?
68.有沒有作過支付?須要注意哪些問題?
69.有沒有作過地圖開發?須要注意哪些問題?
70.簡單描述一下推送的過程。本地推送和遠程推送有什麼區別?
71.對iOS9有了解麼?
72.有沒有作適配?怎麼作的?
73.Swift有幾個版本?swift2.1與以前有什麼變化?
74.寫一下swift代理的實現。
75.寫一下swift的類,帶有存儲屬性和計算屬性。
76.講述一次在這個APP中,用戶觸發了一個事件,引發了一個服務請求,而後獲取服務端返回,而且更新前端界面的過程。請說的詳細一點,好比數據通過了哪些類的處理,每一次傳遞時的格式是怎麼樣的?
77. 你參與的APP,是如何處理多個服務的同步發起的?
使用iOS線程技術,建立並行隊列來分別執行不一樣的任務。將不一樣的任務加入到子隊列當中,任務執行後回到主線程當中刷新UI界面。
APP 界面通常都是根據產品需求和UI效果圖來完成的,可是咱們爲了提升代碼的複用性,會將視圖的實現進行封裝,而後在控制器當中進行加載調用。
78.數據持久化存儲方案有哪些?
1)plist文件(屬性列表)
2)preference(偏好設置)
3) NSKeyedArchiver(歸檔)
4)SQlite
5) CoreData
79.沙盒的目錄結構是怎樣的?各自通常用於什麼場合?
Documents :最經常使用的目錄,iTunes同步該應用時會同步此文件夾中的內容,適合存儲重要數據。
Library\Caches: iTunes不會同步此文件夾,適合存儲體積大,不須要備份的非重要數據
Preferences:iTunes同步該應用時會同步此文件夾中的內容,一般保存應用的設置信息
tmp :iTunes不會同步此文件夾,系統可能在應用沒運行時就刪除該目錄下的文件,因此此目錄適合保存應用中的一些臨時文件,用完就刪除。
80.SQL語句問題:inner join、left join、right join的區別是什麼?
left/ right join 是外部連接,inner join 是內鏈接
外部連接有主表和從表,主表在left中是左側表,right中是右側表,主表數據會所有顯示,從表數據只顯示關聯部分匹配數據,無匹配的數據用null補全。內鏈接則只顯示兩表關聯條件匹配的數據
注:所謂關聯條件便是指on 的條件
81.sqlite的優化。
數據庫在使用的時候必定要與多線程相結合的。項目中用到了數據庫,假如其中一個表有33萬條數據。對這個表進行查詢,執行相似「SELECT * FROM table1 where ds_key like 'asd%%'」這樣的語句,在Touch上用了大概11秒,體驗不好。
調查發現,雖然已經對table1增長了索引,可是在實際執行的時候,若是查詢條件包含LIKE,就不會使用索引。
想知道查詢是否是用了索引,能夠參考http://www.sqlite.org/eqp.html這個連接提供的方法進行驗證。
而改爲「SELECT * FROM table1 where ds_key >= 'asd' and ds_key < 'ase'」這樣的語句,查詢時就會使用到索引,花費時間只有零點幾秒,效率提升了幾十倍。
固然,這隻針對查詢以某個字符串開頭的記錄的狀況,而對於like '%%asd%%'這樣的就無法優化了。
82.網絡通訊用過哪些方式(100%的人說了AFNetworking...)如何處理多個網絡請求併發的狀況
1)、直接使用socket的方式
2)、AFNetworking
使用多線程中的併發隊列去處理網絡的併發請求。
83.在網絡請求中如何提升性能
在網絡請求中如何保證安全性
iOS 在數據傳輸過程當中有數據泄露的可能,客戶端在進行網絡請求時通常都採用加密的方式來保證數據的安全性,在iOS9之後,蘋果爲了保護數據的安全性,使用了Https協議。
84.內存中的棧和堆的區別是什麼?
管理方式:對於棧來說,是由編譯器自動管理的,無需咱們手動控制,對於堆來說,釋放工做有程序猿控制,這樣就容易產生memory Leak
申請大小: 棧是向低地址擴展的數據結構,是一塊連續的內存區域。這句話的意思是棧頂上的地址和棧的最大容量是系統預先規定好的,在Windows下,棧的大小是2M(也有的說1M,總之是編譯器肯定的一個常數),若是申請的空間超過了棧的剩餘空間時候,就overflow。所以,能得到棧的空間較小。
堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是因爲系統是用鏈表來存儲的空閒內存地址的,天然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大笑受限於計算機系統中有效的虛擬內存。因而可知,堆得到的空間比較靈活,也比較大
碎片問題:
對於堆來說,頻繁的new/delete勢必會形成內存空間的不連續,從而形成大量的碎片,使程序效率下降。對於棧來說,則不會存在這個問題,由於棧是先進後出的隊列,他們是如此的一一對應,以致於永遠都不可能有一個內存快從棧中彈出
分配方式:
堆都是動態分配的,沒有靜態分配的堆。棧有兩種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,好比局部變量的分配。動態分配是有alloc函數進行分配的,可是棧的動態分配和堆是不一樣的,他的動態分配由編譯器進行釋放,無需咱們手工實現。
分配效率:
棧是機器系統提供的數據結構,計算機會在底層堆棧提供支持,分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函數庫提供的,他的機制是很複雜的。
85.那些數據在棧上,哪些在堆上?
棧:在函數調用時,第一個進棧的是主函數中後的下一條指令(函數調用語句的下一條可執行語句)的地址,而後是函數的各個參數,在大多數的C編譯器中,參數是由右往左入棧的,而後是函數中的局部變量。注意靜態變量是不入棧的。當本次函數調用結束後,局部變量先出棧,而後是參數,最後棧頂指針指向最開始存的地址,也就是主函數中的下一條指令,程序由該點繼續運行。
堆:通常是在堆的頭部用一個字節存放堆的大小。堆中的具體內容由程序員安排。
86.#define和const定義的變量,有什麼區別什麼狀況下會出現內存的循環引用block中的weak self,是任什麼時候候都須要加的麼?
1. 宏:只是在預處理器裏進行文本替換,沒有類型,不作任何類型檢查,編譯器能夠對相同的字符串進行優化。只保存一份到 .rodata 段。甚至有相同後綴的字符串也能夠優化,你能夠用GCC 編譯測試,"Hello world" 與 "world" 兩個字符串,只存儲前面一個。取的時候只須要給前面和中間的地址,若是是整形、浮點型會有多份拷貝,但這些數寫在指令中。佔的只是代碼段而已,大量用宏會致使二進制文件變大.常量:共享一塊內存空間,就算項目中N處用到,也不會分配N塊內存空間,能夠根據const修飾的位置設定可否修改,在編譯階段會執行類型檢查
2. (1)計時器NSTimer
一方面,NSTimer常常會被做爲某個類的成員變量,而NSTimer初始化時要指定self爲target,容易形成循環引用。 另外一方面,若timer一直處於validate的狀態,則其引用計數將始終大於0.
(2)block
block在copy時都會對block內部用到的對象進行強引用(ARC)或者retainCount增1(非ARC)。在ARC與非ARC環境下對block使用不當都會引發循環引用問題,通常表現爲,某個類將block做爲本身的屬性變量,而後該類在block的方法體裏面又使用了該類自己,簡單說就是self.someBlock = ^(Type var){[self dosomething];或者self.otherVar = XXX;或者_otherVar = ...};block的這種循環引用會被編譯器捕捉到並及時提醒。
(3)委託delegate
在委託問題上出現循環引用問題已是老生常談了,本文也再也不細講,規避該問題的殺手鐗也是簡單到哭,一字訣:聲明delegate時請用assign(MRC)或者weak(ARC),千萬別手賤玩一下retain或者strong,畢竟這基本逃不掉循環引用了!
3. 使用方將self或成員變量加入block以前要先將self變爲__weak
87.GCD的queue,main queue中執行的代碼,必定是在main thread麼?
88.NSOperationQueue有哪些使用方式?
一種在iOS中執行併發操做的方法,是使用NSOperation和NSOperationQueue類。在本教程中,你將學習如何使用它們!你會先建立一款不使用多線程的app,這樣它會變得響應很是遲鈍。而後改進程序,添加上並行操做–而且但願–能夠提供一個交互響應更好的界面給用戶!
另外一種處理操做之間的依賴關係,若是操做直接有依賴關係,好比第二個操做必須等第一個操做結束後再執行。控制線程池中的線程數,具體參考http://blog.sina.com.cn/s/blog_45e2b66c0100ztz7.html
89.NSThread中的Runloop的做用,如何使用?
有些狀況下,咱們仍是在運行一些長線任務或者複雜任務的時候須要用比較原始的NSThread。這就須要爲NSThread建立一個run loop.
1 NSThread *thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(playerThread: ) object:nil];
2 [thread start];
3 //若是要利用NSOperation,原理相似。只須要加入到queue裏面去就行了。。queue會在合適的時機調用方法,下面代碼做爲參考。
4 - (void) playerThread: (void*)unused
5 {
6 audioRunLoop = CFRunLoopGetCurrent();//子線程的runloop引用
7 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];//子線程的
8 [self initPlayer]; CFRunLoopRun(); //運行子線程的
9 [pool release]; // run loop,這裏就會停住了。
10 }
11 // 實現一個timer,用於檢查子線程的工做狀態,並在合適的時候作任務切換。或者是合適的時候停掉本身的
12 -(void) initPlayer {
13 // 在這裏你能夠初始化一個工做類,好比聲音或者視頻播放
14 NSTimer *stateChange = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:
15 @selector(checkStatuserInfo:nil repeats:YES];
16 }
17 -(void) checkState:(NSTimer*) timer
18 {
19 if(須要退出自線程了) {
20 //釋放子線程裏面的資源
21 CFRunLoopStop( CFRunLoopGetCurrent());//結束子線程任務
22 }
23 }
90.h文件中的成員變量,外部能夠直接訪問麼?(注意是變量,不是property)
成員變量,有三種權限,就是你們都知道的@private、@protected、@public ,寫在.m文件中時,至關因而@private權限,子類沒法訪問,驗證了一下,作權限修改也無效。而寫在.h文件中,默認是@protected權限,子類能夠訪問,能夠作權限修改。由於訪問權限指針對.h文件。.h文件中成員變量,外部類對其的調用,跟C++同樣,用->來調用。
91.講述一下runtime的概念,message send若是尋找不到相應的對象,會如何進行後續處理 ?
簡單來講,Objective-C runtime是一個實現Objective-C語言的C庫。對象能夠用C語言中的結構體表示,而方法(methods)能夠用C函數實現。事實上,他們 差很少也是這麼幹了,另外再加上了一些額外的特性。這些結構體和函數被runtime函數封裝後,Objective-C程序員能夠在程序運行時建立,檢 查,修改類,對象和它們的方法。
runtime不須要知道Foundation。runtime會讓程序定義轉發函數 (forwarding function),當 objc_msgSend()沒法找到該selector的實現時,那個轉發函數就會被調用。程序一啓動,CoreFoundation就將 -forwardInvocation:定義成轉發函數。
參考網站 http://mobile.51cto.com/hot-434685.htm
92.TCP和UDP的區別是什麼?
TCP面向鏈接、傳輸可靠(保證數據正確性,保證數據順序)、用於傳輸大量數據(流模式)、速度慢,創建鏈接須要開銷較多(時間,系統資源)。
UDP面向非鏈接、傳輸不可靠、用於傳輸少許數據(數據包模式)、速度快。
93.MD5和Base64的區別是什麼,各自場景是什麼?
MD5: 全稱爲message digest algorithm 5(信息摘要算法), 能夠進行加密, 可是不能解密, 屬於單向加密, 一般用於文件校驗
Base64: 把任意序列的8爲字節描述爲一種不易爲人識別的形式, 一般用於郵件、http加密. 登錄的用戶名和密碼字段經過它加密, 能夠進行加密和解密.
94.二叉搜索樹的概念,時間複雜度多少?
二叉查找樹(Binary Search Tree),也稱有序二叉樹(ordered binary tree),排序二叉樹(sorted binary tree),是指一棵空樹或者具備下列性質的二叉樹:
1. 若任意節點的左子樹不空,則左子樹上全部結點的值均小於它的根結點的值;
2. 若任意節點的右子樹不空,則右子樹上全部結點的值均大於它的根結點的值;
3. 任意節點的左、右子樹也分別爲二叉查找樹。
4. 沒有鍵值相等的節點(no duplicate nodes)。
它和二分查找同樣,插入和查找的時間複雜度均爲lgN,可是在最壞的狀況下仍然會有N的時間複雜度。緣由在於插入和刪除元素的時候,樹沒有保持平衡
95.哪些類不適合使用單例模式?即便他們在週期中只會出現一次。
工具類,不須要存儲數據的.
96.如何添加一個自定義字體到工程中
97.如何製做一個靜態庫/動態庫,他們的區別是什麼?
使用靜態庫的好處
1,模塊化,分工合做
2,避免少許改動常常致使大量的重複編譯鏈接
3,也能夠重用,注意不是共享使用
動態庫使用有以下好處:
1使用動態庫,能夠將最終可執行文件體積縮小
2使用動態庫,多個應用程序共享內存中得同一份庫文件,節省資源
3使用動態庫,能夠不從新編譯鏈接可執行程序的前提下,更新動態庫文件達到更新應用程序的目的。
98.Configuration中,debug和release的區別是什麼?
Release是發行版本,比Debug版本有一些優化,文件比Debug文件小 Debug是調試版本,Debug和Release調用兩個不一樣的底層庫。
1、"Debug是調試版本,包括的程序信息更多"
2、只有DEBUG版的程序才能設置斷點、單步執行、使用TRACE/ASSERT等調試輸出語句。
3、REALEASE不包含任何調試信息,因此體積小、運行速度快。
99.介紹一下響應者鏈以及它的工做流程。
OS系統檢測到手指觸摸(Touch)操做時會將其打包成一個UIEvent對象,並放入當前活動Application的事件隊列,單例的UIApplication會從事件隊列中取出觸摸事件並傳遞給單例的UIWindow來處理,UIWindow對象首先會使用hitTest:withEvent:方法尋找這次Touch操做初始點所在的視圖(View),即須要將觸摸事件傳遞給其處理的視圖,這個過程稱之爲hit-test view。
響應者對象(Responder Object): 指的是 有響應和處理事件能力的對象。 響應者鏈就是由一系列的響應者對象 構成的一個層次結構。
UIAppliction --> UIWiondw -->遞歸找到最適合處理事件的控件-->控件調用touches方法-->判斷是否實現touches方法-->沒有實現默認會將事件傳遞給上一個響應者-->找到上一個響應者
UIResponder 是全部響應對象的基類,在UIResponder類中定義了處理上述各類事件的接口。咱們熟悉的 UIApplication、 UIViewController、 UIWindow 和全部繼承自UIView的UIKit類都直接或間接的繼承自UIResponder,因此它們的實例都是能夠構成響應者鏈的響應者對象
100.發送10個網絡請求,而後再接收到全部迴應以後執行後續操做,如何實現?
開闢一個子線程,而後建立10個並行隊列
實現一個第三方控件,能夠在任什麼時候候出如今APP界面最上層
實現一個最簡單的點擊拖拽功能。上面那個拖拽以外,若是在手放開時,須要根據速度往前滑動呢?
101.如何減少一個應用程序佔用存儲空間?
檢查程序 去掉多餘的xib。iOS App Store相關因素做爲提交到App Store中app裏的可執行文件是被加過密的。加密的反作用是可執行文件的壓縮效果沒有以前的好了。Build Settings編譯選項,將build setting中的Optimization Level設置爲Fastest, Smallest [-Os]; 將build setting 中的Strip Debug Symbols During Copy設置爲YES(COPY_PHASE_STRIP = YES),這樣能夠減少編譯出二進制文件的尺寸。Target針對較少的CPUs對程序指定的特定CPU類型作優化處理,以生成相對於的可執行文件。不一樣的硬件,將運行不一樣的可執行代碼。雖然這樣優化後的程序,只能針對某些設備運行,可是這大大減少可執行程序的大小。要想只設定特定類型的CPUs,能夠修改build setting中的Architectures,將其從Standard $(ARCHS_STANDARD)修改成你但願支持的列表中對應的特定類型CPU。有效的CPU名稱列在Valid Architectures (VALID_ARCHS) build setting中。請不要修改Valid Architectures設置項,最好由Xcode管理。儘可能使用8-bit圖片。使用8-bit的PNG圖片,比32-bit的圖片能減小4倍的壓縮率。因爲8-bit的圖片支持最多256種不一樣的顏色,因此8-bit的圖片通常只應該用於一小部分的顏色圖片。例如灰度圖片最好使用8-bit。
102.如何提升一個應用程序的性能?
一、使用ARC減小內存失誤,dealloc須要重寫並對屬性置nil。二、重用。三、儘可能少使用透明或半透明。會產生額外的運算。四、少用運算得到圓角,不論view.maskToBounds仍是layer.clipToBounds都會有很大資源開銷,必需要用圓角的話不如圖片自己就作成圓角。五、不要阻塞主線程。六、使用正確的容器類型。七、圖片與imageView相同大小避免多餘運算。八、使用懶加載。九、使用繪製。
103.不一樣版本的APP,數據庫結構變化了,如何處理?(數據庫遷移)
數據庫遷移問題,通常項目中使用數據框架有兩種Sqlite和CoreData。
在Sqlite中有Alter命令修改數據庫的結構和庫名。
//對於老用戶,數據庫已經存在,須要修改
1.查詢舊錶NSString *searchSql = [NSString stringWithFormat:@"select sql from sqlite_master where tbl_name='表名' and type='table'"];
2.若找到舊錶,判斷是否存儲記錄,添加新字段或更名
NSString *sql_add = "ALTER TABLE 表名 ADD 字段名 字段類型」;
或者修改表名
ALTER TABLE 原表名 RENAME TO 新表名;
3.執行改sqlite3_exec(數據庫, sql_add, NULL, NULL, NULL)!=SQLITE_OK。
4.釋放伴隨指針。
104.同一個工程中ARC和非ARC 的如何混合使用?
點擊項目->TARGETS->Build Phases->Compile Sources中選擇要改的.m,雙擊,在標籤中添加:
1.若是是ARC項目,要加入非ARC的代碼文件:-fobjc-arc
2.若是是非ARC,要加入ARC的代碼: -fno-objc-arc
回車