iOS面試題


 

1.簡述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.

 

另:內存分為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;

 

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

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、AFNetWorking實現原理。

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

 94、上傳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 支持對一、對多的關系。

116.  tableView 的重用機制?

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

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM