答:管理方式:對於棧來說,是由編譯器自動管理,無需咱們手工控制;對於堆來講,釋放工做由程序員控制,容易產生memory leakjava
二、數組和鏈表什麼區別?ios
答:數組是將元素在內存中連續存放,因爲每一個元素佔用內存相同,能夠經過下標迅速訪問數組中任何元素。程序員
鏈表剛好相反,鏈表中的元素在內存中不是順序存儲的,而是經過存在元素中的指針聯繫到一塊兒。
三、delegate和notification什麼區別,什麼狀況使用?objective-c
答:Delegate:
消息的發送者(sender)告知接收者(receiver)某個事件將要發生,delegate贊成然而後發送者響應事件,數據庫
delegate機制使得接收者能夠改變發送者的行爲。編程
一般發送者和接收者的關係是直接的一對多的關係。數組
Notification:
消息的發送者告知接收者事件已經發生或者將要發送,僅此而已,接收者並不能反過來影響發送者的行爲。安全
一般發送者和接收者的關係是間接的多對多關係。服務器
四、什麼是MVC,爲何使用MVC,有什麼好處?多線程
答: 分別爲: 模型(Model),視圖(View)和控制Controller)。
模型(Model) 「數據模型」(Model)用於封裝與應用程序的業務邏輯相關的數據以及對數據的處理方法。
「模型」有對數據直接訪問的權力,例如對數據庫的訪問。
視圖(View) 視圖層可以實現數據有目的顯示。
控制器(Controller) 控制器起到不一樣層面間的組織做用,用於控制應用程序的流程。
5.Objective-C的類能夠多重繼承麼?能夠實現多個接口麼?Category是什麼?重寫一個類的方式是用繼承好,仍是用分類好,爲何?
答案:
Objective-C的類不支持多繼承。能夠實現多可接口(協議)。
Category是Objective-C的類別,是一種爲現有的類添加新方法的方式。
重寫一個類的方式用繼承好。(1)使用繼承能夠定義一個具備父類全部功能的新類,它繼承了父類的這些功能,當與父類功能有所不一樣時候,能夠在子類中將其覆蓋。(2)類別中沒法向類中添加新的實例變量,類別沒有位置容納實例變量。
說明:
類別有兩個方面的侷限性:第一,沒法向類中添加新的實例變量。類別沒有位置容納實例變量。第二,命名衝突,即類別中的方法與現有的方法重名。當發生命名衝突時,類別具備更高的優先級。你的類別方法將徹底取代初始方法,從而沒法再使用初始化方法。有些編程人員再本身的類別方法中增長一個前綴,以確保不發生命名衝突。
類別的做用:Cocoa中的類別主要用於3個目的:將類的實現分散到多個不一樣文件或多個不一樣框架中,建立對私有方法的前向引用,以及向對象添加非正式協議。
6.#import與#include有什麼區別?#import <> 與 #import "" 又有什麼區別?
答案:
C語言使用#include語句通知編譯器應在頭文件中查詢定義。在Objective-C程序中也可使用#include來實現這個目的。#import是GCC編譯器提供的,Xcode在編譯Objective-C、和C++程序時候都會使用它。#import能夠保證頭文件只被包含一次,而不論此命令實際上在那個文件中出現多少次。通常來講,在導入Objective-C頭文件的時候使用#import,在包含C頭文件時使用#include。
#import "" 指示預處理程序在一個或者多個文件目錄(一般首先在包含源文件的目錄中查找,可是經過修改適當的「項目設置」,能夠用Xcode指定預處理程序搜索的確切位置)中尋找指定文件。
#import <> 將致使預處理程序只在特殊的「system」頭文件目錄中尋找包含文件,當前目錄不會被搜索,一樣,使用Xcode能夠經過修改菜單中選擇「項目」、「編輯項目設置」來更改這些目錄。
#import <Foundation/Foundation.h>語句告訴編譯器查看Fondation框架中的Foundation.h頭文件。
7.類變量的@protected,@private,@public,@package聲明各有什麼含義?
答案:
@protected —Methods defined in the class and any subclasses can directly access the instance variables that follow.This is the default case.
該類和全部的子類中的方法能夠直接訪問這樣的變量,這是默認的。
@private —Methods defined in the class can directly access the instance variables that follow, but subclasses cannot.
該類中的方法能夠訪問這樣的變量,子類不能夠。
@public —Methods defined in the class and any other classes or modules can di- rectly access the instance variables that follow.
除了本身和子類中的方法外,也能夠被其餘類或者其餘模塊中的方法所訪問。開放性最大。
@package —For 64-bit images, the instance variable can be accessed anywhere within the image that implements the class.
對於64位圖像,這樣的成員變量能夠在實現這個類的圖像中隨意訪問。
8.id聲明的對象有什麼特性?
答案:id是任意對象類型的,不能表示基本對象類型。id類型是通用指針類型,由於經過指針,也就是內存地址來引用對象,因此能夠自由地將它們在id變量之間來回賦值。所以,返回id類型值的方法是返回指向內存中某對象的指針。而後能夠將該值賦給任何對象變量。由於不管在哪裏,對象老是攜帶它的isa成員。因此即便將它存儲在id類型的通用對象變量中,也老是能夠肯定它的類。
九、從一個數組中找出重複的元素打印出來
NSArray *arr = [NSArrayarrayWithObjects:@"1",@"2",@"1",@"7",@"4",@"5",@"2",@"6",@"5",nil];
NSMutableArray *arrmu = [[NSMutableArray alloc]init];//過濾
NSMutableArray *sameArray = [[NSMutableArrayalloc]init];//找出相同的
for (int i = 0 ; i < [arrcount]; i++) {
id str = [arr objectAtIndex:i];
if ([arrmu count] == 0)
{
[arrmu addObject:str];
}
else{
BOOL flag = NO;
for (int j = 0; j < [arrmu count]; j++ ) {
if ([strisEqual:[arrmu objectAtIndex:j]])
{
[sameArrayaddObject:str];
flag =YES;
break;
}
else{
flag =NO;
}
}
if (flag == NO) {
[ arrmuaddObject:str];
}
}
}
NSLog(@"sameArray : %@",sameArray);
還有兩種直接找出的方法,上代碼:
一:
NSArray *arr = [NSArrayarrayWithObjects:@"1",@"2",@"1",nil];
NSSet *set = [NSSet setWithArray:arr];
NSLog(@"%@",[set allObjects]);
二:
NSArray *arr =@[@1,@2,@1];
NSMutableDictionary *dict = [NSMutableDictionarydictionary];
for (NSNumber *numberin arr) {
[dict setObject:number forKey:number];
}
NSLog(@"%@",[dictallValues]);
十、UITableView可否綁定多個數據源?
答:不能
十一、一個UIViewController可否管理多個UITableView ?
答:能夠
十二、ios四、五、6相對於以前的版本添加了哪些新特性?
這個就比較多了,好比:拋棄谷歌地圖 新推Maps應用 ,大幅增強中國本地化支持,Siri開口講普通話,經過iCloud體驗分享樂趣,Passbook電子票券管理,隨時隨地的FaceTime,電話功能加強,Safari支持全屏瀏覽,Mail應用新增VIP,萬能輔助:更強大等等了
1三、同步請求和異步請求什麼區別?
答:發送同步請求,程序將中止用戶交互,直至服務器返回數據完成,才能夠進行下一步操做,
異步請求不會阻塞主線程,而會創建一個新的線程來操做,用戶發出異步請求後,依然能夠對UI進行操做,程序能夠繼續運行。
1四、iOS中的多線程操做、多線程方式
答:iOS提供了方便的多線程調用機制:NSOperation和NSOperationQueue。它的使用方法也很簡單,
通常都是將NSOperation對象加入到NSOperationQueue隊列中,加入後隊列就開始處理,知道任務操做完成。
1五、UIViewController的生命週期
答:當一個視圖控制器被建立,並在屏幕上顯示的時候。 代碼的執行順序
// 視圖顯示在屏幕上的順序
一、 alloc 建立對象,分配空間。
二、init (initWithNibName) 初始化對象,初始化數據。
三、loadView 從nib載入視圖, 這一步不須要去幹涉。除非沒有使用xib文件建立視圖。
四、viewDidLoad 加載完畢,能夠進行自定義數據以及動態建立其餘控件。
五、viewWillAppear 視圖將出如今屏幕以前,立刻這個視圖即將顯示在屏幕上。
六、viewDidAppear 視圖已在屏幕上渲染完成。
// 視圖將被從屏幕上移除的順序
一、viewWillDisappear 視圖將被從屏幕上移除以前執行。
二、viewDidDisappear 視圖已經被從屏幕上移除。
三、dealloc 視圖被銷燬,此時須要在init和viewDidLoad中建立的對象進行釋放。
四、viewDidUnload 出現內存警告在內存不足時執行,並對全部非當前顯示的controller執行。
本視圖的全部子視圖將被銷燬,以釋放內存,此時開發者須要手動對viewLoad、viewDidLoad中建立的對象釋放內存。
由於當這個視圖再次顯示在屏幕上的時候,viewLoad、viewDidLoad 再次被調用,以便再次構造視圖。
1六、Autorerelease對象何時釋放?
答:autorelease實際上只是把對release的調用延遲了,對於每個Autorelease,系統只是把該Object放入了當前的Autorelease pool中,當該pool被釋放時,該pool中的全部Object會被調用Release。
1三、iOS數據持久化方式
答:四種:屬性列表、對象歸檔、SQLite3和Core Data
14.屬性readwrite,readonly,assign,retain,copy,nonatomic 各是什麼做用,在那種狀況下用?
答:readwrite 是可讀可寫特性;須要生成getter方法和setter方法時
readonly 是隻讀特性 只會生成getter方法 不會生成setter方法 ;不但願屬性在類外改變
assign 是賦值特性,setter方法將傳入參數賦值給實例變量;僅設置變量時;
retain 表示持有特性,setter方法將傳入參數先保留,再賦值,傳入參數的retaincount會+1;
copy 表示賦值特性,setter方法將傳入對象複製一份;須要徹底一份新的變量時。
nonatomic 非原子操做,決定編譯器生成的setter getter是不是原子操做,atomic表示多線程安全,通常使用nonatomic
15.常見的object-c的數據類型有那些, 和C的基本數據類型有什麼區別?如:NSInteger和int
答:object-c的數據類型有 NSString,NSNumber,NSArray,NSMutableArray,NSData等等,這些都是class,建立後即是對象,而C語言的基本數據類型int,只是必定字節的內存空間,用於存放數值;而object-c的NSNumber包含有父類NSObject的方法和 NSNumber本身的方法,能夠完成複雜的操做。
答:Profile-> Instruments ->Time Profiler
答:線程建立有三種方法:使用NSThread建立、使用 GCD的dispatch、使用子類化的NSOperation,而後將其加入NSOperationQueue;在主線程執行代碼,方法是 performSelectorOnMainThread,若是想延時執行代碼能夠用performSelector:onThread:withObject:waitUntilDone:
19.描述一下iOS SDK中如何實現MVC的開發模式
答:MVC是:模型--視圖--控制 開發模式,對於iOS SDK,全部的View都是視圖層的,它應該獨立於模型層,由視圖控制層來控制。全部的用戶數據都是模型層,它應該獨立於視圖。全部的ViewController都是控制層,由它負責控制視圖,訪問模型數據。
21. Object-C有私有方法嗎?私有變量呢?
答:objective-c – 類裏面的方法只有兩種, 靜態方法和實例方法,全部實例變量默認都是私有的,全部實例方法默認都是公有的。
22.淺拷貝和深拷貝區別是什麼
答:淺拷貝:只複製指向對象的指針,而不復制引用對象自己。
深拷貝:複製引用對象自己。
答: 當您向一個對象發送一個autorelease消息時,Cocoa就會將該對 象的一個引用放入到最新的自動釋放池。
它仍然是個正當的對象,所以自動釋放池定義的做用域內的其它對象能夠向它發送消息。當程序執行到做用域結束的位置時,
自動釋放池就會被釋放,池中的全部對象也就被釋放。
24.單件實例是什麼
答: Foundation 和 Application Kit 框架中的一些類只容許建立單件對象,即這些類在當前進程中的惟一實例。
舉例:NSFileManager 和NSWorkspace類在使用時都是基於進程進行單件對象的實例化。
當向這些類請求實例的時候,它們會向您傳遞單一實例的一個引用,若是該實例還不存在,則首先進行實例的分配 和初始化。
25.類別的做用?繼承和類別在實現中有何區別?
答:category 能夠在不獲悉,不改變原來代碼的狀況下往裏面添加新的方法,只能添加,不能刪除修改。
而且若是類別和原來類中的方法產生名稱衝突,則類別將覆蓋原來的方法,由於類別具備更高的優先級。 類別主要有3個做用:
(1)將類的實現分散到多個不一樣文件或多個不一樣框架中。
(2)建立對私有方法的前向引用。
(3)向對象添加非正式協議。
繼承能夠增長,修改或者刪除方法,而且能夠增長屬性。
26.類別和類擴展的區別。
答:category和extensions的不一樣在於 後者能夠添加屬性。另外後者添加的方法是必需要實現的。
extensions能夠認爲是一個私有的Category。
27.KVO and KVC?
// Grand Central Dispatch簡稱GCD技術
// Do any additional setup after loading the view.
// dispatch_queue_t newDispath = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// dispatch_async(newDispath, ^{
// [self downloadImage];
// });
// #defineDISPATCH_QUEUE_PRIORITY_HIGH 2
// #defineDISPATCH_QUEUE_PRIORITY_DEFAULT 0
// #defineDISPATCH_QUEUE_PRIORITY_LOW (-2)
// #defineDISPATCH_QUEUE_PRIORITY_BACKGROUNDINT16_MIN
/*dispatch queue分爲下面三種:
* Serial:又稱爲private dispatch queues,同時只執行一個任務。Serial queue一般用於同步訪問特定的資源或數據。當你建立多 個 Serial queue時,雖然它們各自是同步執行的,但Serial queue與Serial queue之間是併發執行的。
* Concurrent: 又稱爲global dispatch queue,能夠併發地執行多個任務,可是執行完成的順序是隨機的。
* Main dispatch queue它是全局可用的serial queue,它是在應用程序主線程上執行任務的
*/
// 通常GCD 能夠以下操做
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
// 耗時的操做
dispatch_async(dispatch_get_main_queue(), ^{
// 更新界面
});
});
[selfexampleDispatch];
/*
*系統給每個應用程序提供了三個concurrent dispatch queues。
*這三個併發調度隊列是全局的,它們只有優先級的不一樣。
*由於是全局的,咱們不須要去建立。咱們只須要經過使用函數dispath_get_global_queue去獲得隊列
*/
dispatch_queue_t globalQ =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
NSLog(@"global:%p",globalQ);
dispatch_queue_t mainQ =dispatch_get_main_queue();
NSLog(@"mainQ:%p",mainQ);
/*
*雖然dispatch queue是引用計數的對象,可是以上兩個都是全局的隊列,不用retain或release。
*/
/*
*dispatch_group_async能夠實現監聽一組任務是否完成,完成後獲得通知執行其餘的操做。
*這個方法頗有用,好比你執行三個下載任務,當三個任務都下載完成後你才通知界面說完成的了。
*/
timeInt = 0;
[NSTimerscheduledTimerWithTimeInterval:1
target:self
selector:@selector(checkingTime)
userInfo:nil
repeats:YES];
[selfexampleDispath_group];
/*dispatch_barrier_async的使用
*dispatch_barrier_async是在前面的任務執行結束後它才執行,並且它後面的任務等它執行完成以後纔會執行
*/
[selfexampleDispatch_barrier];
/*dispatch_apply
*執行某個代碼片斷N次。
*/
dispatch_apply(5, globalQ, ^(size_t index) {
// 執行5次
});