iOS面試必備-iOS基礎知識

近期爲準備找工做面試,在網絡上搜集了這些題,以備面試之用。html

插一條廣告:本人求職,2016級應屆畢業生,有開發經驗。可獨立開發,低薪求職。QQ:895193543java

 

1.簡述OC中內存管理機制.ios

答:內存管理機制:使用引用計數管理,分爲ARC和MRC,MRC須要程序員本身管理內存,ARC則不須要.可是並非 全部對象在ARC環境下均不須要管理內存,子線程和循環引用並非這樣.與retain配對使用的是release,retain表明引用計 數+1,release表明引用計數-1,當引用計數減爲0時,對象則被系統自動銷燬.與alloc配對使用的是dealloc,alloc表明爲對象開 闢內存空間,dealloc則表明銷燬對象的內存空間.c++

 

2.readwrite,readonly,assign,retain,copy,nonatomic,atomic,strong,weak的做用?程序員

答:讀寫屬性:readonly和readwrite;  語義屬性:assign/retain/copy;   原子性:nonatomic.web

    ①.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訪問器的語義,也就是說,這些屬性決定了以何種方式對數據成員賦值.objective-c

        assign,直接賦值,引用計數不改變,適用於基本數據類型.算法

        retain,淺拷貝,使用的是原來的內存空間,只能適用於Objective-C對象類型,而不能適用於Core Foundation對象(retain會增長對象的引用計數,而基本數據和Core Foundation對象都沒有引用計數).sql

        copy:對象的拷貝,新申請一塊內存空間,並把原始內容複製到那片空間.新對象的引用計數爲1,此屬性只對那些遵循了NSCopy協議的對象類型有效.

    ③.nonatomic,非原子性訪問,不加同步,是異步操做.默認爲atomic,原子操做,atomic是Objc使用的一種線程保護技術,基本上來 講,是防止在寫未完成的時候被另一個線程讀取,形成數據錯誤,而這種機制是消耗系統內存資源的,因此在移動端,都選擇nonatomic.

 

另:內存分爲5個區,分別是棧區,堆區,全局區,文字常量區,程序代碼區.

棧區:由編譯器自動分配釋放,不須要管理內存.

堆區:通常有程序員分配釋放.

全局區:存放全局變量和靜態變量.

文字常量區:存放常量字符串.

程序代碼區:存放二進制代碼.

 

 

3.類變量的@protected,@private,@public,@package,聲明各有什麼含義?

@protected 受保護的.本類,子類可見.

@private 私有的,類內可用

@public 公有的,類內,子類,外部都可用

@package 可見度在@protected和@public之間,這個類型最經常使用於框架類的實例變量.

 

4.線程是什麼?進程又是什麼?區別和聯繫.

進程:正在運行的程序,負責程序的內存分配.

線程:線程是進程中一個獨立執行的控制單元(路徑),一個進程至少包含一條線程,即主線程.

建立線程的目的:開闢一條新的執行路徑,運行指定的代碼,與主線程的代碼實現同時執行.

 

5.對多線程開發的理解,iOS中有幾種實現多線程的方式.

多線程的使用場景:防止卡頓,能夠同時完成多個任務,且不影響主線程,把耗時操做放在子線程中執行,可是會消耗內存.

實現多線程的方式:①.NSThread(內存須要本身管理.觸發),②.NSOperationQueue(再也不關注線程,當前可執行任務個數queue.maxConcurrentOperationCount)③.GCD

詳解三種實現多線程的方式:

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.怎麼實現一個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中添加控件,實現應用程序界面.

 

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;

 

+(id)leftModelWith{

    leftModel * model = [self alloc]init];

    return model;

}

 

23.寫一個遍歷構造器.

 

 

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

死循環

 

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是應用的窗口,繼承於UIView.

UIView繼承於UIResponder,是建立窗口中的一個視圖,能夠響應交互事件.一個程序只有一個主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.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   輕量級菊花

       AFNetworkin  方便網絡開發

       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 in background設置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.

 

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內部怎麼實現的?

①.iOS和 OSX 的核心是 XNU 內核, GCD是基於 XNU 內核實現的(是由蘋果電腦發展起來的操做系統內核).

②.GCD 的 API 所有在 libdispatch 庫中.

③.GCD 底層實現主要有 Dispatch Queue(管理 block)和 Dispatch Source(處理事件).

 

72.怎麼保證多人開發進行內存泄露檢查。

使用Analuze進行代碼的靜態分析,爲避免麻煩,多人開發儘可能使用ARC.

7三、非自動內存管理狀況下怎麼作單例模式。

建立一個單例對象的靜態實例,並初始化爲nil。

建立一個類的類工廠方法,當且僅當這個類的實例爲nil時生成一個類的實例。

實現NScopying協議,覆蓋allocWithZone:方法,確保用戶在直接分配對象時,不會產生另外一個對象。

覆蓋release、autorelease、retain、retainCount方法,確保單例的狀態。

 

7四、對於類方法(靜態方法)默認是autorelease的,全部類方法都會這樣嗎?

①、系統自帶的絕大數類方法返回的對象,都是通過autorelease.

 

7五、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

 

8二、不用第三變量,交換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(濾鏡處理)

可以調節圖片的各類屬性(對比度、色溫、色差等)

 

8六、NSNotification和KVO的區別和用法是什麼?何時應該使用通知,何時應該使用KVO,他們的實現有何區別?若是用protocol和delegate來實現相似的功能可能嗎?可能的話有何問題?不可能的話why?

通知比較靈活,一個通知能被多個對象接受,一個對象能夠接受多個通知。

代理不交規範,可是代碼較多(默認是一對一)

KVO性能很差(底層會產生新的類),只能監聽某個對象屬性的變化,不推薦使用。

 

8七、block內部的實現原理。

Objective-C是對C語言的擴展,block的實現是基於指針和函數指針。

 

8八、怎麼解決緩存池滿的問題?

iOS中不存在緩存池滿的狀況,一般在對象須要建立時才建立,好比UITableView中通常只會建立剛開始在屏幕中的cell,以後都是從緩存池裏取,不會再建立新對象。

 

8九、控制器View的生命週期及相關函數是什麼?你在開發中是如何使用的?

一、首先判斷控制器是否有視圖,若是沒有就調用loadView方法建立:經過storyBoard或者代碼。

二、隨後調用viewDidLoad,能夠進行下一步的初始化操做,只會被調用一次。

三、在視圖顯示以前調用viewWillAppear,該函數能夠屢次調用。

四、視圖viewDidAppear

五、在佈局變化先後,調用viewWill/DidLayoutSubViews處理相關信息。

 

90、有些圖片加載比較慢怎麼處理?你是怎麼優化程序的性能的?

①、圖片下載放在異步線程。

②、圖片下載過程使用佔位圖片。

③、若是圖片比較大,能夠使用多線程斷點下載。

 

91.App須要加載大量數據,給服務器發送請求,可是服務器卡住了怎麼辦?

設置請求超時,給用戶提示請求超時,根據用戶操做再次請求。

 

9二、SDWebImage具體如何實現?

其實就是沙盒緩存機制,主要由三塊組成:內存圖片緩存,內存操做緩存,磁盤沙盒緩存。

①、利用NSOperationQueue和NSOperation下載圖片,還使用了GCD(解析GIF圖片)。

②、利用URL做爲key,NSOperation做爲value.

③、利用URL做爲key,UIImage做爲value

 

9三、AFNetWorking實現原理。

基於NSURL.採用block的方法處理請求,直接返回的是json、XML數據。AFN直接操做對象是 AFHTTPClient,是一個實現了NSCoding和NSCopying協議的NSObject子類。AFGTTPClient是一個封裝了一系列 操做方法的工具類。AFN默認沒有封裝同步請求,若是開發者須要使用同步請求,須要重寫相關的方法 (getPath:parameters:failure),對AFHTTPRequestOperation進行同步處理。

 9四、上傳APP:http://www.bubuko.com/infodetail-648771.html

 

另外網上摘抄的:

1. Object-c的類能夠多重繼承麼?能夠實現多個接口麼?Category是什麼?重寫一個類的方式用繼承好仍是分類好?爲何?

答: Object-c的類不能夠多重繼承;能夠實現多個接口,經過實現多個接口能夠完成C++的多重繼承;Category是類別,通常狀況用分類好,用Category去重寫類的方法,僅對本Category有效,不會影響到其餘類與原有類的關係。

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 各是什麼做用,在那種狀況下用?

答:

1). readwrite 是可讀可寫特性;須要生成getter方法和setter方法時

2). readonly 是隻讀特性 只會生成getter方法 不會生成setter方法 ;不但願屬性在類外改變

3). assign 是賦值特性,setter方法將傳入參數賦值給實例變量;僅設置變量時;

4). retain 表示持有特性,setter方法將傳入參數先保留,再賦值,傳入參數的retaincount會+1;

5). copy 表示賦值特性,setter方法將傳入對象複製一份;須要徹底一份新的變量時。

6).nonatomic 非原子操做,決定編譯器生成的setter getter是不是原子操做,atomic表示多線程安全,通常使用nonatomic

4.寫一個setter方法用於完成@property (nonatomic,retain)NSString *name,寫一個setter方法用於完成@property(nonatomic,copy)NSString *name

答:

1
2
3
4
5
6
7
8
9
10
11
12
- (void) setName:(NSString*) str
{
[str retain];
[name release];
name = str;
}
- (void)setName:(NSString *)str
{
id t = [str copy];
[name release];
name = t;
}

5.對於語句NSString*obj = [[NSData alloc] init]; obj在編譯時和運行時分別時什麼類型的對象?

答: 編譯時是NSString的類型;運行時是NSData類型的對象

6.常見的object-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的對象;

8.Objective-C如何對內存管理的,說說你的見解和解決方法?

答:Objective-C的內存管理主要有三種方式ARC(自動內存計數)、手動內存計數、內存池。

1). (Garbage Collection)自動內存計數:這種方式和java相似,在你的程序的執行過程當中。始終有一個高人在背後準確地幫你收拾垃圾,你不用考慮它何時 開始工做,怎樣工做。你只須要明白,我申請了一段內存空間,當我再也不使用從而這段內存成爲垃圾的時候,我就完全的把它忘記掉,反正那個高人會幫我收拾垃 圾。遺憾的是,那個高人須要消耗必定的資源,在攜帶設備裏面,資源是緊俏商品因此iPhone不支持這個功能。因此「Garbage Collection」不是本入門指南的範圍,對「Garbage Collection」內部機制感興趣的同窗能夠參考一些其餘的資料,不過說老實話「Garbage Collection」不大適合適初學者研究。

解決: 經過alloc – initial方式建立的, 建立後引用計數+1, 此後每retain一次引用計數+1, 那麼在程序中作相應次數的release就行了.

2). (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延長對象的生存期.

3). (NSAutoRealeasePool)內存池:能夠經過建立和釋放內存池控制內存申請和回收的時機.

解決:是由autorelease加入系統內存池, 內存池是能夠嵌套的, 每一個內存池都須要有一個建立釋放對, 就像main函數中寫的同樣. 使用也很簡單, 好比[[[NSString alloc]initialWithFormat:@」Hey you!」] autorelease], 即將一個NSString對象加入到最內層的系統內存池, 當咱們釋放這個內存池時, 其中的對象都會被釋放.

9. 原子(atomic)跟非原子(non-atomic)屬性有什麼區別?

答:

1). atomic提供多線程安全。是防止在寫未完成的時候被另一個線程讀取,形成數據錯誤

2). non-atomic:在本身管理內存的環境中,解析的訪問器保留並自動釋放返回的值,若是指定了 nonatomic ,那麼訪問器只是簡單地返回這個值。

10. 看下面的程序,第一個NSLog會輸出什麼?這時str的retainCount是多少?第二個和第三個呢? 爲何?

1
2
3
4
5
6
7
8
9
10
11
NSMutableArray* ary = [[NSMutableArray array] retain];
NSString *str = [NSString stringWithFormat:@ "test" ];
[str retain];
[aryaddObject:str];
NSLog(@」%@%d」,str,[str retainCount]);
[str retain];
[str release];
[str release];
NSLog(@」%@%d」,str,[str retainCount]);
[aryremoveAllObjects];
NSLog(@」%@%d」,str,[str retainCount]);

str的retainCount建立+1,retain+1,加入數組自動+1 3

retain+1,release-1,release-1 2

數組刪除全部對象,全部數組內的對象自動-1 1

11. 內存管理的幾條原則時什麼?按照默認法則.那些關鍵字生成的對象須要手動釋放?在和property結合的時候怎樣有效的避免內存泄露?

答:誰申請,誰釋放

遵循Cocoa Touch的使用原則;

內存管理主要要避免「過早釋放」和「內存泄漏」,對於「過早釋放」須要注意@property設置特性時,必定要用對特性關鍵字,對於「內存泄漏」,必定要申請了要負責釋放,要細心。

關鍵字alloc 或new 生成的對象須要手動釋放;

設置正確的property屬性,對於retain須要在合適的地方釋放,

12.如何對iOS設備進行性能測試?

答: Profile-> Instruments ->Time Profiler

13. Object C中建立線程的方法是什麼?若是在主線程中執行代碼,方法是什麼?若是想延時執行代碼、方法又是什麼?

答:線程建立有三種方法:使用NSThread建立、使用GCD的dispatch、使用子類化的NSOperation,而後將其加入 NSOperationQueue;在主線程執行代碼,方法是performSelectorOnMainThread,若是想延時執行代碼能夠用 performSelector:onThread:withObject:waitUntilDone:

14. MVC設計模式是什麼? 你還熟悉什麼設計模式?

答:

設計模式:並非一種新技術,而是一種編碼經驗,使用好比java中的接口,iphone中的協議,繼承關係等基本手段,用比較成熟的邏輯去處理某一種類型的事情,總結爲所謂設計模式。面向對象編程中,java已經概括了23種設計模式。

mvc設計模式 :模型,視圖,控制器,能夠將整個應用程序在思想上分紅三大塊,對應是的數據的存儲或處理,前臺的顯示,業務邏輯的控制。 Iphone自己的設計思想就是遵循mvc設計模式。其不屬於23種設計模式範疇。

代理模式:代理模式給某一個對象提供一個代理對象,並由代理對象控制對源對象的引用.好比一個工廠生產了產品,並不想直接賣給用戶,而是搞了不少代 理商,用戶能夠直接找代理商買東西,代理商從工廠進貨.常見的如QQ的自動回覆就屬於代理攔截,代理模式在iphone中獲得普遍應用.

單例模式:說白了就是一個類不經過alloc方式建立對象,而是用一個靜態方法返回這個類的對象。系統只須要擁有一個的全局對象,這樣有利於咱們協 調系統總體的行爲,好比想得到[UIApplication sharedApplication];任何地方調用均可以獲得 UIApplication的對象,這個對象是全局惟一的。

觀察者模式: 當一個物體發生變化時,會通知全部觀察這個物體的觀察者讓其作出反應。實現起來無非就是把全部觀察者的對象給這個物體,當這個物體的發生改變,就會調用遍歷全部觀察者的對象調用觀察者的方法從而達到通知觀察者的目的。

工廠模式:

1
2
3
4
5
6
7
8
public class Factory{
public static Sample creator(int which){
if  (which==1)
return  new  SampleA();
else  if  (which==2)
return  new  SampleB();
}
}

15 淺複製和深複製的區別?

答:淺層複製:只複製指向對象的指針,而不復制引用對象自己。

深層複製:複製引用對象自己。

意思就是說我有個A對象,複製一份後獲得A_copy對象後,對於淺複製來講,A和A_copy指向的是同一個內存資源,複製的只不過是是一個指針,對象自己資源

仍是隻有一份,那若是咱們對A_copy執行了修改操做,那麼發現A引用的對象一樣被修改,這其實違背了咱們複製拷貝的一個思想。深複製就好理解了,內存中存在了

兩份獨立對象自己。

用網上一哥們通俗的話將就是:

淺複製比如你和你的影子,你完蛋,你的影子也完蛋

深複製比如你和你的克隆人,你完蛋,你的克隆人還活着。

16. 類別的做用?繼承和類別在實現中有何區別?

答:category 能夠在不獲悉,不改變原來代碼的狀況下往裏面添加新的方法,只能添加,不能刪除修改,而且若是類別和原來類中的方法產生名稱衝突,則類別將覆蓋原來的方法,由於類別具備更高的優先級。

類別主要有3個做用:

1).將類的實現分散到多個不一樣文件或多個不一樣框架中。

2).建立對私有方法的前向引用。

3).向對象添加非正式協議。

繼承能夠增長,修改或者刪除方法,而且能夠增長屬性。

17. 類別和類擴展的區別。

答:category和extensions的不一樣在於 後者能夠添加屬性。另外後者添加的方法是必需要實現的。

extensions能夠認爲是一個私有的Category。

18. oc中的協議和java中的接口概念有何不一樣?

答:OC中的代理有2層含義,官方定義爲 formal和informal protocol。前者和Java接口同樣。

informal protocol中的方法屬於設計模式考慮範疇,不是必須實現的,可是若是有實現,就會改變類的屬性。

其實關於正式協議,類別和非正式協議我很早前學習的時候大體看過,也寫在了學習教程裏

「非正式協議概念其實就是類別的另外一種表達方式「這裏有一些你可能但願實現的方法,你能夠使用他們更好的完成工做」。

這個意思是,這些是可選的。好比我門要一個更好的方法,咱們就會申明一個這樣的類別去實現。而後你在後期能夠直接使用這些更好的方法。

這麼看,總以爲類別這玩意兒有點像協議的可選協議。」

如今來看,其實protocal已經開始對二者都統一和規範起來操做,由於資料中說「非正式協議使用interface修飾「,

如今咱們看到協議中兩個修飾詞:「必須實現(@requied)」和「可選實現(@optional)」。

19. 什麼是KVO和KVC?

答:KVC:鍵 – 值編碼是一種間接訪問對象的屬性使用字符串來標識屬性,而不是經過調用存取方法,直接或經過實例變量訪問的機制。

不少狀況下能夠簡化程序代碼。apple文檔其實給了一個很好的例子。

KVO:鍵值觀察機制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。

具體用看到嗯哼用到過的一個地方是對於按鈕點擊變化狀態的的監控。

好比我自定義的一個button

1
2
3
4
5
6
7
8
[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查找的邏輯理解,就說的過去了。

20. 代理的做用?

答:代理的目的是改變或傳遞控制鏈。容許一個類在某些特定時刻通知到其餘類,而不須要獲取到那些類的指針。能夠減小框架複雜度。

另一點,代理能夠理解爲java中的回調監聽機制的一種相似。

21. oc中可修改和不能夠修改類型。

答:可修改不可修改的集合類。這個我我的簡單理解就是可動態添加修改和不可動態添加修改同樣。

好比NSArray和NSMutableArray。前者在初始化後的內存控件就是固定不可變的,後者能夠添加等,能夠動態申請新的內存空間。

22. 咱們說的oc是動態運行時語言是什麼意思?

答:多態。 主要是將數據類型的肯定由編譯時,推遲到了運行時。

這個問題其實淺涉及到兩個概念,運行時和多態。

簡單來講,運行時機制使咱們直到運行時纔去決定一個對象的類別,以及調用該類別對象指定方法。

多態:不一樣對象以本身的方式響應相同的消息的能力叫作多態。意思就是假設生物類(life)都用有一個相同的方法-eat;

那人類屬於生物,豬也屬於生物,都繼承了life後,實現各自的eat,可是調用是咱們只需調用各自的eat方法。

也就是不一樣的對象以本身的方式響應了相同的消息(響應了eat這個選擇器)。

所以也能夠說,運行時機制是多態的基礎?~~~

23. 通知和協議的不一樣之處?

答:協議有控制鏈(has-a)的關係,通知沒有。

首先我一開始也不太明白,什麼叫控制鏈(專業術語了~)。可是簡單分析下通知和代理的行爲模式,咱們大體能夠有本身的理解

簡單來講,通知的話,它能夠一對多,一條消息能夠發送給多個消息接受者。

代理按咱們的理解,到不是直接說不能一對多,好比咱們知道的明星經濟代理人,不少時候一個經濟人負責好幾個明星的事務。

只是對於不一樣明星間,代理的事物對象都是不同的,一一對應,不可能說明天要處理A明星要一個發佈會,代理人發出處理髮佈會的消息後,別稱B的

發佈會了。可是通知就不同,他只關心發出通知,而不關心多少接收到感興趣要處理。

所以控制鏈(has-a從英語單詞大體能夠看出,單一擁有和可控制的對應關係。

24. 什麼是推送消息?

答:推送通知更是一種技術。

簡單點就是客戶端獲取資源的一種手段。

普通狀況下,都是客戶端主動的pull。

推送則是服務器端主動push。 測試push的實現能夠查看該博文。

25. 關於多態性

答:多態,子類指針能夠賦值給父類。

這個題目其實能夠出到一切面向對象語言中,

所以關於多態,繼承和封裝基本最好都有個自我意識的理解,也並不是必定要把書上資料上寫的能背出來

26. 對於單例的理解

答:在objective-c中要實現一個單例類,至少須要作如下四個步驟:

1).爲單例對象實現一個靜態實例,並初始化,而後設置成nil,

2).實現一個實例構造方法檢查上面聲明的靜態實例是否爲nil,若是是則新建並返回一個本類的實例,

3).重寫allocWithZone方法,用來保證其餘人直接使用alloc和init試圖得到一個新實力的時候不產生一個新實例,

4).適當實現allocWitheZone,copyWithZone,release和autorelease。

27. 說說響應鏈

答: 事件響應鏈。包括點擊事件,畫面刷新事件等。在視圖棧內從上至下,或者從下之上傳播。

能夠說點事件的分發,傳遞以及處理。具體能夠去看下touch事件這塊。由於問的太抽象化了

嚴重懷疑題目出到越後面就越籠統。

能夠從責任鏈模式,來說經過事件響應鏈處理,其擁有的擴展性

28. frame和bounds有什麼不一樣?

答:frame指的是:該view在父view座標系統中的位置和大小。(參照點是父親的座標系統)

bounds指的是:該view在自己座標系統中 的位置和大小。(參照點是自己座標系統)

29. 方法和選擇器有何不一樣?

答:selector是一個方法的名字,method是一個組合體,包含了名字和實現.

詳情能夠看apple文檔。

30. OC的垃圾回收機制?

答: OC2.0有Garbage collection,可是iOS平臺不提供。

通常咱們瞭解的objective-c對於內存管理都是手動操做的,可是也有自動釋放池。

可是差了大部分資料,貌似不要和arc機制搞混就行了。

31. NSOperation queue?

答:存放NSOperation的集合類。

操做和操做隊列,基本能夠當作java中的線程和線程池的概念。用於處理ios多線程開發的問題。

網上部分資料提到一點是,雖然是queue,可是卻並非帶有隊列的概念,放入的操做並不是是按照嚴格的先進現出。

這邊又有個疑點是,對於隊列來講,先進先出的概念是Afunc添加進隊列,Bfunc緊跟着也進入隊列,Afunc先執行這個是必然的,

可是Bfunc是等Afunc徹底操做完之後,B纔開始啓動而且執行,所以隊列的概念離亂上有點違背了多線程處理這個概念。

可是轉念一想其實能夠參考銀行的取票和叫號系統。

所以對於A比B先排隊取票可是B率先執行完操做,咱們亦然能夠感性認爲這仍是一個隊列。

可是後來看到一票關於這操做隊列話題的文章,其中有一句提到

「由於兩個操做提交的時間間隔很近,線程池中的線程,誰先啓動是不定的。」

瞬間以爲這個queue名字有點忽悠人了,還不如pool~

綜合一點,咱們知道他能夠比較大的用處在於能夠幫組多線程編程就行了。

32. 什麼是延遲加載?

答:懶漢模式,只在用到的時候纔去初始化。

也能夠理解成延時加載。

我以爲最好也最簡單的一個列子就是tableView中圖片的加載顯示了。

一個延時載,避免內存太高,一個異步加載,避免線程堵塞。

33. 是否在一個視圖控制器中嵌入兩個tableview控制器?

答:一個視圖控制只提供了一個View視圖,理論上一個tableViewController也不能放吧,

只能說能夠嵌入一個tableview視圖。固然,題目自己也有歧義,若是不是咱們定性思惟認爲的UIViewController,而是宏觀的表 示視圖控制者,那咱們卻是能夠把其當作一個視圖控制者,它能夠控制多個視圖控制器,好比TabbarController那樣的感受。

34. 一個tableView是否能夠關聯兩個不一樣的數據源?你會怎麼處理?

答:首先咱們從代碼來看,數據源如何關聯上的,實際上是在數據源關聯的代理方法裏實現的。

所以咱們並不關心如何去關聯他,他怎麼關聯上,方法只是讓我返回根據本身的須要去設置如相關的數據源。

所以,我以爲能夠設置多個數據源啊,可是有個問題是,你這是想幹嗎呢?想讓列表如何顯示,不一樣的數據源分區塊顯示?

35. 何時使用NSMutableArray,何時使用NSArray?

答:當數組在程序運行時,須要不斷變化的,使用NSMutableArray,當數組在初始化後,便再也不改變的,使用NSArray。須要指出的 是,使用NSArray只代表的是該數組在運行時不發生改變,即不能往NSAarry的數組裏新增和刪除元素,但不代表其數組內的元素的內容不能發生改 變。NSArray是線程安全的,NSMutableArray不是線程安全的,多線程使用到NSMutableArray須要注意。

36. 給出委託方法的實例,而且說出UITableVIew的Data Source方法

答:CocoaTouch框架中用到了大量委託,其中UITableViewDelegate就是委託機制的典型應用,是一個典型的使用委託來實現 適配器模式,其中UITableViewDelegate協議是目標,tableview是適配器,實現UITableViewDelegate協議,並 將自身設置爲talbeview的delegate的對象,是被適配器,通常狀況下該對象是UITableViewController。

UITableVIew的Data Source方法有- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

37. 在應用中能夠建立多少autorelease對象,是否有限制?

答案:無

38. 若是咱們不建立內存池,是否有內存池提供給咱們?

答:界面線程維護着本身的內存池,用戶本身建立的數據線程,則須要建立該線程的內存池

39. 何時須要在程序中建立內存池?

答:用戶本身建立的數據線程,則須要建立該線程的內存池

40. 類NSObject的那些方法常常被使用?

答:NSObject是Objetive-C的基類,其由NSObject類及一系列協議構成。

其中類方法alloc、class、 description 對象方法init、dealloc、– performSelector:withObject:afterDelay:等常常被使用

41. 什麼是簡便構造方法?

答:簡便構造方法通常由CocoaTouch框架提供,如NSNumber的 + numberWithBool: + numberWithChar: + numberWithDouble: + numberWithFloat: + numberWithInt:

Foundation下大部分類均有簡便構造方法,咱們能夠經過簡便構造方法,得到系統給咱們建立好的對象,而且不須要手動釋放。

42. 如何使用Xcode設計通用應用?

答:使用MVC模式設計應用,其中Model層完成脫離界面,即在Model層,其是可運行在任何設備上,在controller層,根據 iPhone與iPad(獨有UISplitViewController)的不一樣特色選擇不一樣的viewController對象。在View層,可根 據現實要求,來設計,其中以xib文件設計時,其設置其爲universal。

43. UIView的動畫效果有那些?

答:有不少,如 UIViewAnimationOptionCurveEaseInOut UIViewAnimationOptionCurveEaseIn UIViewAnimationOptionCurveEaseOut UIViewAnimationOptionTransitionFlipFromLeft UIViewAnimationOptionTransitionFlipFromRight UIViewAnimationOptionTransitionCurlUpUIViewAnimationOptionTransitionCurlDown

44. 在iPhone應用中如何保存數據?

答:有如下幾種保存機制:

1).經過web服務,保存在服務器上

2).經過NSCoder固化機制,將對象保存在文件中

3).經過SQlite或CoreData保存在文件數據庫中

45. 什麼是coredata?

答:coredata是蘋果提供一套數據保存框架,其基於SQlite

46. 什麼是NSManagedObject模型?

答:NSManagedObject是NSObject的子類 ,也是coredata的重要組成部分,它是一個通用的類,實現了core data 模型層所需的基本功能,用戶可經過子類化NSManagedObject,創建本身的數據模型。

47. 什麼是NSManagedobjectContext?

答:NSManagedobjectContext對象負責應用和數據庫之間的交互。

48. 什麼是謂詞?

答:謂詞是經過NSPredicate,是經過給定的邏輯條件做爲約束條件,完成對數據的篩選。

1
2
predicate = [NSPredicate predicateWithFormat:@ "customerID == %d" ,n];
a = [customers filteredArrayUsingPredicate:predicate];

49. 和coredata一塊兒有哪幾種持久化存儲機制?

答:存入到文件、 存入到NSUserDefaults(系統plist文件中)、存入到Sqlite文件數據庫

50. 談談對Block 的理解?並寫出一個使用Block執行UIVew動畫?

答:Block是能夠獲取其餘函數局部變量的匿名函數,其不但方便開發,而且能夠大幅提升應用的執行效率(多核心CPU可直接處理Block指令)

1
2
3
4
5
[UIView transitionWithView:self.view
duration:0.2
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^{ [[blueViewController view] removeFromSuperview]; [[self view] insertSubview:yellowViewController.view atIndex:0]; }
completion:NULL];

51. 寫出上面代碼的Block的定義。

答:

1
2
typedef void(^animations) (void);
typedef void(^completion) (BOOL finished);

52. 試着使用+ beginAnimations:context:以及上述Block的定義,寫出一個能夠完成

1
+ (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(4_0);

操做的函數執行部分

答案:無

53. 作過的項目是否涉及網絡訪問功能,使用什麼對象完成網絡功能?

答:ASIHTTPRequest與NSURLConnection

54. 簡單介紹下NSURLConnection類及+ sendSynchronousRequest:returningResponse:error:與– initWithRequest:delegate:兩個方法的區別?

答: NSURLConnection主要用於網絡訪問,其中+ sendSynchronousRequest:returningResponse:error:是同步訪問數據,即當前線程會阻塞,並等待 request的返回的response,而– initWithRequest:delegate:使用的是異步加載,當其完成網絡訪問後,會經過delegate回到主線程,並其委託的對象。

55. 多線程是什麼

答: 多線程是個複雜的概念,按字面意思是同步完成多項任務,提升了資源的使用效率,從硬件、操做系統、應用軟件不一樣的角度去看,多線程被賦予不一樣的內涵,對於 硬件,如今市面上多數的CPU都是多核的,多核的CPU運算多線程更爲出色;從操做系統角度,是多任務,如今用的主流操做系統都是多任務的,能夠一邊聽 歌、一邊寫博客;對於應用來講,多線程可讓應用有更快的迴應,能夠在網絡下載時,同時響應用戶的觸摸操做。在iOS應用中,對多線程最初的理解,就是並 發,它的含義是原來先作燒水,再摘菜,再炒菜的工做,會變成燒水的同時去摘菜,最後去炒菜。

56. iOS 中的多線程

答: iOS中的多線程,是Cocoa框架下的多線程,經過Cocoa的封裝,可讓咱們更爲方便的使用線程,作過C++的同窗可能會對線程有更多的理解,好比 線程的創立,信號量、共享變量有認識,Cocoa框架下會方便不少,它對線程作了封裝,有些封裝,可讓咱們建立的對象,自己便擁有線程,也就是線程的對 象化抽象,從而減小咱們的工程,提供程序的健壯性。

GCD是(Grand Central Dispatch)的縮寫 ,從系統級別提供的一個易用地多線程類庫,具備運行時的特色,能充分利用多核心硬件。GCD的API接口爲C語言的函數,函數參數中多數有Block,關 於Block的使用參看這裏,爲咱們提供強大的「接口」,對於GCD的使用參見本文

NSOperation與Queue

NSOperation是一個抽象類,它封裝了線程的細節實現,咱們能夠經過子類化該對象,加上NSQueue來同面向對象的思惟,管理多線程程序。具體可參看這裏:一個基於NSOperation的多線程網絡訪問的項目。

NSThread

NSThread是一個控制線程執行的對象,它不如NSOperation抽象,經過它咱們能夠方便的獲得一個線程,並控制它。但NSThread的線程之間的併發控制,是須要咱們本身來控制的,能夠經過NSCondition實現。

參看 iOS多線程編程之NSThread的使用

其餘多線程

在Cocoa的框架下,通知、Timer和異步函數等都有使用多線程,(待補充).

57. 在項目何時選擇使用GCD,何時選擇NSOperation?

答: 項目中使用NSOperation的優勢是NSOperation是對線程的高度抽象,在項目中使用它,會使項目的程序結構更好,子類化 NSOperation的設計思路,是具備面向對象的優勢(複用、封裝),使得實現是多線程支持,而接口簡單,建議在複雜項目中使用。

項目中使用GCD的優勢是GCD自己很是簡單、易用,對於不復雜的多線程操做,會節省代碼量,而Block參數的使用,會是代碼更爲易讀,建議在簡單項目中使用。

58. 什麼是block

答: 對於閉包(block),有不少定義,其中閉包就是可以讀取其它函數內部變量的函數,這個定義即接近本質又較好理解。對於剛接觸Block的同窗,會以爲 有些繞,由於咱們習慣寫這樣的程序main(){ funA();} funA(){funB();} funB(){…..}; 就是函數main調用函數A,函數A調用函數B… 函數們依次順序執行,但現實中不全是這樣的,例如項目經理M,手下有3個程序員A、B、C,當他給程序員A安排實現功能F1時,他並不等着A完成以後,再 去安排B去實現F2,而是安排給A功能F1,B功能F2,C功能F3,而後可能去寫技術文檔,而當A遇到問題時,他會來找項目經理M,當B作完時,會通知 M,這就是一個異步執行的例子。在這種情形下,Block即可大顯身手,由於在項目經理M,給A安排工做時,同時會告訴A若果遇到困難,如何能找到他報告 問題(例如打他手機號),這就是項目經理M給A的一個回調接口,要回掉的操做,好比接到電話,百度查詢後,返回網頁內容給A,這就是一個Block,在M 交待工做時,已經定義好,而且取得了F1的任務號(局部變量),倒是在當A遇到問題時,才調用執行,跨函數在項目經理M查詢百度,得到結果後回調該 block。

59. block 實現原理

答: Objective-C是對C語言的擴展,block的實現是基於指針和函數指針。

從計算語言的發展,最先的goto,高級語言的指針,到面嚮對象語言的block,從機器的思惟,一步步接近人的思惟,以方便開發人員更爲高效、直接的描述出現實的邏輯(需求)。

使用實例

cocoaTouch框架下動畫效果的Block的調用

使用typed聲明block

1
2
typedef void(^didFinishBlock) (NSObject *ob);
這就聲明瞭一個didFinishBlock類型的block,

而後即可用

1
@property (nonatomic,copy) didFinishBlock finishBlock;

聲明一個blokc對象,注意對象屬性設置爲copy,接到block 參數時,便會自動複製一份。

__block是一種特殊類型,

使用該關鍵字聲明的局部變量,能夠被block所改變,而且其在原函數中的值會被改變。

60.關於block

答: 面試時,面試官會先問一些,是否瞭解block,是否使用過block,這些問題至關於開場白,每每是下面一系列問題的開始,因此必定要如實根據本身的狀況回答。

1). 使用block和使用delegate完成委託模式有什麼優勢?

首先要了解什麼是委託模式,委託模式在iOS中大量應用,其在設計模式中是適配器模式中的對象適配器,Objective-C中使用id類型指向一切對象,使委託模式更爲簡潔。瞭解委託模式的細節:

iOS設計模式—-委託模式

使用block實現委託模式,其優勢是回調的block代碼塊定義在委託對象函數內部,使代碼更爲緊湊;

適配對象再也不須要實現具體某個protocol,代碼更爲簡潔。

2). 多線程與block

GCD與Block

使用 dispatch_async 系列方法,能夠以指定的方式執行block

GCD編程實例

dispatch_async的完整定義

1
2
3
void dispatch_async(
dispatch_queue_t queue,
dispatch_block_t block);

功能:在指定的隊列裏提交一個異步執行的block,不阻塞當前線程

經過queue來控制block執行的線程。主線程執行前文定義的 finishBlock對象

1
dispatch_async(dispatch_get_main_queue(),^(void){finishBlock();});

62.談談Object-C的內存管理方式及過程?

答: 1).當你使用new,alloc和copy方法建立一個對象時,該對象的保留計數器值爲1.當你再也不使用該對象時,你要負責向該對象發送一條release或autorelease消息.這樣,該對象將在使用壽命結束時被銷燬.

2).當你經過任何其餘方法得到一個對象時,則假設該對象的保留計數器值爲1,並且已經被設置爲自動釋放,你不須要執行任何操做來確保該對象被清理.若是你打算在一段時間內擁有該對象,則須要保留它並確保在操做完成時釋放它.

3).若是你保留了某個對象,你須要(最終)釋放或自動釋放該對象.必須保持retain方法和release方法的使用次數相等.

63.Object-C有私有方法嗎?私有變量呢?

答: objective-c – 類裏面的方法只有兩種, 靜態方法和實例方法. 這彷佛就不是完整的面向對象了,按照OO的原則就是一個對象只暴露有用的東西. 若是沒有了私有方法的話, 對於一些小範圍的代碼重用就不那麼順手了. 在類裏面聲名一個私有方法

1
2
3
4
5
6
7
@interface Controller : NSObject { NSString *something; }
+ (void)thisIsAStaticMethod;
– (void)thisIsAnInstanceMethod;
@end
@interface Controller (private) -
(void)thisIsAPrivateMethod;
@end

@private能夠用來修飾私有變量

在Objective‐C中,全部實例變量默認都是私有的,全部實例方法默認都是公有的

64.Object-C有多繼承嗎?沒有的話用什麼代替?cocoa 中全部的類都是NSObject 的子類

答: 多繼承在這裏是用protocol 委託代理 來實現的

你不用去考慮繁瑣的多繼承 ,虛基類的概念.

ood的多態特性 在 obj-c 中經過委託來實現.

65.內存管理 Autorelease、retain、copy、assign的set方法和含義?

答: 1).你初始化(alloc/init)的對象,你須要釋放(release)它。例如:

NSMutableArray aArray = [[NSArray alloc] init]; 後,須要 [aArray release];

2).你retain或copy的,你須要釋放它。例如:

[aArray retain] 後,須要 [aArray release];

3).被傳遞(assign)的對象,你須要斟酌的retain和release。例如:

obj2 = [[obj1 someMethod] autorelease];

對象2接收對象1的一個自動釋放的值,或傳遞一個基本數據類型(NSInteger,NSString)時:你或但願將對象2進行retain,以防止它在被使用以前就被自動釋放掉。可是在retain後,必定要在適當的時候進行釋放。

關於索引計數(Reference Counting)的問題

retain值 = 索引計數(Reference Counting)

NSArray對象會retain(retain值加一)任何數組中的對象。當NSArray被卸載(dealloc)的時候,全部數組中的對象會 被 執行一次釋放(retain值減一)。不只僅是NSArray,任何收集類(Collection Classes)都執行相似操做。例如 NSDictionary,甚至UINavigationController。

Alloc/init創建的對象,索引計數爲1。無需將其再次retain。

[NSArray array]和[NSDate date]等「方法」創建一個索引計數爲1的對象,可是也是一個自動釋放對象。因此是本地臨時對象,那麼無所謂了。若是是打算在全Class中使用的變量(iVar),則必須retain它。

缺省的類方法返回值都被執行了「自動釋放」方法。(*如上中的NSArray)

在類中的卸載方法「dealloc」中,release全部未被平衡的NS對象。(*全部未被autorelease,而retain值爲1的)

66. C和obj-c 如何混用

答: 1).obj-c的編譯器處理後綴爲m的文件時,能夠識別obj-c和c的代碼,處理mm文件能夠識別obj-c,c,c++代碼,但cpp文件必須只能用c/c++代碼,並且cpp文件include的頭文件中,也不能出現obj-c的代碼,由於cpp只是cpp

2).在mm文件中混用cpp直接使用便可,因此obj-c混cpp不是問題

3).在cpp中混用obj-c其實就是使用obj-c編寫的模塊是咱們想要的。

若是模塊以類實現,那麼要按照cpp class的標準寫類的定義,頭文件中不能出現obj-c的東西,包括#import cocoa的。實現文件中,即類的實現代碼中能夠使用obj-c的東西,能夠import,只是後綴是mm。

若是模塊以函數實現,那麼頭文件要按c的格式聲明函數,實現文件中,c++函數內部能夠用obj-c,但後綴仍是mm或m。

總結:只要cpp文件和cpp include的文件中不包含obj-c的東西就能夠用了,cpp混用obj-c的關鍵是使用接口,而不能直接使用 實現代 碼,實際上cpp混用的是obj-c編譯後的o文件,這個東西實際上是無差異的,因此能夠用。obj-c的編譯器支持cpp

67. Objective-C堆和棧的區別?

答: 管理方式:對於棧來說,是由編譯器自動管理,無需咱們手工控制;對於堆來講,釋放工做由程序員控制,容易產生memory leak。

申請大小:

棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在 WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就肯定的常數),若是申請的空間超過棧的剩餘空間時,將提示overflow。因 此,能從棧得到的空間較小。

堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是因爲系統是用鏈表來存儲的空閒內存地址的,天然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。因而可知,堆得到的空間比較靈活,也比較大。

碎片問題:對於堆來說,頻繁的new/delete勢必會形成內存空間的不連續,從而形成大量的碎片,使程序效率下降。對於棧來說,則不會存在這個問題,由於棧是先進後出的隊列,他們是如此的一一對應,以致於永遠都不可能有一個內存塊從棧中間彈出

分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,好比局部變量的分配。動態分配由alloca函數進行分配,可是棧的動態分配和堆是不一樣的,他的動態分配是由編譯器進行釋放,無需咱們手工實現。

分配效率:棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函數庫提供的,它的機制是很複雜的。

68. ViewController的didReceiveMemoryWarning怎麼被調用:

答:[supper didReceiveMemoryWarning];

69.何時用delegate,何時用Notification?

答: delegate針對one-to-one關係,用於sender接受到reciever的某個功能反饋值。

notification針對one-to-one/many/none,reciver,用於通知多個object某個事件。

70.用預處理指令#define聲明一個常數,用以代表1年中有多少秒(忽略閏年問題)

答:

#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

我在這想看到幾件事情:

#define 語法的基本知識(例如:不能以分號結束,括號的使用,等等)

懂得預處理器將爲你計算常數表達式的值,所以,直接寫出你是如何計算一年中有多少秒而不是計算出實際的值,是更清晰而沒有代價的。

意識到這個表達式將使一個16位機的整型數溢出-所以要用到長整型符號L,告訴編譯器這個常數是的長整型數。

若是你在你的表達式中用到UL(表示無符號長整型),那麼你有了一個好的起點。記住,第一印象很重要。

71.寫一個」標準"宏MIN ,這個宏輸入兩個參數並返回較小的一個。

答:

1
#define MIN(A,B) ((A) <= (B) ? (A) : (B))

這個測試是爲下面的目的而設的:

標識#define在宏中應用的基本知識。這是很重要的,由於直到嵌入(inline)操做符變爲標準C的一部分,宏是方便產生嵌入代碼的惟一方

法,

對於嵌入式系統來講,爲了能達到要求的性能,嵌入代碼常常是必須的方法。

三重條件操做符的知識。這個操做符存在C語言中的緣由是它使得編譯器能產生比 if-then-else 更優化的代碼,瞭解這個用法是很重要的。

懂得在宏中當心地把參數用括號括起來

我也用這個問題開始討論宏的反作用,例如:當你寫下面的代碼時會發生什麼事?

1
least = MIN(*p++, b);

結果是:

1
((*p++) <= (b) ? (*p++) : (*p++))

這個表達式會產生反作用,指針p會做三次++自增操做。

72.關鍵字const有什麼含意?修飾類呢?static的做用,用於類呢?還有extern c的做用

答:

const 意味着"只讀",下面的聲明都是什麼意思?

1
2
3
4
5
const int a;
int const a;
const int *a;
int * const a;
int const * a const;

前兩個的做用是同樣,a是一個常整型數。

第三個意味着a是一個指向常整型數的指針(也就是,整型數是不可修改的,但指針能夠)。

第四個意思a是一個指向整型數的常指針(也就是說,指針指向的整型數是能夠修改的,但指針是不可修改的)。

最後一個意味着a是一個指向常整型數的常指針(也就是說,指針指向的整型數是不可修改的,同時指針也是不可修改的)。

結論:

關鍵字const的做用是爲給讀你代碼的人傳達很是有用的信息,實際上,聲明一個參數爲常量是爲了告訴了用戶這個參數的應用目的。

若是你曾花不少時間清理其它人留下的垃圾,你就會很快學會感謝這點多餘的信息。(固然,懂得用const的程序員不多會留下的垃圾讓別人來清理的)  經過給優化器一些附加的信息,使用關鍵字const也許能產生更緊湊的代碼。合理地使用關鍵字const能夠使編譯器很天然地保護那些不但願被改變的參 數,防止其被無心的代碼修改。簡而言之,這樣能夠減小bug的出現。

1).欲阻止一個變量被改變,能夠使用 const 關鍵字。在定義該 const 變量時,一般須要對它進行初

始化,由於之後就沒有機會再去改變它了;

2).對指針來講,能夠指定指針自己爲 const,也能夠指定指針所指的數據爲 const,或兩者同時指

定爲 const;

3).在一個函數聲明中,const 能夠修飾形參,代表它是一個輸入參數,在函數內部不能改變其值;

4).對於類的成員函數,若指定其爲 const 類型,則代表其是一個常函數,不能修改類的成員變量;

5).對於類的成員函數,有時候必須指定其返回值爲 const 類型,以使得其返回值不爲「左值」。

73. 關鍵字volatile有什麼含意?並給出三個不一樣的例子。

答:一個定義爲 volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精確地說就是,優化器在用到這個變量時必須每次都當心地從新讀取這個變量的值,而不是使用保存在寄存器裏的備份。

下面是volatile變量的幾個例子:

並行設備的硬件寄存器(如:狀態寄存器)

一箇中斷服務子程序中會訪問到的非自動變量(Non-automatic variables)

多線程應用中被幾個任務共享的變量

74. 一個參數既能夠是const還能夠是volatile嗎? 一個指針能夠是volatile 嗎?解釋爲何。

答:1).是的。一個例子是隻讀的狀態寄存器。它是volatile由於它可能被意想不到地改變。它是const由於程序不該該試圖去修改它。

2).是的。儘管這並不很常見。一個例子是當一箇中服務子程序修該一個指向一個buffer的指針時。

75 . static 關鍵字的做用:

答:

1).函數體內 static 變量的做用範圍爲該函數體,不一樣於 auto 變量,該變量的內存只被分配一次,

所以其值在下次調用時仍維持上次的值;

2).在模塊內的 static 全局變量能夠被模塊內所用函數訪問,但不能被模塊外其它函數訪問;

3).在模塊內的 static 函數只可被這一模塊內的其它函數調用,這個函數的使用範圍被限制在聲明

它的模塊內;

4).在類中的 static 成員變量屬於整個類所擁有,對類的全部對象只有一份拷貝;

5).在類中的 static 成員函數屬於整個類所擁有,這個函數不接收 this 指針,於是只能訪問類的static 成員變量。

76. 線程與進程的區別和聯繫?

答:

1). 進程和線程都是由操做系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的併發性

2). 進程和線程的主要差異在於它們是不一樣的操做系統資源管理方式。

3). 進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不一樣執行路徑。

4.)線程有本身的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉。因此多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。

5). 但對於一些要求同時進行而且又要共享某些變量的併發操做,只能用線程,不能用進程。

77. 列舉幾種進程的同步機制,並比較其優缺點。

答: 原子操做  信號量機制    自旋鎖    管程,會合,分佈式系統

78. 進程之間通訊的途徑

答:共享存儲系統消息傳遞系統管道:以文件系統爲基礎

79. 進程死鎖的緣由

答:資源競爭及進程推動順序非法

80. 死鎖的4個必要條件

答:互斥、請求保持、不可剝奪、環路

81. 死鎖的處理

答:鴕鳥策略、預防策略、避免策略、檢測與解除死鎖

82. cocoa touch框架

答:iPhone OS 應用程序的基礎 Cocoa Touch 框架重用了許多 Mac 系統的成熟模式,可是它更多地專一於觸摸的接口和優化。

UIKit 爲您提供了在 iPhone OS 上實現圖形,事件驅動程序的基本工具,其創建在和 Mac OS X 中同樣的 Foundation 框架上,包括文件處理,網絡,字符串操做等。

Cocoa Touch 具備和 iPhone 用戶接口一致的特殊設計。有了 UIKit,您能夠使用 iPhone OS 上的獨特的圖形接口控件,按鈕,以及全屏視圖的功能,您還能夠使用加速儀和多點觸摸手勢來控制您的應用。

各色俱全的框架 除了UIKit 外,Cocoa Touch 包含了建立世界一流 iPhone 應用程序須要的全部框架,從三維圖形,到專業音效,甚至提供設備訪問 API 以控制攝像頭,或經過 GPS 獲知當前位置。

Cocoa Touch 既包含只須要幾行代碼就能夠完成所有任務的強大的 Objective-C 框架,也在須要時提供基礎的 C 語言 API 來直接訪問系統。這些框架包括:

Core Animation:經過 Core Animation,您就能夠經過一個基於組合獨立圖層的簡單的編程模型來建立豐富的用戶體驗。

Core Audio:Core Audio 是播放,處理和錄製音頻的專業技術,可以輕鬆爲您的應用程序添增強大的音頻功能。

Core Data:提供了一個面向對象的數據管理解決方案,它易於使用和理解,甚至可處理任何應用或大或小的數據模型。

功能列表:框架分類

下面是 Cocoa Touch 中一小部分可用的框架:

音頻和視頻:Core Audio ,OpenAL ,Media Library ,AV Foundation

數據管理 :Core Data ,SQLite

圖形和動畫 :Core Animation ,OpenGL ES ,Quartz 2D

網絡:Bonjour ,WebKit ,BSD Sockets

用戶應用:Address Book ,Core Location ,Map Kit ,Store Kit

83. 自動釋放池是什麼,如何工做

答:當您向一個對象發送一個autorelease消息時,Cocoa就會將該對象的一個引用放入到最新的自動釋放.它仍然是個正當的對象,所以自 動釋放池定義的做用域內的其它對象能夠向它發送消息。當程序執行到做用域結束的位置時,自動釋放池就會被釋放,池中的全部對象也就被釋放。

84. Objective-C的優缺點。

答:objc優勢:

1).  Cateogies

2).  Posing

3). 動態識別

4).指標計算

5).彈性訊息傳遞

6).不是一個過分複雜的 C 衍生語言

7).Objective-C 與 C++ 可混合編程

objc缺點:

1).不支援命名空間

2).不支持運算符重載

3).不支持多重繼承

4).使用動態運行時類型,全部的方法都是函數調用,因此不少編譯時優化方法都用不到。(如內聯函數等),性能低劣。

85. sprintf,strcpy,memcpy使用上有什麼要注意的地方。

答:

1). sprintf是格式化函數。將一段數據經過特定的格式,格式化到一個字符串緩衝區中去。sprintf格式化的函數的長度不可控,有可能格式化後的字符串會超出緩衝區的大小,形成溢出。

2).strcpy是一個字符串拷貝的函數,它的函數原型爲strcpy(char *dst, const char *src

將src開始的一段字符串拷貝到dst開始的內存中去,結束的標誌符號爲 ‘\0',因爲拷貝的長度不是由咱們本身控制的,因此這個字符串拷貝很容易出錯。

3). memcpy是具有字符串拷貝功能的函數,這是一個內存拷貝函數,它的函數原型爲memcpy(char *dst, const char* src, unsigned int len);將長度爲len的一段內存,從src拷貝到dst中去,這個函數的長度可控。可是會有內存疊加的問題。

86. readwrite,readonly,assign,retain,copy,nonatomic 屬性的做用

答:@property是一個屬性訪問聲明,擴號內支持如下幾個屬性:

1).getter=getterName,setter=setterName,設置setter與 getter的方法名

2).readwrite,readonly,設置可供訪問級別

2).assign,setter方法直接賦值,不進行任何retain操做,爲了解決原類型與環循引用問題

3).retain,setter方法對參數進行release舊值再retain新值,全部實現都是這個順序(CC上有相關資料)

4).copy,setter方法進行Copy操做,與retain處理流程同樣,先舊值release,再 Copy出新的對象,retainCount爲1。這是爲了減小對上下文的依賴而引入的機制。

5).nonatomic,非原子性訪問,不加同步,多線程併發訪問會提升性能。注意,若是不加此屬性,則默認是兩個訪問方法都爲原子型事務訪問。鎖被加到所屬對象實例級。

87. http和scoket通訊的區別。

答: http是客戶端用http協議進行請求,發送請求時候須要封裝http請求頭,並綁定請求的數據,服務器通常有web服務器配合(固然也非絕對)。 http請求方式爲客戶端主動發起請求,服務器才能給響應,一次請求完畢後則斷開鏈接,以節省資源。服務器不能主動給客戶端響應(除非採起http長鏈接 技術)。iphone主要使用類是NSUrlConnection。

scoket是客戶端跟服務器直接使用socket「套接字」進行鏈接,並無規定鏈接後斷開,因此客戶端和服務器能夠保持鏈接通道,雙方 均可以主動發送數據。通常在遊戲開發或股票開發這種要求即時性很強而且保持發送數據量比較大的場合使用。主要使用類是CFSocketRef。

88. TCP和UDP的區別

答: TCP全稱是Transmission Control Protocol,中文名爲傳輸控制協議,它能夠提供可靠的、面向鏈接的網絡數據傳遞服務。傳輸控制協議主要包含下列任務和功能:

* 確保IP數據報的成功傳遞。

* 對程序發送的大塊數據進行分段和重組。

* 確保正確排序及按順序傳遞分段的數據。

* 經過計算校驗和,進行傳輸數據的完整性檢查。

TCP提供的是面向鏈接的、可靠的數據流傳輸,而UDP提供的是非面向鏈接的、不可靠的數據流傳輸。

簡單的說,TCP注重數據安全,而UDP數據傳輸快點,但安全性通常

89. 你瞭解svn,cvs等版本控制工具麼?

答: 版本控制 svn,cvs 是兩種版控制的器,須要配套相關的svn,cvs服務器。

scm是xcode裏配置版本控制的地方。版本控制的原理就是a和b同時開發一個項目,a寫完當天的代碼以後把代碼提交給服務器,b要作的時候先從 服務器獲得最新版本,就能夠接着作。 若是a和b都要提交給服務器,而且同時修改了同一個方法,就會產生代碼衝突,若是a先提交,那麼b提交時,服務器能夠提示衝突的代碼,b能夠清晰的看到, 並作出相應的修改或融合後再提交到服務器。

90. 什麼是push。

答: 客戶端程序留下後門端口,客戶端老是監聽針對這個後門的請求,因而 服務器能夠主動像這個端口推送消息。

91. 靜態連接庫

答:此爲.a文件,至關於java裏的jar包,把一些類編譯到一個包中,在不一樣的工程中若是導入此文件就能夠使用裏面的類,具體使用依然是#import 「 xx.h」。

92. fmmpeg框架

答: 音視頻編解碼框架,內部使用UDP協議針對流媒體開發,內部開闢了六個端口來接受流媒體數據,完成快速接受之目的。

93. fmdb框架

答:數據庫框架,對sqllite的數據操做進行了封裝,使用着可把精力都放在sql語句上面。

94. 320框架

答: ui框架,導入320工程做爲框架包如同添加一個普通框架同樣。cover(open)  flower框架 (2d 仿射技術),內部核心類是CATransform3D.

94. 什麼是沙盒模型?哪些操做是屬於私有api範疇?

答:某個iphone工程進行文件操做有此工程對應的指定的位置,不能逾越。

iphone沙箱模型的有四個文件夾documents,tmp,app,Library,永久數據存儲通常放documents文件夾,獲得模擬器的路徑的可以使用NSHomeDirectory()方法。Nsuserdefaults保存的文件在tmp文件夾裏。

95. 在一個對象的方法裏面:self.name= 「object」;和 name =」object」 有什麼不一樣嗎?

答:self.name =」object」:會調用對象的setName()方法;

name = 「object」:會直接把object賦值給當前對象的name屬性。

96. 請簡要說明viewDidLoad和viewDidUnload什麼時候調用

答:viewDidLoad在view從nib文件初始化時調用,loadView在controller的view爲nil時調用。此方法在編程 實現view時調用,view控制器默認會註冊memory warning notification,當view controller的任何view沒有用的時候,viewDidUnload會被調用,在這裏實現將retain的view release,若是是retain的IBOutlet view 屬性則不要在這裏release,IBOutlet會負責release 。

97. 簡述內存分區狀況

答:

1).代碼區:存放函數二進制代碼

2).數據區:系統運行時申請內存並初始化,系統退出時由系統釋放。存放全局變量、靜態變量、常量

3).堆區:經過malloc等函數或new等操做符動態申請獲得,需程序員手動申請和釋放

4).棧區:函數模塊內申請,函數結束時由系統自動釋放。存放局部變量、函數參數

98. 隊列和棧有什麼區別:

答:隊列和棧是兩種不一樣的數據容器。從」數據結構」的角度看,它們都是線性結構,即數據元素之間的關係相同。

隊列是一種先進先出的數據結構,它在兩端進行操做,一端進行入隊列操做,一端進行出列隊操做。

棧是一種先進後出的數據結構,它只能在棧頂進行操做,入棧和出棧都在棧頂操做。

99. HTTP協議中,POST和GET的區別是什麼?

答:

1).GET 方法

GET 方法提交數據不安全,數據置於請求行,客戶端地址欄可見;

GET 方法提交的數據大小有限

GET 方法不能夠設置書籤

2).POST 方法

POST 方法提交數據安全,數據置於消息主體內,客戶端不可見

POST 方法提交的數據大小沒有限制

POST 方法能夠設置書籤

100.  iOS的系統架構

答: iOS的系統架構分爲( 核心操做系統層 theCore OS layer )、( 核心服務層theCore Services layer )、( 媒體層 theMedia layer )和( Cocoa 界面服務層 the Cocoa Touch layer )四個層次。

101.  控件主要響應3種事件

答:1). 基於觸摸的事件 ;  2). 基於值的事件 ;  3).基於編輯的事件。

102.  xib文件的構成分爲哪3個圖標?都具備什麼功能。

答: File’s Owner 是全部 nib 文件中的每一個圖標,它表示從磁盤加載 nib 文件的對象;

First Responder 就是用戶當前正在與之交互的對象;

View 顯示用戶界面;完成用戶交互;是 UIView 類或其子類。

103.  簡述視圖控件器的生命週期。

答: loadView 儘管不直接調用該方法,如多手動建立本身的視圖,那麼應該覆蓋這個方法並將它們賦值給試圖控制器的 view 屬性。

viewDidLoad 只有在視圖控制器將其視圖載入到內存以後才調用該方法,這是執行任何其餘初始化操做的入口。

viewDidUnload 當試圖控制器從內存釋放本身的方法的時候調用,用於清楚那些可能已經在試圖控制器中建立的對象。

viewVillAppear 當試圖將要添加到窗口中而且還不可見的時候或者上層視圖移出圖層後本視圖變成頂級視圖時調用該方法,用於執行諸如改變視圖方向等的操做。實現該方法時確保調用 [super viewWillAppear:

viewDidAppear 當視圖添加到窗口中之後或者上層視圖移出圖層後本視圖變成頂級視圖時調用,用於放置那些須要在視圖顯示後執行的代碼。確保調用 [super viewDidAppear:] 。

104.  動畫有基本類型有哪幾種;表視圖有哪幾種基本樣式。

答:動畫有兩種基本類型:隱式動畫和顯式動畫。

105.  實現簡單的表格顯示須要設置UITableView的什麼屬性、實現什麼協議?

答:實現簡單的表格顯示須要設置 UITableView 的 dataSource 和 delegate 屬性,實現UITableViewDataSource 和 UITableViewDelegate 協議。

106.  Cocoa Touch提供了哪幾種Core Animation過渡類型?

答: Cocoa Touch 提供了 4 種 Core Animation 過渡類型,分別爲:交叉淡化、推擠、顯示和覆蓋。

107.  UIView與CLayer有什麼區別?

答:

1).UIView 是 iOS 系統中界面元素的基礎,全部的界面元素都是繼承自它。它自己徹底是由 CoreAnimation 來實現的。它真正的繪圖部分,是由一個 CALayer 類來管理。 UIView 自己更像是一個 CALayer 的管理器,訪問它的跟繪圖和跟座標有關的屬性。

2).UIView 有個重要屬性 layer ,能夠返回它的主 CALayer 實例。

3).UIView 的 CALayer 相似 UIView 的子 View 樹形結構,也能夠向它的 layer 上添加子layer ,來完成某些特殊的表示。即 CALayer 層是能夠嵌套的。

4).UIView 的 layer 樹形在系統內部,被維護着三份 copy 。分別是邏輯樹,這裏是代碼能夠操縱的;動畫樹,是一箇中間層,系統就在這一層上更改屬性,進行各類渲染操做;顯示樹,其內容就是當前正被顯示在屏幕上得內容。

5).動畫的運做:對 UIView 的 subLayer (非主 Layer )屬性進行更改,系統將自動進行動畫生成,動畫持續時間的缺省值彷佛是 0.5 秒。

6).座標系統: CALayer 的座標系統比 UIView 多了一個 anchorPoint 屬性,使用CGPoint 結構表示,值域是 0~1 ,是個比例值。這個點是各類圖形變換的座標原點,同時會更改 layer 的 position 的位置,它的缺省值是 {0.5,0.5} ,即在 layer 的中央。

7).渲染:當更新層,改變不能當即顯示在屏幕上。當全部的層都準備好時,能夠調用setNeedsDisplay 方法來重繪顯示。

8).變換:要在一個層中添加一個 3D 或仿射變換,能夠分別設置層的 transform 或affineTransform 屬性。

9).變形: Quartz Core 的渲染能力,使二維圖像能夠被自由操縱,就好像是三維的。圖像能夠在一個三維座標系中以任意角度被旋轉,縮放和傾斜。 CATransform3D 的一套方法提供了一些魔術般的變換效果。

108. Quatrz 2D的繪圖功能的三個核心概念是什麼並簡述其做用。

答:上下文:主要用於描述圖形寫入哪裏;

路徑:是在圖層上繪製的內容;

狀態:用於保存配置變換的值、填充和輪廓, alpha 值等。

109.  iPhone OS主要提供了幾種播放音頻的方法?

答: SystemSound Services

AVAudioPlayer 類

Audio Queue Services

OpenAL

110.  使用AVAudioPlayer類調用哪一個框架、使用步驟?

答: AVFoundation.framework

步驟:配置 AVAudioPlayer 對象;

實現 AVAudioPlayer 類的委託方法;

控制 AVAudioPlayer 類的對象;

監控音量水平;

回放進度和拖拽播放。

111.  有哪幾種手勢通知方法、寫清楚方法名?

答:

-(void)touchesBegan:(NSSet*)touchedwithEvent:(UIEvent*)event;

-(void)touchesMoved:(NSSet*)touched withEvent:(UIEvent*)event;

-(void)touchesEnded:(NSSet*)touchedwithEvent:(UIEvent*)event;

-(void)touchesCanceled:(NSSet*)touchedwithEvent:(UIEvent*)event;

112.  CFSocket使用有哪幾個步驟。

答:建立 Socket 的上下文;建立 Socket ;配置要訪問的服務器信息;封裝服務器信息;鏈接服務器;

113.  Core Foundation中提供了哪幾種操做Socket的方法?

答: CFNetwork 、 CFSocket 和 BSD Socket 。

114.  解析XML文件有哪幾種方式?

答:以 DOM 方式解析 XML 文件;以 SAX 方式解析 XML 文件;

115. ios 平臺怎麼作數據的持久化?coredata 和sqlite有無必然聯繫?coredata是一個關係型數據庫嗎?

答:iOS 中能夠有四種持久化數據的方式:屬性列表(plist)、對象歸檔、 SQLite3 和 Core Data; core data 能夠使你以圖形界面的方式快速的定義 app 的數據模型,同時在你的代碼中容易獲取到它。 coredata 提供了基礎結構去處理經常使用的功能,例如保存,恢復,撤銷和重作,容許你在 app 中繼續建立新的任務。在使用 core data 的時候,你不用安裝額外的數據庫系統,由於 core data 使用內置的 sqlite 數據庫。 core data 將你 app 的模型層放入到一組定義在內存中的數據對象。 coredata 會追蹤這些對象的改變,同時能夠根據須要作相反的改變,例如用戶執行撤銷命令。當 core data 在對你 app 數據的改變進行保存的時候, core data 會把這些數據歸檔,並永久性保存。 mac os x 中sqlite 庫,它是一個輕量級功能強大的關係數據引擎,也很容易嵌入到應用程序。能夠在多個平臺使用, sqlite 是一個輕量級的嵌入式 sql 數據庫編程。與 core data 框架不一樣的是, sqlite 是使用程序式的, sql 的主要的 API 來直接操做數據表。 Core Data 不是一個關係型數據庫,也不是關係型數據庫管理系統 (RDBMS) 。雖然 Core Dta 支持SQLite 做爲一種存儲類型,但它不能使用任意的 SQLite 數據庫。 Core Data 在使用的過程種本身建立這個數據庫。 Core Data 支持對1、對多的關係。

116.  tableView 的重用機制?

答:UITableView 經過重用單元格來達到節省內存的目的: 經過爲每一個單元格指定一個重用標識符(reuseIdentifier),即指定了單元格的種類,以及當單元格滾出屏幕時,容許恢復單元格以便重用.對於 不一樣種類的單元格使用不一樣的ID,對於簡單的表格,一個標識符就夠了.

相關文章
相關標籤/搜索