iOS面試題,持續(xù)更新...

C 部分

1.static 關(guān)鍵字的作用?

  1. 第一個作用:隱藏。 當(dāng)我們同時編譯多個文件時,所有未加static前綴的全局變量和函數(shù)都具有全局可見性。
  2. static的第二個作用是保持變量內(nèi)容的持久。存儲在靜態(tài)數(shù)據(jù)區(qū)的變量會在程序剛開始運(yùn)行時就完成初始化,也是唯一的一次初始化。共有兩種變量存儲在靜態(tài)存儲區(qū):全局變量和static變量,只不過和全局變量比起來, static可以控制變量的可見范圍,說到底static還是用來隱藏的。
  3. static的第三個作用是默認(rèn)初始化為0。其實全局變量也具備這一屬性, 因為全局變量也存儲在靜態(tài)數(shù)據(jù)區(qū)。在靜態(tài)數(shù)據(jù)區(qū),內(nèi)存中所有的字節(jié)默認(rèn)值都是0x00,某些時候這一特點可以減少程序員的工作量。

2.線程與進(jìn)程的區(qū)別和聯(lián)系?

一個進(jìn)程可以由一個或者多個線程組成, 進(jìn)程和程序并不是一一對應(yīng)的,一個程序執(zhí)行在不同的數(shù)據(jù)集上就成為不同的 進(jìn)程,可以用進(jìn)程控制塊來唯一地標(biāo)識每個進(jìn)程。而這一點正是程序無法做到的,由于程序沒有和數(shù)據(jù)產(chǎn)生直接的聯(lián)系,既使是執(zhí)行不同的數(shù)據(jù)的程序,他們的指令的集合依然是一樣的,所以無法唯一地標(biāo)識出這些運(yùn)行于不同數(shù)據(jù)集上的程序。一般來說,一個進(jìn)程肯定有一個與之對應(yīng)的程序,而且只有一個。而一個程序有可能沒有與之對應(yīng)的進(jìn)程(因為它沒有執(zhí)行),也有可能有多個進(jìn)程與之對應(yīng)(運(yùn)行在幾個不同的數(shù)據(jù)集上)。

3.堆和棧的區(qū)別?

  1. 棧區(qū)(stack)― 由編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。
  2. 堆區(qū)(heap) ― 一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時可能由OS回收 。

4.C語言如何判斷兩個單向無環(huán)鏈表是否相交?

只需判斷兩個鏈表的尾節(jié)點地址是否相同,相同則相交,不同則不相交

5.程序在內(nèi)存中運(yùn)行時,內(nèi)存分幾個區(qū),各自用途?

  1. 棧 --有編譯器自動分配釋放。
  2. 堆 -- 一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時可能由 OS 回收
  3. 全局區(qū)(靜態(tài)區(qū)) -- 全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始 化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。程序結(jié)束釋放。
  4. 另外還有一個專門放常量的地方。程序結(jié)束釋放。

6.引用與指針有什么區(qū)別?

指針指向一塊內(nèi)存,它的內(nèi)容是所指內(nèi)存的地址;引用是某塊內(nèi)存的別名

  1. 指針是一個實體,而引用僅是個別名;
  2. 引用使用時無需解引用(*),指針需要解引用;
  3. 引用只能在定義時被初始化一次,之后不可變;指針可變;
  4. 引用沒有 const,指針有 const;
  5. 引用不能為空,指針可以為空;
  6. “sizeof 引用”得到的是所指向的變量(對象)的大小,而“sizeof指針”得到的是指針本身(所指向的變量或?qū)ο蟮牡刂?的大小;
  7. 指針和引用的自增(++)運(yùn)算意義不一樣;
  8. 從內(nèi)存分配上看:程序為指針變量分配內(nèi)存區(qū)域,而引用不需要分配內(nèi)存區(qū)域。

7.編程:
1.請問運(yùn)行完Test函數(shù)后,會有什么樣的結(jié)果。
(1)

void GetMemory(char *p)
{
    p = (char *)malloc(100);
}
void Test(void)
{
    char *str = NULL;
    GetMemory(str);
    strcpy(str, "hello world");
    printf(str);
}

請問運(yùn)行Test函數(shù)會有什么樣的結(jié)果?
答:程序崩潰。
因為GetMemory并不能傳遞動態(tài)內(nèi)存, Test函數(shù)中的 str一直都是 NULL。 strcpy(str, "hello world");將使程序崩潰。

(2)

char *GetMemory(void)
{
    char p[] = "hello world";
    return p;
}
void Test(void)
{
    char *str = NULL;
    str = GetMemory();
    printf(str);
}

請問運(yùn)行Test函數(shù)會有什么樣的結(jié)果?
答:可能是亂碼。
因為GetMemory返回的是指向“棧內(nèi)存”的指針,該指針的地址不是 NULL,但其原先的內(nèi)容已經(jīng)被清除,新內(nèi)容不可知。

(3)

void GetMemory2(char **p, int num)
{
    *p = (char *)malloc(num);
}
void Test(void)
{
    char *str = NULL;
        GetMemory(&str, 100);
        strcpy(str, "hello");
        printf(str);
}

請問運(yùn)行Test函數(shù)會有什么樣的結(jié)果?
答:
(1)能夠輸出hello
(2)內(nèi)存泄漏

(4)

void Test(void)
{
    char *str = (char *) malloc(100);
    strcpy(str, “hello”); 
    free(str);
    if(str != NULL)
    {
        strcpy(str, “world”);
                printf(str);
    }
}

請問運(yùn)行Test函數(shù)會有什么樣的結(jié)果?
答:篡改動態(tài)內(nèi)存區(qū)的內(nèi)容,后果難以預(yù)料,非常危險。 因為free(str);之后,str成為野指針,if(str != NULL)語句不起作用。

2.編寫strcpy函數(shù)
已知strcpy函數(shù)的原型是 char *strcpy(char *strDest, const char *strSrc);其中strDest是目的字符串,strSrc是源字符串。
(1)不調(diào)用C++/C的字符串庫函數(shù),請編寫函數(shù) strcpy

char *strcpy(char *strDest, const char *strSrc)
{
    assert((strDest!=NULL) && (strSrc !=NULL)); 
        char *address = strDest;
        while( (*strDest++ = * strSrc++) != ‘\0’ )NULL ;
        return address ;
}

(2)strcpy能把strSrc的內(nèi)容復(fù)制到strDest,為什么還要char * 類型的返回值?
答:為了實現(xiàn)鏈?zhǔn)奖磉_(dá)式。
例如

int length = strlen( strcpy( strDest, “hello world”) );
#include <stdio.h> 
int main()
{
    int a = 0x0101;
        int b = 0x0202;
        int c;
        c = a & (~b);
        c = c | b;
    printf("%x,%d\n",c,c);
    return 0;
}

答案: 303,771

4.完成下面函數(shù)以實現(xiàn)使用輾轉(zhuǎn)相除法獲取兩個數(shù)(假設(shè)兩個數(shù)都大于0)的最大公約數(shù)

example: gcd(20,5 ) = 5. gcd(3,10 ) = 1. gcd(1620,1280 )= 20.
unsigned int gcd(unsigned int a,unsigned int b)
{
    int c = 0;
        if(m % n == 0) c = n;
        else
        c = gcd(n, m % n);
        return c;
} 

5.用嵌套方式寫一個函數(shù),函數(shù)返回N的階層,要求盡量寫完整

int fun(int n)
{
    if (n == 1)
        return n;
    return n * fun(n - 1);
}

6.請寫出下列數(shù)據(jù)類型的范圍 char, unsigned char, short, int
答:

char (-127~128) unsigned char(0~255) short(-2^16-1 ~2^16)
int(-32768~32767) 

7.請寫出下面函數(shù)的返回值

char fuc1()
{
    unsigned int a = 6;
    int b = -12;
    return(a + b > 6) ? 1 : 0;
}

#define SQP(x)(x*x) 
int fuc2()
{
        int a = 3;
        return SQR(a+2);
}

答:1 11

8.請計算下列結(jié)構(gòu)所占字節(jié)數(shù)

Typedef structYouKnow
{
    int id;
    short age;
    char level;
}

答:8

9.關(guān)鍵字 const 有什么含義?

const 修飾誰,誰在整個程序運(yùn)行過程中不能變

10.下方代碼輸出結(jié)果為

main()
{
    int a[5] = {1, 2, 3, 4, 5};
    int *ptr = (int *)(&a+1); 
        printf(“%d%d”, *(a+1), *(ptr-1));
}

答:2, 5

11.用 c/c++實現(xiàn)冒泡排序

void swap_sort(int *p, int n)
{
    int i, j;
    int tmp;
    for(i=0; i<n-1; i++){
        for(j=0; j<n-1-i; j++){
            if(p[j]>p[j+1]){
                tmp=p[j];
                p[j]=p[j+1];
                p[j+1]=tmp;
            }
        }
    }
}

12.用嵌套的方式寫一個函數(shù),該函數(shù)返回 N 的階乘(N!=12..*N)

int func(int n)
{
    if (n==1) return 1; 
        return n * func(n-1);
}

OC

1.Objective-C可以實現(xiàn)多繼承嗎?可以實現(xiàn)多個接口嗎?Category是什么?重寫一個類的方式是用繼承好還是用分類好?為什么?

2.OC使用協(xié)議實現(xiàn)多繼承,可以遵守多個協(xié)議實現(xiàn)多接口。category是OC中的類別,類別是用于給一個現(xiàn)有類添加新方法。重寫類一般采用繼承的方式,分類(類別)在給以個類添加同名方法后,會造成原有類中方法的失效,而繼承重寫的方法,依然可以在使用父類對象調(diào)用該方法。

3.定義屬性的時候,什么時候使用retain/copy/assign?寫一個setter方法, 用于完成@property(nonatomic,retain) NSString* name; 寫一個setter方法, 用于完成@property(nonatomic,copy) NSString* name;
答:retain 用于保留對象的引用計數(shù),在使用retain聲明的屬性做賦值的時候,成員變量指針會保留被賦值對象的引用計數(shù)。
copy 聲明的屬性,在使用屬性賦值的時候會,成員指針會指向新副本,這個副本是一個不可變副本,不論賦值對象是不是可變的。
assign 用于基本數(shù)據(jù)類型的屬性聲明,不涉及到內(nèi)存管理的問題,也是缺省參數(shù)

retain聲明的屬性的setter方法展開
- (void)setName:(NSString*)name {
      if(_name != name)
         {
              [_name release];
              _name = [name retain];
         }
}
copy聲明的屬性的setter方法展開
- (void)setName:(NSString*)name {
      if(_name != name)
         {
              [_name release];
              _name = [name copy];
         }
}

4.什么時候使用NSMutableArray/什么時候使用NSArray?
答:NSMutableArray 一般在需要隨時更改數(shù)組結(jié)構(gòu)的時候使用 NSArray 一般用于保存一些不需要修改邏輯的數(shù)據(jù)

5.實現(xiàn)字符串“I LOVE CHINA”反串成“CHINA LOVE I”

6..pch 文件的作用
答:.pch 表示"precompiled header",這是一個你工程要用到的來自于外部框架的頭文件列表。Xcode 將編譯這些頭文件,這將減少你在選擇 Build 或 Build and Go 時編譯項目的時間。通常用到的頭文件已經(jīng)自動包含了 pch,系統(tǒng)編譯每個 cpp 文件前,都會先 include 這個文件。這樣就節(jié)省了添加include 的時間,相當(dāng)于加速編譯。還可以在這里面放入宏,在整個工程中都可以用。

7.怎樣解決重復(fù)編譯

#ifndef _DEBUG 
#ifdef USE_MYLIB ......
#endif

8.awakeFromNib 與 viewDidLoad 區(qū)別
答:
awakeFromNib
當(dāng).nib 文件被加載的時候,會發(fā)送一個 awakeFromNib 的消息到.nib 文件中的每個對象,每個對象都可以定義自己的 awakeFromNib 函數(shù)來響應(yīng)這個消息, 執(zhí)行一些必要的操作。也就是說通過 nib 文件創(chuàng)建 view 對象時執(zhí)行awakeFromNib 。
viewDidLoad
當(dāng) view 對象被加載到內(nèi)存是就會執(zhí)行 viewDidLoad,所以不管通過 nib 文件還是代碼的方式創(chuàng)建對象都會執(zhí)行 viewDidLoad。

9.LayoutSubviews 何時會被調(diào)用?
答:當(dāng)要調(diào)整 subViews 時候,需要重寫 layoutSubviews 方法。

  1. 初始化 init 方法時候不會觸發(fā)。
  2. 滾動 UIScrollView 時會觸發(fā)
  3. 旋轉(zhuǎn) UIScreen 時會觸發(fā)
  4. 當(dāng)改變 view 的值時候會觸發(fā),前提是 frame 前后值發(fā)生了變化
  5. 當(dāng)改變 UIview 的大小時候會觸發(fā)

10.public/private/protected 的具體區(qū)別
答:public 公共,加上這個修飾的類或?qū)傩?可以在同一個包或者別的包里面訪問 private 私有的,加上這個修飾的類或?qū)傩?只能在同類里訪問,同包和別的包不能訪問。
protected 保護(hù),加上這個修飾的類或?qū)傩?只能在類和同包訪問,別的包不能訪問。

11.ARC 是什么?
答:ARC 是 iOS 5 推出的新功能,全稱叫 ARC(Automatic Reference Counting)。 簡單地說,就是代碼中自動加入了 retain/release,原先需要手動添加的用來處理內(nèi)存管理的引用計數(shù)的代碼可以自動地由編譯器完成了。
該機(jī)能在 iOS 5/ Mac OS X 10.7 開始導(dǎo)入,利用 Xcode4.2 可以使用該機(jī)能。 簡單地理解 ARC,就是通過指定的語法,讓編譯器(LLVM 3.0)在編譯代碼時, 自動生成實例的引用計數(shù)管理部分代碼。有一點,ARC 并不是 GC,它只是一種 代碼靜態(tài)分析(Static Analyzer)工具。

12.寫一個“標(biāo)準(zhǔn)”宏,這個宏輸入兩個參數(shù)并返回較小的

#define MIN(X,Y) ((X)>(Y)?(Y):(X))

13.Objective-c 中有多重繼承么?不是的話有聲明替代方式?
答:沒有多繼承,可以通過協(xié)議模擬多繼承

14.Objective-c 中有私有方法嗎?私有變量呢?
答:沒有私有方法,但可以將方法直接實現(xiàn)在.m 文件中不在.h 文件中聲明時,外部也不能訪問。有私有變量。

15.iPhone OS 中有沒有垃圾回收?
答:沒有

16.常見的 object-c 的數(shù)據(jù)類型有哪些,和 c 的基本類型有什么區(qū)別?
答:常見的 object-c 的數(shù)據(jù)類型有 NSInteger、CGFloat、NSString、 NSNumber、NSArray、NSData,NSInteger 會根據(jù)系統(tǒng)是 32 位還是 64 位來決定 是本身是 int 還是 Long,
CGFloat 會根據(jù)系統(tǒng)是 32 位還是 64 位來決定是本身是 float 還是 double,NSString、NSNumber、NSArray、NSData 都是指針類型的對象,在堆中分配空間,而 c 語言中的 char,[]等都是在棧中分配空間

17.id 聲明的對象有什么特性?
答:id 聲明的對象具有運(yùn)行時的特性,即可以指向任意類型的 objcetive-c 的對象。

18.想 nil 對象發(fā)送消息會發(fā)生什么?
答:在 Objective-C 中向 nil 發(fā)送消息是完全有效的,只是在運(yùn)行時不會有任何作用。

19.什么是 block?block 實現(xiàn)原理?
答:block 是一個特殊的 OC 對象, 它建立在棧上, 而不是堆上, 這么做一個是為性能考慮,還有就是方便訪問局部變量。默認(rèn)情況下 block 使用到的局部變量都會被復(fù)制,而不是保留。所以它無法改變局部變量的值。如果在變量面前加上__block, 那么編譯器回去不會復(fù)制變量, 而是去找變量的地址, 通過地址來訪問變量, 實際上就是直接操作變量。另外 block 是在棧上分配的, 所以一旦離開作用域, 就會釋放, 因此如果你要把快用在別的地方, 必須要復(fù)制一份。 block 是不能保留的, retain 對塊沒有意義。

20.C++和 OC,JAVA 和 OC 之間的區(qū)別?
答:C++是功能強(qiáng)大,豐富的面向?qū)ο缶幊陶Z言,具有私有、公有、保護(hù)權(quán)限的三種
成員變量和成員方法,具有私有、公有、保護(hù)三種繼承方式,具有重寫,重載, 虛函數(shù),虛基類等多態(tài)方式,通過虛基類實現(xiàn)代理回調(diào)。自定義類可以沒有父 類。另外具備向量,模板,友元,重載運(yùn)算符等多種獨特語法
Obj-C 是針對 mac OS 和 iOS 設(shè)備應(yīng)用程序開發(fā)的專屬編程語言,采用動態(tài)繼承, 消息方法機(jī)制,沒有真正的重寫機(jī)制,沒有私有方法,繼承方式為公有,具備協(xié)議,類別,Block 等獨有的語法,萬用父類為 NSObject
JAVA 是老牌的面向?qū)ο笳Z言,編寫的程序在 JAVA 虛擬機(jī)上運(yùn)行,真正實現(xiàn)了一次編譯到處運(yùn)行,具有復(fù)雜的內(nèi)存回收機(jī)制,單繼承模式,接口語法類似 Obj-C 的協(xié)議。

21.抽象與接口的區(qū)別?
答:聲明方法的存在而不去實現(xiàn)它的類被叫做抽象類(abstract class),它用于要創(chuàng)建一個體現(xiàn)某些基本行為的類,并為該類聲明方法,但不能在該類中實現(xiàn)該類的情況。不能創(chuàng)建 abstract 類的實例。然而可以創(chuàng)建一個變量,其類型是一個抽象類,并讓它指向具體子類的一個實例。不能有抽象構(gòu)造函數(shù)或抽象 靜態(tài)方法。Abstract 類的子類為它們父類中的所有抽象方法提供實現(xiàn),否則它們也是抽象類為。取而代之,在子類中實現(xiàn)該方法。知道其行為的其它類可以 在類中實現(xiàn)這些方法。接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過實現(xiàn)這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個有程序體。接口只可以定義 static final 成員變量。接口的實現(xiàn)與子類相似,除了該實現(xiàn)類不能從接口定義中繼承行為。當(dāng)類實現(xiàn)特殊接口時,它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實現(xiàn)了該接口的類的任何對象上調(diào)用接口的方法。由于有抽象類,它允許使用接口名作為引用變量的類型。通常的動態(tài)聯(lián)編將生效。引用可以轉(zhuǎn)換到接口類型或從接口類型轉(zhuǎn)換,instanceof 運(yùn)算符可以用來決定某對象的類是否實現(xiàn)了接口。

22.nil 與 NULL 的區(qū)別?
答:從 Objective-C 語言的官方說法上看,nil 表示指向?qū)ο蟮闹羔樇此^對象的引用為空,NULL 表示指向基礎(chǔ)類型變量即 C 語言變量的指針為空。如果在非 ARC 程序的編寫過程中,兩個空是可以互換的,但是在 ARC 環(huán)境下,普通指針和對象引用被嚴(yán)格限制,不能交換使用,因此也應(yīng)盡量不互換使用 nil 與 NULL

23.BOOL 與 bool 的區(qū)別?
答:bool 是 C 語言 C99 標(biāo)準(zhǔn)中增添的變量類型,Object-C 僅僅是從 C 語言繼承了這 種類型,該類型有 true 和 false 兩個值,表示真和假。BOOL 是 Obj-C 獨有的布爾類型,有 YES 和 NO 兩個值,分別是 1 和 0 的宏。Obj-C 中同時認(rèn)為所有非 0 的值都是真值,0 為假值。

24.OC 如何實現(xiàn)私有方法?
答:Obj-C 語法中并沒有私有方法的概念,但是由于 Obj-C 是通過導(dǎo)入其他類的頭 文件來獲取其他類所擁有的成員方法的聲明,因此可以采用編寫方法時,不聲明,或僅在.m 文件中的匿名類別中聲明的方式,使方法對外不可見,即可達(dá)到方法私有化的目的。但是外部類仍然可以通過@selector 來訪問確實存在的私有方法,因此嚴(yán)格來講 Obj-C 確實不能真正實現(xiàn)方法私有化

25.NSString 和 NSMutableString 的區(qū)別
答:NSString 是一個不可變的字符串對象。這不是表示這個對象聲明的變量的值不 可變,而是表示它初始化以后,你不能改變該變量所分配的內(nèi)存中的值,但你 可以重新分配該變量所處的內(nèi)存空間。而 NSMutableString 是可變的,意味著 你可以追加它的內(nèi)存空間,或者修改它所分配的內(nèi)存空間中的值。

26.關(guān)于語句 NSString * str= [[NSData alloc]init],編譯和運(yùn)行str分別代表什么對象?
答:首先,聲明 NSString *str 是告訴編譯器,str 是一個指向某個 Objective-C 對象的指針。因為不管指向的是什么類型的對象,一個指針?biāo)嫉膬?nèi)存空間都是固定的,所以這里聲明成任何類型的對象,最終生成的可執(zhí)行代碼都是沒有區(qū)別的。這里限定了 NSString 只不過是告訴編譯器,請把 str 當(dāng)做一個 NSString 來檢查,如果后面調(diào)用了非 NSString 的方法,會產(chǎn)生警告。 接著,你創(chuàng)建了一個 NSData 對象,然后把這個對象所在的內(nèi)存地址保存在 str 里。那么運(yùn)行時,str 指向的內(nèi)存空間就是一個 NSData 對象。你可以把 str 當(dāng)做一個 NSData 對象來用。

27.socket 通信的幾個關(guān)鍵步驟
面向連接的 socket 通信就像與對方打電話,首先需要通過電話建立一個連接, 連接建立好之后,彼此才能雙向通信。它有幾個關(guān)鍵步驟 服務(wù)器端通常以守護(hù)進(jìn)程的方式實現(xiàn):

  1. 創(chuàng)建守護(hù)進(jìn)程
  2. 獲取或注冊服務(wù)
  3. 創(chuàng)建 socket 并綁定地址
  4. 開始監(jiān)聽
  5. 接收客戶端連接請求
  6. 進(jìn)行數(shù)據(jù)傳輸
    客戶端
  7. 獲取或注冊服務(wù)
  8. 創(chuàng)建 socket
  9. 發(fā)送連接請求

29.類別意義? 與繼承的區(qū)別?
答:當(dāng)我們添加頭文件以后,對已知的類,會自動提示你對這個類添加的方法
主要用途,對于原生不會造成破壞,使用原生就可以提示出你的方法

30.Core Foundation 中提供了哪幾種操作 Socket 的方法?
答:CFNetwork、CFSocket 和 BSD Socket

31.用 id 聲明的對象有什么特性?
? 沒有*號
? 動態(tài)數(shù)據(jù)類型
? 可以指向任何類的對象(設(shè)置是 nil),而不關(guān)心其具體類型
? 在運(yùn)行時檢查其具體類型
? 可以對其發(fā)送任何(存在的)消息

32.self.name=“object” name=“object”有什么區(qū)別?
答:前者實際上是調(diào)用了set方法給變量賦值 而后者是直接給變量賦值

33.shell中,將command1的輸出作為command2的輸出應(yīng)該使用的命令是? 重定向命令>
command1>command2

34.下面的數(shù)據(jù)結(jié)構(gòu)中不屬于線性結(jié)構(gòu)的是:棧,鏈表,二叉樹,線性表
線性結(jié)構(gòu):棧,鏈表,線性表
非線性結(jié)構(gòu):二叉樹

35.oc中有沒有多繼承,如果沒有用什么方法替代?
答:沒有 用協(xié)議代替多繼承

36.常見的Objective-C的數(shù)據(jù)類型有哪些,和C的基本數(shù)據(jù)類型有什么區(qū)別? 答:OC中常用數(shù)據(jù)類型有 NSArray,NSDictionary,NSData,NSString,NSMutbleString等等,和C的最大區(qū)別為OC中的類型是類類型,需要實例化對象才能用。C中是一般數(shù)據(jù)類型直接操作內(nèi)存空間

37.C語言中指針與數(shù)組的區(qū)別
答:指針是變量可以修改指向的方向,數(shù)組名是地址常量,不能被修改

38.new delete malloc free 的含義
答:c++:new申請內(nèi)存, delete釋放掉指針指向的內(nèi)存 c:malloc 動態(tài)申請內(nèi)存,free 釋放指針指向的內(nèi)存

39.常引用什么時候使用?
答:如果既要利用引用提高程序的效率,又要保護(hù)傳遞給函數(shù)的數(shù)據(jù)不在函
數(shù)中被改變,就要使用常引用

40.c/oc/c++有什么區(qū)別和聯(lián)系?
答:C 相對于 C++和 OC 而言更偏重于邏輯算法,這是因為 C 是面向過程,C++ 和 OC 都是面向?qū)ο蟆 和 C++的聯(lián)系:C 是 C++的一個自洽子集,C++是 C 的超 集,OC 是 C 的擴(kuò)展,C++和 OC 基本兼容 C 的語法。

41.const 的用法
答:const 修飾變量表示該變量是只讀變量(有些人管它叫常量),即只能引用而不能修改。const int *p;表示指針變量 P 指向的數(shù)據(jù)不能改
int *const p;表示指針變量 P 的值不能改,或者說是指針 P 的指向不能改

42.[pool release]和[pool drain]有什么區(qū)別?
答:drain 和 release 都會促使自動釋放池對象向池內(nèi)的每一個對象發(fā)送release消息來釋放池內(nèi)對象的引用計數(shù),但是release觸發(fā)的這個操作, 不會考慮對象是否需要release,而drain會在自動釋放池向池內(nèi)對象發(fā)送 release消息的時候,考慮對象是否需要release

43.自動釋放池和 GC 一樣嗎,iphone 有沒有 GC ?
答:在引用計數(shù)環(huán)境下,ios 是沒有垃圾回收的,自動釋放池是 oc 中管理內(nèi)存的一種方式,它和 gc 是本質(zhì)區(qū)別的,自動釋放池管理內(nèi)存的前提是,必須把要管理內(nèi)存的對象加入池內(nèi),才會生效。而 gc 是不斷檢測當(dāng)前程序中是否有不再使用的內(nèi)存進(jìn)而釋放。

44.當(dāng)A類中的某個方法執(zhí)行到某處時,這時想在B類中執(zhí)行某個方法,如何做? 并做簡單說明
答:用代理執(zhí)行代理方法
說明:在b類中實現(xiàn)協(xié)議方法,設(shè)置a的代理為b,在指定方法內(nèi)調(diào)用代理的協(xié)議方法

45.類別的作用?
答案:category 可以在不獲悉,不改變原來代碼的情況下往里面添加新的方法,只能添加,不能刪除修改。 并且如果類別和原來類中的方法產(chǎn)生名稱沖突,則類別將覆蓋原來的方法,因為類別具有更高的優(yōu)先級。
類別主要有3個作用: (1)將類的實現(xiàn)分散到多個不同文件或多個不同框架中。 (2)創(chuàng)建對私有方法的前向引用。 (3)向?qū)ο筇砑臃钦絽f(xié)議。

46.簡述extern C的作用
答:可以在 C++中使用 C 的已編譯好的函數(shù)模塊,在 c++中么用到 c 語言寫的函數(shù),聲明一下,在 DLL 中經(jīng)常看到,避免 C++ name mangling,主要用于動態(tài)鏈接庫, 使得導(dǎo)出函數(shù)名稱與 C 語言規(guī)則一致(不改變),方便不同的編譯器甚至是不 同的開發(fā)語言調(diào)用。
extern "C"是告訴C++編譯器以C Linkage方式編譯,也就是抑制C++的name mangling機(jī)制。

編程:
1.寫出@proerty(nonatomic,retain)Person *person;@synthesize person 具體實現(xiàn)。

- (void)setPerson:(Person *)person
{
    if(_person != person){
        [_person release];
        [_person = person retain];
    } 
}

- (Person *)person
{
    return _person;
}

2.從普通 id 類型對象轉(zhuǎn)換成數(shù)字對象,因為配置了限定詞.1f,所以結(jié)果四舍 五入,并保留一位小數(shù)

NSDictionary* rowData = [NSDictionary dictionaryWithObjectsAndKeys:@"46.95",@"price",nil];
NSLog(@"a double value:%.1f",[(NSNumber*)[rowData objectForKey:@"price"] doubleValue]);

輸出:
a double value:47.0

3.寫一個委托的interface

#import
@protocol MyDelegate;//聲明 
@interface MyClass:NSObject 
{
     id delegate;
}
@end
@protocol MyDelegate//委托方法 
-(void) selector:(NSString *) args; 
@end

4.請看下面一段代碼

static int a=1;
int main(){
    int b=2;
    char* c=NUll;
    c=(char*)malloc(100*sizeof(char));
    return 0;
}

問:1.訪問abc三者的效率從高到低依次是 :
bca
2.在最壞情況下排序速度最快的是:歸并排序
復(fù)雜度最高的是:快排 a,快排,冒泡,堆,歸并

5.看下面的程序

    NSMutableArray *arr = [[NSMutableArray array] retain];
    NSString *str = [NSString stringWithFormat:@"test"];
    [str retain];
    [arr addObject:str];
    NSLog(@"%@%lu",str,[str retainCount]);
    [str retain];
    [str release];
    [str release];
    NSLog(@"%@%lu",str,[str retainCount]);
    [arr removeObject:str];
    NSLog(@"%@%lu",str,[str retainCount]);

請問:三次打印的retainCount分別是什么,為什么?
答:分別是3,2,1,
初始化的時候的為1,retain的時候+1,往數(shù)組里add的時候+1,release的時候 -1,從數(shù)組里移除的時候 -1。

語言

  1. 請簡述你對協(xié)議的理解
  2. 如何理解ARC自動引用計數(shù)機(jī)制
  3. 如何理解 retain/copy/assign/release/autor elease/dealloc關(guān)鍵字
  4. 請簡述self.name = xxx 與_name= xxx 的區(qū)別
  5. 請簡述類別和繼承有什么聯(lián)系和區(qū)別
  6. 請簡述你對strong和weak關(guān)鍵字的理 解
  7. 請簡述weak和assgin有什么區(qū)別
  8. 如何實現(xiàn)ARC和MRC的混合編程
  9. Objective-c中是否支持多繼承
  10. Objective-c中變量默認(rèn)是私有的 嗎,方法默認(rèn)是私有的嗎
  11. #import"".h和@class+類名的區(qū)別
  12. 請簡述頁面?zhèn)髦刀加心男崿F(xiàn)方式
  13. 請簡述深拷貝和淺拷貝的區(qū)別

設(shè)計模式

  1. 系統(tǒng)中有哪些對象是單例
  2. 請簡述你對MVC設(shè)計模式的理解
  3. iOS中哪些技術(shù)符合觀察者模式
  4. 請簡述你對工廠方法的理解
  5. 什么是代理模式,實現(xiàn)代理需要注意什么

UI

  1. 請簡述StoryBoard和Xib的聯(lián)系和區(qū)別
  2. 請簡述UITableView對Cell的重用機(jī) 制
  3. 如何使用UIScrollView實現(xiàn)無限加載 多張圖片
  4. 請簡述視圖控制器的生命周期
  5. UITableView有哪些優(yōu)化方式
  6. 請簡述iOS中的事件傳遞機(jī)制
  7. UITableView有哪些必須要實現(xiàn)的數(shù) 據(jù)源方法

網(wǎng)絡(luò)

  1. 請簡述Http協(xié)議中g(shù)et請求和post請求的區(qū)別
  2. 請簡述你對異步請求數(shù)據(jù)的理解
  3. iOS中都有哪些技術(shù)可以實現(xiàn)開辟線 程,它們的聯(lián)系和區(qū)別是什么
  4. NSThread中線程之間是如何實現(xiàn)通信 的
  5. CGD中有哪些創(chuàng)建線程的方式
  6. iOS中有哪些技術(shù)可以保證線程安全
  7. ASIHttpRequest的父類是什么
  8. 請簡述AFNetWork的實現(xiàn)原理
  9. 你如何理解block,block有什么用途
  10. 請簡述TCP和UDP的區(qū)別
  11. 請問怎樣能夠保證定位更省電
  12. 請簡述SDWebImage的實現(xiàn)原理
  13. 請簡述xml和json數(shù)據(jù)各有哪些優(yōu)勢
  14. 請簡述線程和進(jìn)程有什么聯(lián)系和區(qū)別

數(shù)據(jù)操作

  1. 請簡述NSUserDefaults的使用場景和 使用注意事項
  2. iOS中數(shù)據(jù)庫使用什么技術(shù)實現(xiàn)的
  3. 請簡述什么是主鍵、什么是外鍵
  4. iOS中如何實現(xiàn)數(shù)據(jù)模型的存儲
  5. 請簡述iOS的沙盒機(jī)制

項目

  1. 如何實現(xiàn)真機(jī)調(diào)試

  2. 如何查找項目中的內(nèi)存泄露

  3. 項目中的支付環(huán)節(jié)如何實現(xiàn)的

  4. 如何實現(xiàn)項目上線到AppStore

  5. 請簡述你在項目中遇到過哪些問題,如何解決的

  6. 如何實現(xiàn)流媒體格式的視頻邊播放,邊緩存

  7. 請簡述你理解的內(nèi)存管理

  8. 請簡述你理解的面向?qū)ο笏枷?/p>

  9. 如何設(shè)計一個緩存類

  10. 談?wù)勀銓λ{(lán)牙技術(shù)的了解

  11. IOS8.0都有哪些新特性

  12. 什么是懶加載?

  13. 在ARC下發(fā)生內(nèi)存泄露怎么處理

  14. GCD(異步的Block)中self.的處理

  15. APNS 推送的實現(xiàn)過程

  16. 添加NSNotificationCenter 監(jiān) 聽,其后面的 object 的意義是什么?

  17. 談iOS的常用加密方式,以及各方 式的優(yōu)劣

  18. 論Socket 和http協(xié)議的區(qū)別

  19. iOS中數(shù)據(jù)的持久化存儲方式有哪 些

  20. 什么是kvc/kvo 及它們之間有什么 關(guān)系

  21. iOS中frame和bounds的區(qū)別

  22. 服務(wù)器連接三次握手。

  23. GCD有哪三種隊列和用法。

  24. CALayer的和UIView和繪圖API 的關(guān)系。

  25. 介紹動畫矩陣變換算法。

面試題#

  1. When to use NSMutableArray and when to use NSArray?
    答:當(dāng)數(shù)組在程序運(yùn)行時需要不斷變化的,使用NSMutableArray;當(dāng)數(shù)組在初始化后不再改動的,使用NSArray。
    需要指出的是,使用NSArray只表明的是該數(shù)組在運(yùn)行時不發(fā)生改變,即不能往NSAarry的數(shù)組里添加或刪除元素,但不表明其數(shù)組內(nèi)元素的內(nèi)容不能發(fā)生改變。NSArray是線程安全的,NSMutableArray不是線程安全的,多線程使用到NSMutableArray需要注意。

  2. Give us example of what are delegate methods and what are data source methods of uitableview.
    答:CocoaTouch框架中用到了大量委托,其中UITableViewDelegate就是委托機(jī)制的典型應(yīng)用,是一個典型的使用委托來實現(xiàn)適配器模式,其中UITableViewDelegate協(xié)議是目標(biāo),tableview是適配器,實現(xiàn)UITableViewDelegate協(xié)議,并將自身設(shè)置為talbeview的delegate的對象,是被適配器,一般情況下該對象是UITableViewController。
    UITableVIew的Data Source方法有- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

  3. How many autorelease you can create in your application? Is there any limit?
    在應(yīng)用中可以創(chuàng)建多少autorelease對象,是否有限制?
    答案:

  4. If we don’t create any autorelease pool in our application then is there any autorelease pool already provided to us?
    如果我們不創(chuàng)建內(nèi)存池,是否有內(nèi)存池提供給我們?
    答案:界面線程維護(hù)著自己的內(nèi)存池,用戶自己創(chuàng)建的數(shù)據(jù)線程,則需要創(chuàng)建該線程的內(nèi)存池

  5. When you will create an autorelease pool in your application?
    什么時候需要在程序中創(chuàng)建內(nèi)存池?
    答案:用戶自己創(chuàng)建的數(shù)據(jù)線程,則需要創(chuàng)建該線程的內(nèi)存池

  6. When retain count increase?
    什么時候內(nèi)存計數(shù)會增加?
    答案:見iOS面試題(一)

  7. What are commonly used NSObject class methods?
    類NSObject的那些方法經(jīng)常被使用?
    答案:NSObject是Objetive-C的基類,其由NSObject類及一系列協(xié)議構(gòu)成。
    其中類方法alloc、class、 description 對象方法init、dealloc、– performSelector:withObject:afterDelay:等經(jīng)常被使用

  8. What is convenience constructor?
    什么是簡便構(gòu)造方法?
    答案:簡便構(gòu)造方法一般由CocoaTouch框架提供,如NSNumber的 + numberWithBool: + numberWithChar: + numberWithDouble: + numberWithFloat: + numberWithInt:
    Foundation下大部分類均有簡便構(gòu)造方法,我們可以通過簡便構(gòu)造方法,獲得系統(tǒng)給我們創(chuàng)建好的對象,并且不需要手動釋放。

  9. How to design universal application in Xcode?
    如何使用Xcode設(shè)計通用應(yīng)用?
    答案:使用MVC模式設(shè)計應(yīng)用,其中Model層完成脫離界面,即在Model層,其是可運(yùn)行在任何設(shè)備上,在controller層,根據(jù)iPhone與iPad(獨有UISplitViewController)的不同特點選擇不同的viewController對象。在View層,可根據(jù)現(xiàn)實要求來設(shè)計,其中以xib文件設(shè)計時,其設(shè)置其為universal。

  10. What is keyword atomic in Objective C?
    在Objetive-C什么是原子關(guān)鍵字
    答案:atomic,nonatomic見iOS面試題(一)

  11. What are UIView animations?
    UIView的動畫效果有那些?
    答案:有很多,如 UIViewAnimationOptionCurveEaseInOut UIViewAnimationOptionCurveEaseIn UIViewAnimationOptionCurveEaseOut UIViewAnimationOptionTransitionFlipFromLeft UIViewAnimationOptionTransitionFlipFromRight UIViewAnimationOptionTransitionCurlUpUIViewAnimationOptionTransitionCurlDown

  12. How can you store data in iPhone applications?
    在iPhone應(yīng)用中如何保存數(shù)據(jù)?
    答案:有以下幾種保存機(jī)制:
    1.通過web服務(wù),保存在服務(wù)器上
    2.通過NSCoder固化機(jī)制,將對象保存在文件中
    3.通過SQlite或CoreData保存在文件數(shù)據(jù)庫中

  13. What is coredata?
    什么是coredata?
    答案:coredata框架是apple提供的一套通用自動的解決方案,包括了對象生存周期、對象關(guān)系圖、持久化機(jī)制。
    補(bǔ)充答案:上面是翻譯的,按我個人理解coredata提供一種機(jī)制,讓我們可以方便的把內(nèi)存中對象、及對象間的關(guān)系映射到coredata,然后由它為我們持久化數(shù)據(jù)。相比普通的文件數(shù)據(jù)庫SQlite,它的功能更強(qiáng)大,不需要我們先將對象數(shù)據(jù)format成SQL語句,存入數(shù)據(jù)庫,再用select語句讀出,而現(xiàn)在是從內(nèi)存到coredata的數(shù)據(jù)管理,我們只需管理coredata的managed對象。是蘋果提供一套數(shù)據(jù)保存

  14. What is NSManagedObject model?
    什么是NSManagedObject模型?
    答案:NSManagedObject是NSObject的子類 ,也是coredata的重要組成部分,它是一個通用的類,實現(xiàn)了core data 模型層所需的基本功能,用戶可通過子類化NSManagedObject,建立自己的數(shù)據(jù)模型。

  15. What is NSManagedobjectContext?
    什么是NSManagedobjectContext?
    答案:NSManagedobjectContext對象負(fù)責(zé)應(yīng)用和數(shù)據(jù)庫之間的交互。

  16. What is predicate?
    什么是謂詞?
    答案:謂詞是通過NSPredicate,是通過給定的邏輯條件作為約束條件,完成對數(shù)據(jù)的篩選。

    predicate = [NSPredicate predicateWithFormat:@"customerID == %d",n];
    a = [customers filteredArrayUsingPredicate:predicate];
    
  17. What kind of persistence store we can use with coredata?
    coredata有哪幾種持久化存儲機(jī)制?
    答案:coredatat提供以下幾種存儲機(jī)制:XML(iOS系統(tǒng)不支持),自動存儲,SQLite,內(nèi)存存儲。
    補(bǔ)充說明:這個問題問的是,coredate框架的存儲機(jī)制,平時使用coredata時,更多關(guān)注的是managed的對象,這里是coerdata框架的存儲實現(xiàn)細(xì)節(jié)。BTW: 其他常用的持久化存儲方法 :存入到文件、 存入到NSUserDefaults(系統(tǒng)plist文件中)。

  18. 談?wù)剬lock的理解? 并寫出一個使用Block執(zhí)行UIView動畫?
    答:Block是可以獲取其他函數(shù)局部變量的匿名函數(shù),其不但方便開發(fā),并且可以大幅度提高應(yīng)用的執(zhí)行效率(多核心CPU可直接處理Block指令)

[UIView transitionWithView:self.view duration:0.2 options:UIViewAnimationOptionTransitionFlipFromLeft animation:^{
    [[blueViewController view] removeFromSuperview];
    [[self view] insertSubview:yellowViewController.view atIndex:0];
} completion:NULL];
  1. 寫出上面代碼的Block的定義
    答:
typedef void (^animations)(void);
typedef void (^completion)(BOOL finished);
  1. 試著使用+ beginAnimations:context:以及上述Block的定義,寫出一個可以完成+ (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(4_0);操作的函數(shù)執(zhí)行部分
    答案:無

  2. 做過的項目是否涉及網(wǎng)絡(luò)訪問功能,使用什么對象完成網(wǎng)絡(luò)功能?
    答案:ASIHTTPRequest與NSURLConnection

  3. 簡單介紹下NSURLConnection類及+ sendSynchronousRequest:returningResponse:error:– initWithRequest:delegate:兩個方法的區(qū)別?
    答案:NSURLConnection主要用于網(wǎng)絡(luò)訪問,其中+ sendSynchronousRequest:returningResponse:error:是同步訪問數(shù)據(jù),即當(dāng)前線程會阻塞,并等待request的返回的response,而– initWithRequest:delegate:使用的是異步加載,當(dāng)其完成網(wǎng)絡(luò)訪問后,會通過delegate回到主線程,并其委托的對象。

  4. Difference between shallow copy and deep copy?
    淺復(fù)制和深復(fù)制的區(qū)別?
    答案:淺復(fù)制:只復(fù)制指向?qū)ο蟮闹羔槪粡?fù)制引用對象本身。
    深復(fù)制:復(fù)制引用對象本身。
    意思就是有個對象A,復(fù)制一份得到A_copy對象后,對于淺復(fù)制來說,A和A_copy指向的是同一個內(nèi)存資源,復(fù)制的只不過是一個指針,對象本身資源
    還是只有一份,那如果我們對A_copy執(zhí)行了修改操作,那么發(fā)現(xiàn)A引用的對象同樣被修改,這其實違背了我們復(fù)制拷貝的一個思想。深復(fù)制就好理解了,內(nèi)存中存在了兩份獨立對象本身。
    用網(wǎng)上一哥們通俗的話將就是:
    淺復(fù)制好比你和你的影子,你完蛋,你的影子也完蛋
    深復(fù)制好比你和你的克隆人,你完蛋,你的克隆人還活著。

  5. What is advantage of categories? What is difference between implementing a category and inheritance?
    類別的作用?繼承和類別在實現(xiàn)中有何區(qū)別?
    答案:category 可以在不獲悉,不改變原來代碼的情況下往里面添加新的方法,只能添加,不能刪除修改。并且如果類別和原來類中的方法產(chǎn)生名稱沖突,則類別將覆蓋原來的方法,因為類別具有更高的優(yōu)先級。
    類別主要有3個作用:
    (1)將類的實現(xiàn)分散到多個不同文件或多個不同框架中。
    (2)創(chuàng)建對私有方法的前向引用。
    (3)向?qū)ο筇砑臃钦絽f(xié)議。
    繼承可以增加,擴(kuò)展父類方法,并且可以增加屬性。

  6. Difference between categories and extensions?
    類別和類擴(kuò)展的區(qū)別?
    答案:category和extensions的不同在于后者可以添加屬性。另外后者添加的方法是必須要實現(xiàn)的。
    extensions可以認(rèn)為是一個私有的Category。

  7. Difference between protocol in objective c and interfaces in java?
    oc中的協(xié)議和java中的接口概念有何不同?
    答案:OC中的協(xié)議有2層含義,官方定義為 formal和informal protocol。前者和Java接口一樣。
    informal protocol中的方法屬于設(shè)計模式考慮范疇,不是必須實現(xiàn)的,但是如果有實現(xiàn),就會改變類的屬性。
    其實關(guān)于正式協(xié)議,類別和非正式協(xié)議我很早前學(xué)習(xí)的時候大致看過,也寫在了學(xué)習(xí)教程里
    “非正式協(xié)議概念其實就是類別的另一種表達(dá)方式“這里有一些你可能希望實現(xiàn)的方法,你可以使用他們更好的完成工作”。
    這個意思是,這些是可選的。比如我門要一個更好的方法,我們就會申明一個這樣的類別去實現(xiàn)。然后你在后期可以直接使用這些更好的方法。
    這么看,總覺得類別這玩意兒有點像協(xié)議的可選協(xié)議。"
    現(xiàn)在來看,其實protocal已經(jīng)開始對兩者都統(tǒng)一和規(guī)范起來操作,因為資料中說“非正式協(xié)議使用interface修飾“,
    現(xiàn)在我們看到協(xié)議中兩個修飾詞:“必須實現(xiàn)(@requied)”和“可選實現(xiàn)(@optional)”。
    OC中的協(xié)議(formal protocol)與java中的接口概念基本一致,OC中非正式協(xié)議(informal protocol)就是類別。在java中如果繼承了接口,但不實現(xiàn)其方法,會得到一個error(無法編譯);在OC中的正式協(xié)議,如果不實現(xiàn),會得到一個warning(可編譯執(zhí)行),如果想去除waring,還可以加關(guān)鍵字(@optional),讓它可選實現(xiàn)方法。

  8. What are KVO and KVC?
    答案:kvc:鍵 - 值編碼是一種間接訪問對象的屬性使用字符串來標(biāo)識屬性,而不是通過調(diào)用存取方法,直接或通過實例變量訪問的機(jī)制。
    很多情況下可以簡化程序代碼。apple文檔其實給了一個很好的例子。
    kvo:鍵值觀察機(jī)制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。
    具體用到過的一個地方是對于按鈕點擊變化狀態(tài)的的監(jiān)控。
    比如我自定義的一個button

    [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]; 
      } 
    }
    

對于系統(tǒng)是根據(jù)keypath去取的到相應(yīng)的值發(fā)生改變,理論上來說是和kvc機(jī)制的道理是一樣的。
對于kvc機(jī)制如何通過key尋找到value:
“當(dāng)通過KVC調(diào)用對象時,比如:[self valueForKey:@”someKey”]時,程序會自動試圖通過幾種不同的方式解析這個調(diào)用。首先查找對象是否帶有 someKey 這個方法,如果沒找到,會繼續(xù)查找對象是否帶有someKey這個實例變量(iVar),如果還沒有找到,程序會繼續(xù)試圖調(diào)用 -(id) valueForUndefinedKey:這個方法。如果這個方法還是沒有被實現(xiàn)的話,程序會拋出一個NSUndefinedKeyException異常錯誤。
(cocoachina.com注:Key-Value Coding查找方法的時候,不僅僅會查找someKey這個方法,還會查找getsomeKey這個方法,前面加一個get,或者_(dá)someKey以及_getsomeKey這幾種形式。同時,查找實例變量的時候也會不僅僅查找someKey這個變量,也會查找_someKey這個變量是否存在。)
設(shè)計valueForUndefinedKey:方法的主要目的是當(dāng)你使用-(id)valueForKey方法從對象中請求值時,對象能夠在錯誤發(fā)生前,有最后的機(jī)會響應(yīng)這個請求。這樣做有很多好處,下面的兩個例子說明了這樣做的好處。“
來至cocoa,這個說法應(yīng)該挺有道理。
因為我們知道button卻是存在一個highlighted實例變量.因此為何上面我們只是add一個相關(guān)的keypath就行了,
可以按照kvc查找的邏輯理解,就說的過去了。

  1. What is purpose of delegates?
    代理的作用?
    答案:代理的目的是改變或傳遞控制鏈。允許一個類在某些特定時刻通知到其他類,而不需要獲取到那些類的指針。可以減少框架復(fù)雜度。
    另外一點,代理可以理解為java中的回調(diào)監(jiān)聽機(jī)制的一種類似。

  2. What are mutable and immutable types in Objective C?
    oc中可修改和不可以修改類型。
    答案:可修改不可修改的集合類。這個我個人簡單理解就是可動態(tài)添加修改和不可動態(tài)添加修改一樣。
    比如NSArray和NSMutableArray。前者在初始化后的內(nèi)存控件就是固定不可變的,后者可以添加等,可以動態(tài)申請新的內(nèi)存空間。

  3. When we call objective c is runtime language what does it mean?
    我們說的oc是動態(tài)運(yùn)行時語言是什么意思?
    答案:多態(tài)。 主要是將數(shù)據(jù)類型的確定由編譯時,推遲到了運(yùn)行時。
    這個問題其實淺涉及到兩個概念,運(yùn)行時和多態(tài)。
    簡單來說,運(yùn)行時機(jī)制使我們直到運(yùn)行時才去決定一個對象的類別,以及調(diào)用該類別對象指定方法。
    多態(tài):不同對象以自己的方式響應(yīng)相同的消息的能力叫做多態(tài)。意思就是假設(shè)生物類(life)都用有一個相同的方法-eat;
    那人類屬于生物,豬也屬于生物,都繼承了life后,實現(xiàn)各自的eat,但是調(diào)用是我們只需調(diào)用各自的eat方法。
    也就是不同的對象以自己的方式響應(yīng)了相同的消息(響應(yīng)了eat這個選擇器)。
    因此也可以說,運(yùn)行時機(jī)制是多態(tài)的基礎(chǔ)?

  4. what is difference between NSNotification and protocol?
    通知和協(xié)議的不同之處?
    答案:協(xié)議有控制鏈(has-a)的關(guān)系,通知沒有。
    首先我一開始也不太明白,什么叫控制鏈(專業(yè)術(shù)語了~)。但是簡單分析下通知和代理的行為模式,我們大致可以有自己的理解
    簡單來說,通知的話,它可以一對多,一條消息可以發(fā)送給多個消息接受者。
    代理按我們的理解,到不是直接說不能一對多,比如我們知道的明星經(jīng)濟(jì)代理人,很多時候一個經(jīng)濟(jì)人負(fù)責(zé)好幾個明星的事務(wù)。
    只是對于不同明星間,代理的事物對象都是不一樣的,一一對應(yīng),不可能說明天要處理A明星要一個發(fā)布會,代理人發(fā)出處理發(fā)布會的消息后,別稱B的
    發(fā)布會了。但是通知就不一樣,他只關(guān)心發(fā)出通知,而不關(guān)心多少接收到感興趣要處理。
    因此控制鏈(has-a從英語單詞大致可以看出,單一擁有和可控制的對應(yīng)關(guān)系。

  5. What is push notification?
    什么是推送消息?
    答案:太簡單,不作答~~~~~~~~~~
    這是cocoa上的答案。
    其實到不是說太簡單,只是太泛泛的一個概念的東西。就好比說,什么是人。
    推送通知更是一種技術(shù)。
    簡單點就是客戶端獲取資源的一種手段。
    普通情況下,都是客戶端主動的pull。
    推送則是服務(wù)器端主動push。

  6. Polymorphism?
    關(guān)于多態(tài)性
    答案:多態(tài),父類指針指向子類對象。
    這個題目其實可以出到一切面向?qū)ο笳Z言中,
    因此關(guān)于多態(tài),繼承和封裝基本最好都有個自我意識的理解,也并非一定要把書上資料上寫的能背出來。
    最重要的是轉(zhuǎn)化成自我理解。

  7. Singleton?
    對于單例的理解
    答案:11,12題目其實出的有點泛泛的感覺了,可能說是編程語言需要或是必備的基礎(chǔ)。
    基本能用熟悉的語言寫出一個單例,以及可以運(yùn)用到的場景或是你編程中碰到過運(yùn)用的此種模式的框架類等。
    進(jìn)一步點,考慮下如何在多線程訪問單例時的安全性。

  8. What is responder chain?
    說說響應(yīng)鏈
    答案: 事件響應(yīng)鏈。包括點擊事件,畫面刷新事件等。在視圖棧內(nèi)從上至下,或者從下之上傳播。
    可以說點事件的分發(fā),傳遞以及處理。具體可以去看下touch事件這塊。因為問的太抽象化了
    嚴(yán)重懷疑題目出到越后面就越籠統(tǒng)。
    可以從責(zé)任鏈模式,來講通過事件響應(yīng)鏈處理,其擁有的擴(kuò)展性

  9. Difference between frame and bounds?
    frame和bounds有什么不同?
    答案:frame指的是:該view在父view坐標(biāo)系統(tǒng)中的位置和大小。(參照點是父親的坐標(biāo)系統(tǒng))
    bounds指的是:該view在本身坐標(biāo)系統(tǒng)中 的位置和大小。(參照點是本身坐標(biāo)系統(tǒng))

  10. Difference between method and selector?
    方法和選擇器有何不同?
    答案:selector是一個方法的名字,method是一個組合體,包含了名字和實現(xiàn).
    詳情可以看apple文檔。

  11. Is there any garbage collection mechanism in Objective C.?
    OC的垃圾回收機(jī)制?
    答案: OC2.0有Garbage collection,但是iOS平臺不提供。
    一般我們了解的objective-c對于內(nèi)存管理都是手動操作的,但是也有自動釋放池。
    但是差了大部分資料,貌似不要和arc機(jī)制搞混就好了。
    求更多~~

  12. NSOperation queue?
    答案:存放NSOperation的集合類。
    操作和操作隊列,基本可以看成java中的線程和線程池的概念。用于處理ios多線程開發(fā)的問題。
    網(wǎng)上部分資料提到一點是,雖然是queue,但是卻并不是帶有隊列的概念,放入的操作并非是按照嚴(yán)格的先進(jìn)現(xiàn)出。
    這邊又有個疑點是,對于隊列來說,先進(jìn)先出的概念是Afunc添加進(jìn)隊列,Bfunc緊跟著也進(jìn)入隊列,Afunc先執(zhí)行這個是必然的,
    但是Bfunc是等Afunc完全操作完以后,B才開始啟動并且執(zhí)行,因此隊列的概念理論上有點違背了多線程處理這個概念。
    但是轉(zhuǎn)念一想其實可以參考銀行的取票和叫號系統(tǒng)。
    因此對于A比B先排隊取票但是B率先執(zhí)行完操作,我們亦然可以感性認(rèn)為這還是一個隊列。
    但是后來看到一票關(guān)于這操作隊列話題的文章,其中有一句提到
    “因為兩個操作提交的時間間隔很近,線程池中的線程,誰先啟動是不定的。”
    瞬間覺得這個queue名字有點忽悠人了,還不如pool~
    綜合一點,我們知道他可以比較大的用處在于可以幫助多線程編程就好了。
    樓上區(qū)分了線程執(zhí)行時的次序(Afunc和Bfunc誰先啟動)和線程執(zhí)行完成(Afunc和Bfunc誰先執(zhí)行完)時的次序不同,而多線程的重要概念是并發(fā)(同時執(zhí)行多個任務(wù)),NSOperationQueue是管理并發(fā)線程的對象,可以在其中放入NSOpertation對象(對象化的線程實體),通過設(shè)置maxConcurrentOperationCount的大小,控制并發(fā)數(shù)目,如樓上所說希望“Afunc添加進(jìn)隊列,執(zhí)行完后,Bfunc緊跟進(jìn)入隊列,繼續(xù)執(zhí)行”,那只需將maxConcurrentOperationCount設(shè)為1,變會依次執(zhí)行,這時候?qū)嶋H是在單線程依次執(zhí)行。所以這里的NSOperationQueue就是對象化抽象的去管理多線程,這樣的好處,使用者通過繼承NSOperation對象,可以方便的用對象來管理線程,而不再用關(guān)心線程同步、信號量等細(xì)節(jié),更多地關(guān)注于業(yè)務(wù)邏輯。

  13. What is lazy loading?
    答案:懶漢模式,只在用到的時候才去初始化。
    也可以理解成延時加載。
    我覺得最好也最簡單的一個列子就是tableView中圖片的加載顯示了。
    一個延時載,避免內(nèi)存過高,一個異步加載,避免線程堵塞。

  14. Can we use two tableview controllers on one viewcontroller?
    是否在一個視圖控制器中嵌入兩個tableview控制器?
    答案:一個視圖控制只提供了一個View視圖,理論上一個tableViewController也不能放吧,
    只能說可以嵌入一個tableview視圖。當(dāng)然,題目本身也有歧義,如果不是我們定性思維認(rèn)為的UIViewController,
    而是宏觀的表示視圖控制者,那我們倒是可以把其看成一個視圖控制者,它可以控制多個視圖控制器,比如TabbarController
    那樣的感覺。

  15. Can we use one tableview with two different datasources? How you will achieve this?
    一個tableView是否可以關(guān)聯(lián)兩個不同的數(shù)據(jù)源?你會怎么處理?
    答案:首先我們從代碼來看,數(shù)據(jù)源如何關(guān)聯(lián)上的,其實是在數(shù)據(jù)源關(guān)聯(lián)的代理方法里實現(xiàn)的。
    因此我們并不關(guān)心如何去關(guān)聯(lián)他,他怎么關(guān)聯(lián)上,方法只是讓我返回根據(jù)自己的需要去設(shè)置如相關(guān)的數(shù)據(jù)源。
    因此,我覺得可以設(shè)置多個數(shù)據(jù)源啊,但是有個問題是,你這是想干嘛呢?想讓列表如何顯示,不同的數(shù)據(jù)源分區(qū)塊顯示?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,406評論 6 538
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,034評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,413評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,449評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,165評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,559評論 1 325
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,606評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,781評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,327評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,084評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,278評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,849評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,495評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,927評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,172評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,010評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,241評論 2 375

推薦閱讀更多精彩內(nèi)容

  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,197評論 30 471
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,726評論 18 399
  • 注:此文章來源:Job_Yang 的簡書 1. Object-c的類可以多重繼承么?可以實現(xiàn)多個接口么?Categ...
    廣益散人閱讀 1,360評論 0 13
  • 轉(zhuǎn):http://www.cocoachina.com/programmer/20151019/13746.htm...
    Style_偉閱讀 1,329評論 0 3