iOS面試題,重要知識點整理

寫在前面的話

為了找工作,找實習的同學一定在網(wǎng)上找了很多關于iOS的面試題,大部分的題都是千篇一律,或者就是沒有答案。今天將自己總結數(shù)月的面試筆試題、知識點拿出來和大家分享,錯誤和遺漏之處還請多多指教。

1.NSObject中description屬性的意義,它可以重寫嗎?
  • 在NSLog中通過%@的形式打印對象的時候就會調用對象的description函數(shù),所以通過重寫 description 函數(shù)可以很好輸出的制定特殊的格式。
//通過重寫person的description方法,在打印的時候就能輸出person的name和age屬性
- (NSString *)description{  
    return [NSString stringWithFormat:@"name = %@,age = %d", self.name,self.age];
}
2.單例模式的實現(xiàn)思路和代碼(MRC)
  • 思路:
  • 1.聲明一個單例對象的靜態(tài)實例,初始化成nil
  • 2.創(chuàng)建一個類的類工廠方法,當且僅當這個類的實例為nil時生成一個該類的實例
  • 3.實現(xiàn)NScopying協(xié)議, 覆蓋allocWithZone:方法,確保用戶在直接分配和初始化對象時,不會產生另一個對象。
  • 4.覆蓋release、autorelease、retain、retainCount方法, 為了保證MAC環(huán)境下同樣可以使用
  • 5.使用@synchronized關鍵字或GCD的一次性代碼,確保靜態(tài)實例被正確的創(chuàng)建和初始化,防止多線程搶奪資源。
  • 代碼:
// 用來保存唯一的單例對象
static id _instace;

//調用alloc方法的底層會調用allocWithZone:方法
+ (id)allocWithZone:(struct _NSZone *)zone
{
    //用GCD的一次性代碼,防止多線程搶奪資源
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instace = [super allocWithZone:zone];
    });
    return _instace;
}

//設計一個類方法供對象的實例化
+ (instancetype)sharedTool
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instace = [[self alloc] init];
    });
    return _instace;
}

//在調用copy的底層會調用copyWithZone:方法,返回當前對象。
- (id)copyWithZone:(NSZone *)zone
{
    return _instace;
}

/*
 * 適配MRC。
 */
- (oneway void)release { }
- (id)retain { return self; }
- (NSUInteger)retainCount { return 1;}
- (id)autorelease { return self;}
3.retain的setter和getter方法
  • 拿對象的name屬性為例

setter方法

- (void)setName:(NSString *)name {
    [_name release];    //舊值release
    [name retain];    //新值retain
    _name = name;    //把新值賦值給舊值
}

getter方法

- (NSString *)name {
    return [[_name retain] autorelease];
}
4.遠程通知
  • 蘋果遠程推送APNs(Apple Push Notification service):設備在聯(lián)網(wǎng)之后把UDID(手機的唯一標識)和應用的BundleID發(fā)送給蘋果的服務器,蘋果的服務器加密之后返回給設備一個deviceToken,同時服務器把用戶的的信息和deviceToken存儲到數(shù)據(jù)庫。別的用戶想給當前用戶發(fā)消息的時候(比如通過QQ消息),先將消息傳到QQ的服務器,然后QQ的服務器通過用戶名找到蘋果的APNs服務器,APNS在自身的已注冊Push服務的iPhone列表中,查找有相應標識的iPhone,并把消息發(fā)送到iPhone。iPhone把發(fā)來的消息傳遞給相應的應用程序,并且按照設定彈出Push通知。
5.動態(tài)綁定
  • 在objective-c中,
    一個對象是否調用指定的方法不是由編譯器決定而是由運行時決定,這被稱作是方法的動態(tài)綁定。

  • 在objective-c里,對象不調用方法,而是接收消息,消息表達式為:[reciver message];運行時系統(tǒng)首先確定接收者的類型(動態(tài)類型識別),然后根據(jù)消息名在類的方法列表里選擇相依的方法執(zhí)行,所以在源代碼里消息也稱為選擇器(selector)

  • 消息函數(shù)的作用:
    – 首先通過第一個參數(shù)的receiver,找到它的isa指針,然后在isa指向的Class對象中使用第二個參數(shù)selector查找方法;
    – 如果沒有找到,就使用當前Class 對象中的新的isa 指針 到上一級的父類的Class 對象中查找;
    – 當找到方法后,再依據(jù)receiver的中的self 指針找到當前 的對象,調用當前對象的具體實現(xiàn)的方法(IMP),然后傳遞參數(shù),調用實現(xiàn)方法。
    – 假如一直找到NSObject的Class 對象,也沒有找到你調用的方法,就會報告不能識別發(fā)送消息的錯誤。

6.事件傳遞鏈和響應者鏈

事件傳遞鏈

  • 用戶的觸摸事件首先會由系統(tǒng)截獲,進行包裝處理等。然后遞歸遍歷所有的view,調用hitTest方法進行碰觸測試,直到找到可以處理事件的view。
//調用UIView的hitTest方法進行觸碰測試
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
  • 事件傳遞過程:application -> window -> rootView -> ... -> view

響應者鏈條

  • 1,事件響應者鏈是有多個響應者對象組成的鏈條(響應者對象是能處理事件的對象)
  • 2,利用響應者鏈條,可以讓多個響應者對象處理同一個事件。
  • 3,怎么利用鏈條向上傳遞,要尋找上一個響應者。
    • 如果當前的view是控制器的view,控制器就是上一個響應者
    • 如果當前的view不是控制器的view,這個view的父view就是上一個響應者
    • 可以多對象共同響應事件。只需要在以上方法重載中調用super的方法。
    • 當有view能夠處理觸摸事件后,開始響應事件,系統(tǒng)會調用view的以下方法:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
7.方法和選擇器有什么不同
  • 方法(method)包括一個函數(shù)的完整聲明和實現(xiàn)
  • 選擇器(selector)是一對方法的指向,包裝的是一個方法的名字
8.NSTimer不準的原因和解決辦法

原因

  • NSTimer創(chuàng)建默認是放在主線程runloop的NSDefaultRunLoopMode中,當主線程的模式改變的時候,如從NSDefaultRunLoopMode模式轉換到NSDefaultRunLoopMode模式的時候(如tableView滑動),就會造成NSTimer不準。

解決

  • 1.將NSTimer的對象放到NSRunLoopCommonModes模式下,這種模式的標簽可以兼容NSDefaultRunLoopMode和NSDefaultRunLoopMode模式,不管是默認模式還是滑動模式都能運行。
  • 2.可以開啟子線程,將NSTimer放到子線程中運行。
9.iOS數(shù)據(jù)持久化
  • plist存儲,它全名是:Property List,屬性列表文件。它是通過調用writeToFile方法將數(shù)據(jù)以鍵值對的形式存儲到.plist文件中,但是要求具有writeToFile方法,可以存儲NSString,NSArray,NSDictionary
  • NSUserDefaults,偏好設置,以鍵值對的形式將數(shù)據(jù)存儲在沙盒中。在iOS7之前需要手動同步到磁盤,通過調用[defaults synchronize];方法進行同步。
  • NSKeyedArchiver歸檔:用這種方法進行存儲的對象要實現(xiàn)NSCoding協(xié)議。并且實現(xiàn)encodeWithCoder和initWithCoder方法

encodeWithCoder告訴什么對象需要歸檔
initWithCoder。解檔,解析文件的時候調用

  • SQLite3數(shù)據(jù)庫存儲或者存儲到云端數(shù)據(jù)庫。
10.寫框架的時候注意點
  • 1,留的接口夠不夠用,調用是不是簡單
  • 2,留的參數(shù)是不是夠用
  • 3,是否能根據(jù)類名,方法名猜出功能
  • 4,是否依賴別人的框架
11.數(shù)據(jù)庫事務ACID
  • A:原子性(Atomicity)意味著數(shù)據(jù)庫中的事務執(zhí)行是原子操作,即不可再分,要么全部執(zhí)行,要么全不執(zhí)行。例如銀行轉賬,要么轉賬成功,要么不成功
  • C:一致性(Consistency)即在事務開始之前和事務結束以后,數(shù)據(jù)庫的完整性約束沒有被破壞。銀行轉賬兩個賬戶的增減一定是相等的,保持綜合不變
  • I:隔離性(Isolation)意味著事務的執(zhí)行是互不干擾的,一個事務不可能看到其他事務運行中某一時刻的數(shù)據(jù)。
  • D:持久性(Durability)意味著事務完成以后,該事務對數(shù)據(jù)庫所作的更改便持久的保存在數(shù)據(jù)庫之中。
12.謂詞(NSPredicate)
  • Objc中的謂詞操作是針對于數(shù)組類型的,他就好比數(shù)據(jù)庫中的查詢操作,數(shù)據(jù)源就是數(shù)組,這樣的好處是我們不需要編寫很多代碼就可以去操作數(shù)組,同時也起到過濾的作用,我們可以編寫簡單的謂詞語句,就可以從數(shù)組中過濾出我們想要的數(shù)據(jù)。
    例如
NSArray *array = [[NSArray alloc]initWithObjects:@"beijing",@"shanghai",@"guangzou",@"wuhan", nil]; 
NSString *string = @"ang";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF CONTAINS %@",string]; 
NSLog(@"%@",[array filteredArrayUsingPredicate:pred]);
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • OC的理解與特性OC作為一門面向對象的語言,自然具有面向對象的語言特性:封裝、繼承、多態(tài)。它既具有靜態(tài)語言的特性(...
    LIANMING_LI閱讀 580評論 0 0
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,627評論 30 472
  • 序言 目前形勢,參加到iOS隊伍的人是越來越多,甚至已經(jīng)到供過于求了。今年,找過工作人可能會更深刻地體會到今年的就...
    恒愛DE問候閱讀 5,633評論 0 9
  • 把網(wǎng)上的一些結合自己面試時遇到的面試題總結了一下,以后有新的還會再加進來。 1. OC 的理解與特性 OC 作為一...
    AlaricMurray閱讀 2,667評論 0 20
  • OC的理解與特性 OC作為一門面向對象的語言,自然具有面向對象的語言特性:封裝、繼承、多態(tài)。它既具有靜態(tài)語言的特性...
    克魯?shù)吕?/span>閱讀 503評論 0 0

友情鏈接更多精彩內容