面試題 iOS OC

  1. 簡述OC中內存管理機制。與retain配對使用的方法是dealloc還是release,爲什麼?需要與alloc配對使用的方法是dealloc還是release,爲什麼?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak屬性的作用?
    OC使用了一種叫做引用計數的機制來管理對象,如果對一個對象使用了alloc[Mutable]copyretain,那麼你必須使用相應的realease或者autorelease。也可以理解爲自己生成的對象,自己持有。非自己生成的對象,自己也能持有。不在需要自己持有的對象時釋放。非自己持有的對象無法釋放。生成並持有對象<alloc,new,copy,mutableCopy>,持有對象<retain>,釋放對象<release>,廢棄對象<dealloc>readwrite(默認):可讀可寫,表示既有getter方法,也有setter方法。readonly:表示只有getter方法,沒有setter方法。nonatomic:不考慮線程安全。atomic(默認):線程操作安全。strong(默認):ARC下和MRCretain一樣,weakARC下):和(MRC)assign類似,區別是當weak指向的內存釋放掉後自動置爲nil,防止野指針。

unsafe_unretained聲明一個若引用,但不會自動置爲nil,可能會出現野指針。

線程安全下的settergetter方法:

  • NSString *value{

@synchronizedself{

return [[_value retain] autorelease];

}

}

  • (void)setValue:(NSString *)aValue{

@synchronized(self){

[aValue retain];

[_value release];

_value = aValue;

}

}

  1. 類變量的@protected ,@private,@public,@package,聲明各有什麼含義?
    上面的幾個聲明表明的時類成員的作用域,@private作用範圍只能在自身類(外界既不可訪問,又不能繼承);@protected作用範圍在自身類和子類,如果什麼都不加修飾,默認是@protected(外界不可訪問,但是可以繼承);@public作用範圍最大,可以在任何地方被訪問(外界即可訪問,又可以繼承);@package作用範圍在某個框架內
  2. 線程是什麼?進程是什麼?二者有什麼區別和聯繫?
    線程是CPU獨立運行和獨立調度的基本單位(可以理解爲一個進程中執行的代碼片段),進程是資源分配的基本單位(進程是一塊包含了某些資源的內存區域)。進程是線程的容器,真正完成代碼執行的是線程,而進程則作爲線程的執行環境。一個程序至少包含一個進程,一個進程至少包含一個線程,一個進程中的多個線程共享當前進程所擁有的資源。
  3. 談談你對多線程開發的理解?ios中有幾種實現多線程的方法?
    好處:1、使用線程可以把程序中佔據時間長的任務放到後臺去處理,如圖片、視頻的下載2、發揮多核處理器的優勢,併發執行讓系統運行的更快、更流暢,用戶體驗更好缺點:1、大量的線程降低代碼的可讀性,2、更多的線程需要更多的內存空間3、當多個線程對同一個資源出現爭奪的時候要注意線程安全的問題。iOS有三種多線程編程的技術:1NSThread(兩種創建方式)[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];NSThread *myThread = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];

[myThread start];2NSOperationQueue

NSOperationQueue *oprationQueue = [[NSOperationQueue alloc] init];

oprationQueue addOperationWithBlock:^{

//這個block語句塊在子線程中執行

}

http://alloc.sinaapp.com/wp/?p=237

3Grand Central Dispatch (GCD)

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    // 耗時的操作

    dispatch_async(dispatch_get_main_queue(), ^{

        // 更新界面

    });

});

http://blog.csdn.net/totogo2010/article/details/8016129


PS:不顯示的創建線程的方法:用NSObject的類方法  performSelectorInBackground:withObject: 創建一個線程:[Obj performSelectorInBackground:@selector(doSomething) withObject:nil];

  1. 線程同步和異步的區別?IOS中如何實現多線程的同步?
    同步:一個線程要等待上一個線程執行完之後才能執行當前的線程,生活中的例子(上廁所)。異步:同時去做兩件或者多件事。比如邊聽歌邊看報。   GCD串行隊列,GCD當中的屏障dispatch_barrier,NSOperationQueue設置最大併發數爲1

參考(http://blog.csdn.net/lifengzhong/article/details/7487505

多線程實現數據:原子操作(atomic)、加鎖(NSLockNSRecursiveNSConditionLock)、@synchronized

  1. 假設有一個字符串aabcad,請寫一段程序,去掉字符串中不相鄰的重複字符串,即上述字符串處理之後的輸出結果爲:aabcd

本題的題意是以第一個出現的字母作爲參照,只要之後出現相同的字母並且和第一個字母不相鄰,那麼就刪除。爲防止刪除某些字符之後,把之前不相鄰的重複字符串轉化爲相鄰字符串,所以可以先用空格替換掉需要刪除的字符,最後對數組裏面的空格進行處理。-(void)removeRepeat:(NSString *)aNum

{

    NSMutableArray *mArr = [[NSMutableArray alloc]initWithCapacity:10];

    for (int i = 0;i < aNum.length;i++)

    {

        [mArr addObject:[aNum substringWithRange:NSMakeRange(i,1)]];

    }

    NSLog(@"- %@", mArr);

    [self compareNum:mArr];

    NSLog(@"%@",mArr);

    

}

//比較是否相等

-(NSMutableArray *)compareNum:(NSMutableArray *)mArr

{

    int count = mArr.count;//重新定義了,count不會減一

    for (int j = 0; j < count - 1; j++)

    {

        for (int i = j; i < count - 1-1-1; i++)

        {

            NSLog(@" %@  %@",[mArr objectAtIndex:j],[mArr objectAtIndex:i + 2]);

            NSString *a = [mArr objectAtIndex:j];

            NSString *b = [mArr objectAtIndex:i+2];

            

            if ([a isEqualToString:b])

            {

                [mArr replaceObjectAtIndex:i + 2 withObject:@" "];

            }

        }

    }

    

    return mArr;

}


  1. 獲取一臺設備唯一標識的方法有哪些?
    MAC地址,udidkeychainopen udid,廣告標識IDFA-identifierForIdentifier

參考鏈接< http://www.2cto.com/kf/201308/237648.html >

  1. iOS類是否可以多繼承?如果沒有,那可以用其他方法實現嗎?簡述實現過程。
    不可以,可以通過delegateprotocol和類別來實現類似多繼承。
  2. 堆和棧的區別?
    棧區(stack--由編譯器自動分配釋放,存放函數的參數值、局部變量的值。堆區(heap--一般由程序員分配釋放。全局區(靜態區)(static--全局變量和靜態變量。程序結束後由系統釋放。

      文字常量區--常量字符串存放在這裏。程序結束後由系統釋放。   程序代碼區存放函數體的二進制文件。

棧:只要棧的剩餘空間大於所申請空間,系統將爲程序提供內存,否則將報異常提示棧溢 出。 

堆:首先應該知道操作系統有一個記錄空閒內存地址的鏈表,當系統收到程序的申請時,會遍歷該鏈表,尋找第一個空間大於所申請空間的堆結點,然後將該結點從空閒結點鏈表中刪除,並將該結點的空間分配給程序,另外,對於大多數系統,會在這塊內存空間中的首地址處記錄本次分配的大小,這樣,代碼中的delete語句才能正確的釋放本內存空間。另外,由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部分重新放入空閒鏈表中。

  1. iOS本地數據存儲都有哪幾種方式?iOS如何實現複雜對象的存儲?
  2. NSKeyedArchiver(歸檔)採用歸檔的形式來保存數據,該數據對象需要遵守NSCoding協議,並且該對象對應的類必須提供encodeWithCoder:initWithCoder:方法。
  3. NSUserDefaults:用來保存應用程序設置和屬性、用戶保存的數據。用戶再次打開程序或開機後這些數據仍然存在。NSUserDefaults可以存儲的數據類型包括:NSDataNSStringNSNumberNSDateNSArrayNSDictionary
  4. Write寫入方式:永久保存在磁盤中。
  5. SQLiteFMDBCoreData

NSCoding + NSKeyedArchiver實現複雜對象的存儲。

  1. iOS的動態性iOS的動態性來自三個方面:動態類型、動態綁定、動態載入、SEL類型 

1、動態類型<弱類型>id):在代碼的運行階段判斷代碼的類型,使用id類型可以讓應用在運行時使用任何類型來替換。動態類型讓程序更加靈活,但是會使數據的統一性降低和代碼的可讀性。我們常用靜態類型<強類型>(如NSString,使用靜態類型編譯器可以完全分析你的代碼,這讓代碼的性能和可預知性更高。2、動態綁定:讓代碼在運行時判斷需要調用什麼方法,而不是在編譯時。 動態類型和動態綁定使得選擇哪個接收者已經調用什麼方法都放到運行      時去完成。   3、動態載入:應用程序可以根據需要加載可執行代碼以及資源,而不是    

      在啓動時就加載所有資源。

4SEL類型 iOS在編譯的時候會根據方法的名字(包括參數序列),生成一個用來區分這個方法的唯一的ID,這個IDSEL類型的,SEL的本質就是類方法的編號[函數地址]。(類似C語言裏面的函數指針,但是OC的類不能直接使用函數指針,這樣只能做一個@selector語法來取。注意:@selector是查找當前類(含子類)的方法。)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章