C 部分
1.static 關鍵字的作用?
- 第一個作用:隱藏。 當我們同時編譯多個文件時,所有未加static前綴的全局變量和函數都具有全局可見性。
- static的第二個作用是保持變量內容的持久。存儲在靜態數據區的變量會在程序剛開始運行時就完成初始化,也是唯一的一次初始化。共有兩種變量存儲在靜態存儲區:全局變量和static變量,只不過和全局變量比起來, static可以控制變量的可見范圍,說到底static還是用來隱藏的。
- static的第三個作用是默認初始化為0。其實全局變量也具備這一屬性, 因為全局變量也存儲在靜態數據區。在靜態數據區,內存中所有的字節默認值都是0x00,某些時候這一特點可以減少程序員的工作量。
2.線程與進程的區別和聯系?
一個進程可以由一個或者多個線程組成, 進程和程序并不是一一對應的,一個程序執行在不同的數據集上就成為不同的 進程,可以用進程控制塊來唯一地標識每個進程。而這一點正是程序無法做到的,由于程序沒有和數據產生直接的聯系,既使是執行不同的數據的程序,他們的指令的集合依然是一樣的,所以無法唯一地標識出這些運行于不同數據集上的程序。一般來說,一個進程肯定有一個與之對應的程序,而且只有一個。而一個程序有可能沒有與之對應的進程(因為它沒有執行),也有可能有多個進程與之對應(運行在幾個不同的數據集上)。
3.堆和棧的區別?
- 棧區(stack)― 由編譯器自動分配釋放,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的棧。
- 堆區(heap) ― 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。
4.C語言如何判斷兩個單向無環鏈表是否相交?
只需判斷兩個鏈表的尾節點地址是否相同,相同則相交,不同則不相交
5.程序在內存中運行時,內存分幾個區,各自用途?
- 棧 --有編譯器自動分配釋放。
- 堆 -- 一般由程序員分配釋放,若程序員不釋放,程序結束時可能由 OS 回收
- 全局區(靜態區) -- 全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域,未初始 化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。程序結束釋放。
- 另外還有一個專門放常量的地方。程序結束釋放。
6.引用與指針有什么區別?
指針指向一塊內存,它的內容是所指內存的地址;引用是某塊內存的別名
- 指針是一個實體,而引用僅是個別名;
- 引用使用時無需解引用(*),指針需要解引用;
- 引用只能在定義時被初始化一次,之后不可變;指針可變;
- 引用沒有 const,指針有 const;
- 引用不能為空,指針可以為空;
- “sizeof 引用”得到的是所指向的變量(對象)的大小,而“sizeof指針”得到的是指針本身(所指向的變量或對象的地址)的大小;
- 指針和引用的自增(++)運算意義不一樣;
- 從內存分配上看:程序為指針變量分配內存區域,而引用不需要分配內存區域。
7.編程:
1.請問運行完Test函數后,會有什么樣的結果。
(1)
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
請問運行Test函數會有什么樣的結果?
答:程序崩潰。
因為GetMemory并不能傳遞動態內存, Test函數中的 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);
}
請問運行Test函數會有什么樣的結果?
答:可能是亂碼。
因為GetMemory返回的是指向“棧內存”的指針,該指針的地址不是 NULL,但其原先的內容已經被清除,新內容不可知。
(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);
}
請問運行Test函數會有什么樣的結果?
答:
(1)能夠輸出hello
(2)內存泄漏
(4)
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
請問運行Test函數會有什么樣的結果?
答:篡改動態內存區的內容,后果難以預料,非常危險。 因為free(str);之后,str成為野指針,if(str != NULL)語句不起作用。
2.編寫strcpy函數
已知strcpy函數的原型是 char *strcpy(char *strDest, const char *strSrc);
其中strDest
是目的字符串,strSrc
是源字符串。
(1)不調用C++/C的字符串庫函數,請編寫函數 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的內容復制到strDest,為什么還要char * 類型的返回值?
答:為了實現鏈式表達式。
例如
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.完成下面函數以實現使用輾轉相除法獲取兩個數(假設兩個數都大于0)的最大公約數
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.用嵌套方式寫一個函數,函數返回N的階層,要求盡量寫完整
int fun(int n)
{
if (n == 1)
return n;
return n * fun(n - 1);
}
6.請寫出下列數據類型的范圍 char, unsigned char, short, int
答:
char (-127~128) unsigned char(0~255) short(-2^16-1 ~2^16)
int(-32768~32767)
7.請寫出下面函數的返回值
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.請計算下列結構所占字節數
Typedef structYouKnow
{
int id;
short age;
char level;
}
答:8
9.關鍵字 const 有什么含義?
const 修飾誰,誰在整個程序運行過程中不能變
10.下方代碼輸出結果為
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++實現冒泡排序
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.用嵌套的方式寫一個函數,該函數返回 N 的階乘(N!=12..*N)
int func(int n)
{
if (n==1) return 1;
return n * func(n-1);
}
OC
1.Objective-C可以實現多繼承嗎?可以實現多個接口嗎?Category是什么?重寫一個類的方式是用繼承好還是用分類好?為什么?
2.OC使用協議實現多繼承,可以遵守多個協議實現多接口。category是OC中的類別,類別是用于給一個現有類添加新方法。重寫類一般采用繼承的方式,分類(類別)在給以個類添加同名方法后,會造成原有類中方法的失效,而繼承重寫的方法,依然可以在使用父類對象調用該方法。
3.定義屬性的時候,什么時候使用retain/copy/assign?寫一個setter方法, 用于完成@property(nonatomic,retain) NSString* name; 寫一個setter方法, 用于完成@property(nonatomic,copy) NSString* name;
答:retain 用于保留對象的引用計數,在使用retain聲明的屬性做賦值的時候,成員變量指針會保留被賦值對象的引用計數。
copy 聲明的屬性,在使用屬性賦值的時候會,成員指針會指向新副本,這個副本是一個不可變副本,不論賦值對象是不是可變的。
assign 用于基本數據類型的屬性聲明,不涉及到內存管理的問題,也是缺省參數
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 一般在需要隨時更改數組結構的時候使用 NSArray 一般用于保存一些不需要修改邏輯的數據
5.實現字符串“I LOVE CHINA”反串成“CHINA LOVE I”
6..pch 文件的作用
答:.pch 表示"precompiled header",這是一個你工程要用到的來自于外部框架的頭文件列表。Xcode 將編譯這些頭文件,這將減少你在選擇 Build 或 Build and Go 時編譯項目的時間。通常用到的頭文件已經自動包含了 pch,系統編譯每個 cpp 文件前,都會先 include 這個文件。這樣就節省了添加include 的時間,相當于加速編譯。還可以在這里面放入宏,在整個工程中都可以用。
7.怎樣解決重復編譯
#ifndef _DEBUG
#ifdef USE_MYLIB ......
#endif
8.awakeFromNib 與 viewDidLoad 區別
答:
awakeFromNib
當.nib 文件被加載的時候,會發送一個 awakeFromNib 的消息到.nib 文件中的每個對象,每個對象都可以定義自己的 awakeFromNib 函數來響應這個消息, 執行一些必要的操作。也就是說通過 nib 文件創建 view 對象時執行awakeFromNib 。
viewDidLoad
當 view 對象被加載到內存是就會執行 viewDidLoad,所以不管通過 nib 文件還是代碼的方式創建對象都會執行 viewDidLoad。
9.LayoutSubviews 何時會被調用?
答:當要調整 subViews 時候,需要重寫 layoutSubviews 方法。
- 初始化 init 方法時候不會觸發。
- 滾動 UIScrollView 時會觸發
- 旋轉 UIScreen 時會觸發
- 當改變 view 的值時候會觸發,前提是 frame 前后值發生了變化
- 當改變 UIview 的大小時候會觸發
10.public/private/protected 的具體區別
答:public 公共,加上這個修飾的類或屬性,可以在同一個包或者別的包里面訪問 private 私有的,加上這個修飾的類或屬性,只能在同類里訪問,同包和別的包不能訪問。
protected 保護,加上這個修飾的類或屬性,只能在類和同包訪問,別的包不能訪問。
11.ARC 是什么?
答:ARC 是 iOS 5 推出的新功能,全稱叫 ARC(Automatic Reference Counting)。 簡單地說,就是代碼中自動加入了 retain/release,原先需要手動添加的用來處理內存管理的引用計數的代碼可以自動地由編譯器完成了。
該機能在 iOS 5/ Mac OS X 10.7 開始導入,利用 Xcode4.2 可以使用該機能。 簡單地理解 ARC,就是通過指定的語法,讓編譯器(LLVM 3.0)在編譯代碼時, 自動生成實例的引用計數管理部分代碼。有一點,ARC 并不是 GC,它只是一種 代碼靜態分析(Static Analyzer)工具。
12.寫一個“標準”宏,這個宏輸入兩個參數并返回較小的
#define MIN(X,Y) ((X)>(Y)?(Y):(X))
13.Objective-c 中有多重繼承么?不是的話有聲明替代方式?
答:沒有多繼承,可以通過協議模擬多繼承
14.Objective-c 中有私有方法嗎?私有變量呢?
答:沒有私有方法,但可以將方法直接實現在.m 文件中不在.h 文件中聲明時,外部也不能訪問。有私有變量。
15.iPhone OS 中有沒有垃圾回收?
答:沒有
16.常見的 object-c 的數據類型有哪些,和 c 的基本類型有什么區別?
答:常見的 object-c 的數據類型有 NSInteger、CGFloat、NSString、 NSNumber、NSArray、NSData,NSInteger 會根據系統是 32 位還是 64 位來決定 是本身是 int 還是 Long,
CGFloat 會根據系統是 32 位還是 64 位來決定是本身是 float 還是 double,NSString、NSNumber、NSArray、NSData 都是指針類型的對象,在堆中分配空間,而 c 語言中的 char,[]等都是在棧中分配空間
17.id 聲明的對象有什么特性?
答:id 聲明的對象具有運行時的特性,即可以指向任意類型的 objcetive-c 的對象。
18.想 nil 對象發送消息會發生什么?
答:在 Objective-C 中向 nil 發送消息是完全有效的,只是在運行時不會有任何作用。
19.什么是 block?block 實現原理?
答:block 是一個特殊的 OC 對象, 它建立在棧上, 而不是堆上, 這么做一個是為性能考慮,還有就是方便訪問局部變量。默認情況下 block 使用到的局部變量都會被復制,而不是保留。所以它無法改變局部變量的值。如果在變量面前加上__block, 那么編譯器回去不會復制變量, 而是去找變量的地址, 通過地址來訪問變量, 實際上就是直接操作變量。另外 block 是在棧上分配的, 所以一旦離開作用域, 就會釋放, 因此如果你要把快用在別的地方, 必須要復制一份。 block 是不能保留的, retain 對塊沒有意義。
20.C++和 OC,JAVA 和 OC 之間的區別?
答:C++是功能強大,豐富的面向對象編程語言,具有私有、公有、保護權限的三種
成員變量和成員方法,具有私有、公有、保護三種繼承方式,具有重寫,重載, 虛函數,虛基類等多態方式,通過虛基類實現代理回調。自定義類可以沒有父 類。另外具備向量,模板,友元,重載運算符等多種獨特語法
Obj-C 是針對 mac OS 和 iOS 設備應用程序開發的專屬編程語言,采用動態繼承, 消息方法機制,沒有真正的重寫機制,沒有私有方法,繼承方式為公有,具備協議,類別,Block 等獨有的語法,萬用父類為 NSObject
JAVA 是老牌的面向對象語言,編寫的程序在 JAVA 虛擬機上運行,真正實現了一次編譯到處運行,具有復雜的內存回收機制,單繼承模式,接口語法類似 Obj-C 的協議。
21.抽象與接口的區別?
答:聲明方法的存在而不去實現它的類被叫做抽象類(abstract class),它用于要創建一個體現某些基本行為的類,并為該類聲明方法,但不能在該類中實現該類的情況。不能創建 abstract 類的實例。然而可以創建一個變量,其類型是一個抽象類,并讓它指向具體子類的一個實例。不能有抽象構造函數或抽象 靜態方法。Abstract 類的子類為它們父類中的所有抽象方法提供實現,否則它們也是抽象類為。取而代之,在子類中實現該方法。知道其行為的其它類可以 在類中實現這些方法。接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過實現這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個有程序體。接口只可以定義 static final 成員變量。接口的實現與子類相似,除了該實現類不能從接口定義中繼承行為。當類實現特殊接口時,它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實現了該接口的類的任何對象上調用接口的方法。由于有抽象類,它允許使用接口名作為引用變量的類型。通常的動態聯編將生效。引用可以轉換到接口類型或從接口類型轉換,instanceof 運算符可以用來決定某對象的類是否實現了接口。
22.nil 與 NULL 的區別?
答:從 Objective-C 語言的官方說法上看,nil 表示指向對象的指針即所謂對象的引用為空,NULL 表示指向基礎類型變量即 C 語言變量的指針為空。如果在非 ARC 程序的編寫過程中,兩個空是可以互換的,但是在 ARC 環境下,普通指針和對象引用被嚴格限制,不能交換使用,因此也應盡量不互換使用 nil 與 NULL
23.BOOL 與 bool 的區別?
答:bool 是 C 語言 C99 標準中增添的變量類型,Object-C 僅僅是從 C 語言繼承了這 種類型,該類型有 true 和 false 兩個值,表示真和假。BOOL 是 Obj-C 獨有的布爾類型,有 YES 和 NO 兩個值,分別是 1 和 0 的宏。Obj-C 中同時認為所有非 0 的值都是真值,0 為假值。
24.OC 如何實現私有方法?
答:Obj-C 語法中并沒有私有方法的概念,但是由于 Obj-C 是通過導入其他類的頭 文件來獲取其他類所擁有的成員方法的聲明,因此可以采用編寫方法時,不聲明,或僅在.m 文件中的匿名類別中聲明的方式,使方法對外不可見,即可達到方法私有化的目的。但是外部類仍然可以通過@selector 來訪問確實存在的私有方法,因此嚴格來講 Obj-C 確實不能真正實現方法私有化
25.NSString 和 NSMutableString 的區別
答:NSString 是一個不可變的字符串對象。這不是表示這個對象聲明的變量的值不 可變,而是表示它初始化以后,你不能改變該變量所分配的內存中的值,但你 可以重新分配該變量所處的內存空間。而 NSMutableString 是可變的,意味著 你可以追加它的內存空間,或者修改它所分配的內存空間中的值。
26.關于語句 NSString * str= [[NSData alloc]init],編譯和運行str分別代表什么對象?
答:首先,聲明 NSString *str 是告訴編譯器,str 是一個指向某個 Objective-C 對象的指針。因為不管指向的是什么類型的對象,一個指針所占的內存空間都是固定的,所以這里聲明成任何類型的對象,最終生成的可執行代碼都是沒有區別的。這里限定了 NSString 只不過是告訴編譯器,請把 str 當做一個 NSString 來檢查,如果后面調用了非 NSString 的方法,會產生警告。 接著,你創建了一個 NSData 對象,然后把這個對象所在的內存地址保存在 str 里。那么運行時,str 指向的內存空間就是一個 NSData 對象。你可以把 str 當做一個 NSData 對象來用。
27.socket 通信的幾個關鍵步驟
面向連接的 socket 通信就像與對方打電話,首先需要通過電話建立一個連接, 連接建立好之后,彼此才能雙向通信。它有幾個關鍵步驟 服務器端通常以守護進程的方式實現:
- 創建守護進程
- 獲取或注冊服務
- 創建 socket 并綁定地址
- 開始監聽
- 接收客戶端連接請求
- 進行數據傳輸
客戶端 - 獲取或注冊服務
- 創建 socket
- 發送連接請求
29.類別意義? 與繼承的區別?
答:當我們添加頭文件以后,對已知的類,會自動提示你對這個類添加的方法
主要用途,對于原生不會造成破壞,使用原生就可以提示出你的方法
30.Core Foundation 中提供了哪幾種操作 Socket 的方法?
答:CFNetwork、CFSocket 和 BSD Socket
31.用 id 聲明的對象有什么特性?
? 沒有*號
? 動態數據類型
? 可以指向任何類的對象(設置是 nil),而不關心其具體類型
? 在運行時檢查其具體類型
? 可以對其發送任何(存在的)消息
32.self.name=“object” name=“object”有什么區別?
答:前者實際上是調用了set方法給變量賦值 而后者是直接給變量賦值
33.shell中,將command1的輸出作為command2的輸出應該使用的命令是? 重定向命令>
command1>command2
34.下面的數據結構中不屬于線性結構的是:棧,鏈表,二叉樹,線性表
線性結構:棧,鏈表,線性表
非線性結構:二叉樹
35.oc中有沒有多繼承,如果沒有用什么方法替代?
答:沒有 用協議代替多繼承
36.常見的Objective-C的數據類型有哪些,和C的基本數據類型有什么區別? 答:OC中常用數據類型有 NSArray,NSDictionary,NSData,NSString,NSMutbleString等等,和C的最大區別為OC中的類型是類類型,需要實例化對象才能用。C中是一般數據類型直接操作內存空間
37.C語言中指針與數組的區別
答:指針是變量可以修改指向的方向,數組名是地址常量,不能被修改
38.new delete malloc free 的含義
答:c++:new申請內存, delete釋放掉指針指向的內存 c:malloc 動態申請內存,free 釋放指針指向的內存
39.常引用什么時候使用?
答:如果既要利用引用提高程序的效率,又要保護傳遞給函數的數據不在函
數中被改變,就要使用常引用
40.c/oc/c++有什么區別和聯系?
答:C 相對于 C++和 OC 而言更偏重于邏輯算法,這是因為 C 是面向過程,C++ 和 OC 都是面向對象。C 和 C++的聯系:C 是 C++的一個自洽子集,C++是 C 的超 集,OC 是 C 的擴展,C++和 OC 基本兼容 C 的語法。
41.const 的用法
答:const 修飾變量表示該變量是只讀變量(有些人管它叫常量),即只能引用而不能修改。const int *p;表示指針變量 P 指向的數據不能改
int *const p;表示指針變量 P 的值不能改,或者說是指針 P 的指向不能改
42.[pool release]和[pool drain]有什么區別?
答:drain 和 release 都會促使自動釋放池對象向池內的每一個對象發送release消息來釋放池內對象的引用計數,但是release觸發的這個操作, 不會考慮對象是否需要release,而drain會在自動釋放池向池內對象發送 release消息的時候,考慮對象是否需要release
43.自動釋放池和 GC 一樣嗎,iphone 有沒有 GC ?
答:在引用計數環境下,ios 是沒有垃圾回收的,自動釋放池是 oc 中管理內存的一種方式,它和 gc 是本質區別的,自動釋放池管理內存的前提是,必須把要管理內存的對象加入池內,才會生效。而 gc 是不斷檢測當前程序中是否有不再使用的內存進而釋放。
44.當A類中的某個方法執行到某處時,這時想在B類中執行某個方法,如何做? 并做簡單說明
答:用代理執行代理方法
說明:在b類中實現協議方法,設置a的代理為b,在指定方法內調用代理的協議方法
45.類別的作用?
答案:category 可以在不獲悉,不改變原來代碼的情況下往里面添加新的方法,只能添加,不能刪除修改。 并且如果類別和原來類中的方法產生名稱沖突,則類別將覆蓋原來的方法,因為類別具有更高的優先級。
類別主要有3個作用: (1)將類的實現分散到多個不同文件或多個不同框架中。 (2)創建對私有方法的前向引用。 (3)向對象添加非正式協議。
46.簡述extern C的作用
答:可以在 C++中使用 C 的已編譯好的函數模塊,在 c++中么用到 c 語言寫的函數,聲明一下,在 DLL 中經常看到,避免 C++ name mangling,主要用于動態鏈接庫, 使得導出函數名稱與 C 語言規則一致(不改變),方便不同的編譯器甚至是不 同的開發語言調用。
extern "C"是告訴C++編譯器以C Linkage方式編譯,也就是抑制C++的name mangling機制。
編程:
1.寫出@proerty(nonatomic,retain)Person *person;@synthesize person 具體實現。
- (void)setPerson:(Person *)person
{
if(_person != person){
[_person release];
[_person = person retain];
}
}
- (Person *)person
{
return _person;
}
2.從普通 id 類型對象轉換成數字對象,因為配置了限定詞.1f,所以結果四舍 五入,并保留一位小數
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.在最壞情況下排序速度最快的是:歸并排序
復雜度最高的是:快排 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,往數組里add的時候+1,release的時候 -1,從數組里移除的時候 -1。
語言
- 請簡述你對協議的理解
- 如何理解ARC自動引用計數機制
- 如何理解 retain/copy/assign/release/autor elease/dealloc關鍵字
- 請簡述self.name = xxx 與_name= xxx 的區別
- 請簡述類別和繼承有什么聯系和區別
- 請簡述你對strong和weak關鍵字的理 解
- 請簡述weak和assgin有什么區別
- 如何實現ARC和MRC的混合編程
- Objective-c中是否支持多繼承
- Objective-c中變量默認是私有的 嗎,方法默認是私有的嗎
-
#import"".h
和@class+類名的區別 - 請簡述頁面傳值都有哪些實現方式
- 請簡述深拷貝和淺拷貝的區別
設計模式
- 系統中有哪些對象是單例
- 請簡述你對MVC設計模式的理解
- iOS中哪些技術符合觀察者模式
- 請簡述你對工廠方法的理解
- 什么是代理模式,實現代理需要注意什么
UI
- 請簡述StoryBoard和Xib的聯系和區別
- 請簡述UITableView對Cell的重用機 制
- 如何使用UIScrollView實現無限加載 多張圖片
- 請簡述視圖控制器的生命周期
- UITableView有哪些優化方式
- 請簡述iOS中的事件傳遞機制
- UITableView有哪些必須要實現的數 據源方法
網絡
- 請簡述Http協議中get請求和post請求的區別
- 請簡述你對異步請求數據的理解
- iOS中都有哪些技術可以實現開辟線 程,它們的聯系和區別是什么
- NSThread中線程之間是如何實現通信 的
- CGD中有哪些創建線程的方式
- iOS中有哪些技術可以保證線程安全
- ASIHttpRequest的父類是什么
- 請簡述AFNetWork的實現原理
- 你如何理解block,block有什么用途
- 請簡述TCP和UDP的區別
- 請問怎樣能夠保證定位更省電
- 請簡述SDWebImage的實現原理
- 請簡述xml和json數據各有哪些優勢
- 請簡述線程和進程有什么聯系和區別
數據操作
- 請簡述NSUserDefaults的使用場景和 使用注意事項
- iOS中數據庫使用什么技術實現的
- 請簡述什么是主鍵、什么是外鍵
- iOS中如何實現數據模型的存儲
- 請簡述iOS的沙盒機制
項目
如何實現真機調試
如何查找項目中的內存泄露
項目中的支付環節如何實現的
如何實現項目上線到AppStore
請簡述你在項目中遇到過哪些問題,如何解決的
如何實現流媒體格式的視頻邊播放,邊緩存
請簡述你理解的內存管理
請簡述你理解的面向對象思想
如何設計一個緩存類
談談你對藍牙技術的了解
IOS8.0都有哪些新特性
什么是懶加載?
在ARC下發生內存泄露怎么處理
GCD(異步的Block)中self.的處理
APNS 推送的實現過程
添加NSNotificationCenter 監 聽,其后面的 object 的意義是什么?
談iOS的常用加密方式,以及各方 式的優劣
論Socket 和http協議的區別
iOS中數據的持久化存儲方式有哪 些
什么是kvc/kvo 及它們之間有什么 關系
iOS中frame和bounds的區別
服務器連接三次握手。
GCD有哪三種隊列和用法。
CALayer的和UIView和繪圖API 的關系。
介紹動畫矩陣變換算法。
面試題#
When to use NSMutableArray and when to use NSArray?
答:當數組在程序運行時需要不斷變化的,使用NSMutableArray;當數組在初始化后不再改動的,使用NSArray。
需要指出的是,使用NSArray只表明的是該數組在運行時不發生改變,即不能往NSAarry的數組里添加或刪除元素,但不表明其數組內元素的內容不能發生改變。NSArray是線程安全的,NSMutableArray不是線程安全的,多線程使用到NSMutableArray需要注意。Give us example of what are delegate methods and what are data source methods of uitableview.
答: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;
How many autorelease you can create in your application? Is there any limit?
在應用中可以創建多少autorelease對象,是否有限制?
答案:If we don’t create any autorelease pool in our application then is there any autorelease pool already provided to us?
如果我們不創建內存池,是否有內存池提供給我們?
答案:界面線程維護著自己的內存池,用戶自己創建的數據線程,則需要創建該線程的內存池When you will create an autorelease pool in your application?
什么時候需要在程序中創建內存池?
答案:用戶自己創建的數據線程,則需要創建該線程的內存池When retain count increase?
什么時候內存計數會增加?
答案:見iOS面試題(一)What are commonly used NSObject class methods?
類NSObject的那些方法經常被使用?
答案:NSObject是Objetive-C的基類,其由NSObject類及一系列協議構成。
其中類方法alloc、class、 description 對象方法init、dealloc、– performSelector:withObject:afterDelay:等經常被使用What is convenience constructor?
什么是簡便構造方法?
答案:簡便構造方法一般由CocoaTouch框架提供,如NSNumber的 + numberWithBool: + numberWithChar: + numberWithDouble: + numberWithFloat: + numberWithInt:
Foundation下大部分類均有簡便構造方法,我們可以通過簡便構造方法,獲得系統給我們創建好的對象,并且不需要手動釋放。How to design universal application in Xcode?
如何使用Xcode設計通用應用?
答案:使用MVC模式設計應用,其中Model層完成脫離界面,即在Model層,其是可運行在任何設備上,在controller層,根據iPhone與iPad(獨有UISplitViewController)的不同特點選擇不同的viewController對象。在View層,可根據現實要求來設計,其中以xib文件設計時,其設置其為universal。What is keyword atomic in Objective C?
在Objetive-C什么是原子關鍵字
答案:atomic,nonatomic見iOS面試題(一)What are UIView animations?
UIView的動畫效果有那些?
答案:有很多,如 UIViewAnimationOptionCurveEaseInOut UIViewAnimationOptionCurveEaseIn UIViewAnimationOptionCurveEaseOut UIViewAnimationOptionTransitionFlipFromLeft UIViewAnimationOptionTransitionFlipFromRight UIViewAnimationOptionTransitionCurlUpUIViewAnimationOptionTransitionCurlDownHow can you store data in iPhone applications?
在iPhone應用中如何保存數據?
答案:有以下幾種保存機制:
1.通過web服務,保存在服務器上
2.通過NSCoder固化機制,將對象保存在文件中
3.通過SQlite或CoreData保存在文件數據庫中What is coredata?
什么是coredata?
答案:coredata框架是apple提供的一套通用自動的解決方案,包括了對象生存周期、對象關系圖、持久化機制。
補充答案:上面是翻譯的,按我個人理解coredata提供一種機制,讓我們可以方便的把內存中對象、及對象間的關系映射到coredata,然后由它為我們持久化數據。相比普通的文件數據庫SQlite,它的功能更強大,不需要我們先將對象數據format成SQL語句,存入數據庫,再用select語句讀出,而現在是從內存到coredata的數據管理,我們只需管理coredata的managed對象。是蘋果提供一套數據保存What is NSManagedObject model?
什么是NSManagedObject模型?
答案:NSManagedObject是NSObject的子類 ,也是coredata的重要組成部分,它是一個通用的類,實現了core data 模型層所需的基本功能,用戶可通過子類化NSManagedObject,建立自己的數據模型。What is NSManagedobjectContext?
什么是NSManagedobjectContext?
答案:NSManagedobjectContext對象負責應用和數據庫之間的交互。-
What is predicate?
什么是謂詞?
答案:謂詞是通過NSPredicate,是通過給定的邏輯條件作為約束條件,完成對數據的篩選。predicate = [NSPredicate predicateWithFormat:@"customerID == %d",n]; a = [customers filteredArrayUsingPredicate:predicate];
What kind of persistence store we can use with coredata?
coredata有哪幾種持久化存儲機制?
答案:coredatat提供以下幾種存儲機制:XML(iOS系統不支持),自動存儲,SQLite,內存存儲。
補充說明:這個問題問的是,coredate框架的存儲機制,平時使用coredata時,更多關注的是managed的對象,這里是coerdata框架的存儲實現細節。BTW: 其他常用的持久化存儲方法 :存入到文件、 存入到NSUserDefaults(系統plist文件中)。談談對Block的理解? 并寫出一個使用Block執行UIView動畫?
答:Block是可以獲取其他函數局部變量的匿名函數,其不但方便開發,并且可以大幅度提高應用的執行效率(多核心CPU可直接處理Block指令)
[UIView transitionWithView:self.view duration:0.2 options:UIViewAnimationOptionTransitionFlipFromLeft animation:^{
[[blueViewController view] removeFromSuperview];
[[self view] insertSubview:yellowViewController.view atIndex:0];
} completion:NULL];
- 寫出上面代碼的Block的定義
答:
typedef void (^animations)(void);
typedef void (^completion)(BOOL finished);
試著使用+ 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);
操作的函數執行部分
答案:無做過的項目是否涉及網絡訪問功能,使用什么對象完成網絡功能?
答案:ASIHTTPRequest與NSURLConnection簡單介紹下NSURLConnection類及
+ sendSynchronousRequest:returningResponse:error:
與– initWithRequest:delegate:
兩個方法的區別?
答案:NSURLConnection
主要用于網絡訪問,其中+ sendSynchronousRequest:returningResponse:error:
是同步訪問數據,即當前線程會阻塞,并等待request的返回的response,而– initWithRequest:delegate:
使用的是異步加載,當其完成網絡訪問后,會通過delegate回到主線程,并其委托的對象。Difference between shallow copy and deep copy?
淺復制和深復制的區別?
答案:淺復制:只復制指向對象的指針,而不復制引用對象本身。
深復制:復制引用對象本身。
意思就是有個對象A,復制一份得到A_copy對象后,對于淺復制來說,A和A_copy指向的是同一個內存資源,復制的只不過是一個指針,對象本身資源
還是只有一份,那如果我們對A_copy執行了修改操作,那么發現A引用的對象同樣被修改,這其實違背了我們復制拷貝的一個思想。深復制就好理解了,內存中存在了兩份獨立對象本身。
用網上一哥們通俗的話將就是:
淺復制好比你和你的影子,你完蛋,你的影子也完蛋
深復制好比你和你的克隆人,你完蛋,你的克隆人還活著。What is advantage of categories? What is difference between implementing a category and inheritance?
類別的作用?繼承和類別在實現中有何區別?
答案:category 可以在不獲悉,不改變原來代碼的情況下往里面添加新的方法,只能添加,不能刪除修改。并且如果類別和原來類中的方法產生名稱沖突,則類別將覆蓋原來的方法,因為類別具有更高的優先級。
類別主要有3個作用:
(1)將類的實現分散到多個不同文件或多個不同框架中。
(2)創建對私有方法的前向引用。
(3)向對象添加非正式協議。
繼承可以增加,擴展父類方法,并且可以增加屬性。Difference between categories and extensions?
類別和類擴展的區別?
答案:category和extensions的不同在于后者可以添加屬性。另外后者添加的方法是必須要實現的。
extensions可以認為是一個私有的Category。Difference between protocol in objective c and interfaces in java?
oc中的協議和java中的接口概念有何不同?
答案:OC中的協議有2層含義,官方定義為 formal和informal protocol。前者和Java接口一樣。
informal protocol中的方法屬于設計模式考慮范疇,不是必須實現的,但是如果有實現,就會改變類的屬性。
其實關于正式協議,類別和非正式協議我很早前學習的時候大致看過,也寫在了學習教程里
“非正式協議概念其實就是類別的另一種表達方式“這里有一些你可能希望實現的方法,你可以使用他們更好的完成工作”。
這個意思是,這些是可選的。比如我門要一個更好的方法,我們就會申明一個這樣的類別去實現。然后你在后期可以直接使用這些更好的方法。
這么看,總覺得類別這玩意兒有點像協議的可選協議。"
現在來看,其實protocal已經開始對兩者都統一和規范起來操作,因為資料中說“非正式協議使用interface修飾“,
現在我們看到協議中兩個修飾詞:“必須實現(@requied)”和“可選實現(@optional)”。
OC中的協議(formal protocol)與java中的接口概念基本一致,OC中非正式協議(informal protocol)就是類別。在java中如果繼承了接口,但不實現其方法,會得到一個error(無法編譯);在OC中的正式協議,如果不實現,會得到一個warning(可編譯執行),如果想去除waring,還可以加關鍵字(@optional),讓它可選實現方法。-
What are KVO and KVC?
答案:kvc:鍵 - 值編碼是一種間接訪問對象的屬性使用字符串來標識屬性,而不是通過調用存取方法,直接或通過實例變量訪問的機制。
很多情況下可以簡化程序代碼。apple文檔其實給了一個很好的例子。
kvo:鍵值觀察機制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。
具體用到過的一個地方是對于按鈕點擊變化狀態的的監控。
比如我自定義的一個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]; } }
對于系統是根據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查找的邏輯理解,就說的過去了。
What is purpose of delegates?
代理的作用?
答案:代理的目的是改變或傳遞控制鏈。允許一個類在某些特定時刻通知到其他類,而不需要獲取到那些類的指針。可以減少框架復雜度。
另外一點,代理可以理解為java中的回調監聽機制的一種類似。What are mutable and immutable types in Objective C?
oc中可修改和不可以修改類型。
答案:可修改不可修改的集合類。這個我個人簡單理解就是可動態添加修改和不可動態添加修改一樣。
比如NSArray和NSMutableArray。前者在初始化后的內存控件就是固定不可變的,后者可以添加等,可以動態申請新的內存空間。When we call objective c is runtime language what does it mean?
我們說的oc是動態運行時語言是什么意思?
答案:多態。 主要是將數據類型的確定由編譯時,推遲到了運行時。
這個問題其實淺涉及到兩個概念,運行時和多態。
簡單來說,運行時機制使我們直到運行時才去決定一個對象的類別,以及調用該類別對象指定方法。
多態:不同對象以自己的方式響應相同的消息的能力叫做多態。意思就是假設生物類(life)都用有一個相同的方法-eat;
那人類屬于生物,豬也屬于生物,都繼承了life后,實現各自的eat,但是調用是我們只需調用各自的eat方法。
也就是不同的對象以自己的方式響應了相同的消息(響應了eat這個選擇器)。
因此也可以說,運行時機制是多態的基礎?what is difference between NSNotification and protocol?
通知和協議的不同之處?
答案:協議有控制鏈(has-a)的關系,通知沒有。
首先我一開始也不太明白,什么叫控制鏈(專業術語了~)。但是簡單分析下通知和代理的行為模式,我們大致可以有自己的理解
簡單來說,通知的話,它可以一對多,一條消息可以發送給多個消息接受者。
代理按我們的理解,到不是直接說不能一對多,比如我們知道的明星經濟代理人,很多時候一個經濟人負責好幾個明星的事務。
只是對于不同明星間,代理的事物對象都是不一樣的,一一對應,不可能說明天要處理A明星要一個發布會,代理人發出處理發布會的消息后,別稱B的
發布會了。但是通知就不一樣,他只關心發出通知,而不關心多少接收到感興趣要處理。
因此控制鏈(has-a從英語單詞大致可以看出,單一擁有和可控制的對應關系。What is push notification?
什么是推送消息?
答案:太簡單,不作答~~~~~~~~~~
這是cocoa上的答案。
其實到不是說太簡單,只是太泛泛的一個概念的東西。就好比說,什么是人。
推送通知更是一種技術。
簡單點就是客戶端獲取資源的一種手段。
普通情況下,都是客戶端主動的pull。
推送則是服務器端主動push。Polymorphism?
關于多態性
答案:多態,父類指針指向子類對象。
這個題目其實可以出到一切面向對象語言中,
因此關于多態,繼承和封裝基本最好都有個自我意識的理解,也并非一定要把書上資料上寫的能背出來。
最重要的是轉化成自我理解。Singleton?
對于單例的理解
答案:11,12題目其實出的有點泛泛的感覺了,可能說是編程語言需要或是必備的基礎。
基本能用熟悉的語言寫出一個單例,以及可以運用到的場景或是你編程中碰到過運用的此種模式的框架類等。
進一步點,考慮下如何在多線程訪問單例時的安全性。What is responder chain?
說說響應鏈
答案: 事件響應鏈。包括點擊事件,畫面刷新事件等。在視圖棧內從上至下,或者從下之上傳播。
可以說點事件的分發,傳遞以及處理。具體可以去看下touch事件這塊。因為問的太抽象化了
嚴重懷疑題目出到越后面就越籠統。
可以從責任鏈模式,來講通過事件響應鏈處理,其擁有的擴展性Difference between frame and bounds?
frame和bounds有什么不同?
答案:frame指的是:該view在父view坐標系統中的位置和大小。(參照點是父親的坐標系統)
bounds指的是:該view在本身坐標系統中 的位置和大小。(參照點是本身坐標系統)Difference between method and selector?
方法和選擇器有何不同?
答案:selector是一個方法的名字,method是一個組合體,包含了名字和實現.
詳情可以看apple文檔。Is there any garbage collection mechanism in Objective C.?
OC的垃圾回收機制?
答案: OC2.0有Garbage collection,但是iOS平臺不提供。
一般我們了解的objective-c對于內存管理都是手動操作的,但是也有自動釋放池。
但是差了大部分資料,貌似不要和arc機制搞混就好了。
求更多~~NSOperation queue?
答案:存放NSOperation的集合類。
操作和操作隊列,基本可以看成java中的線程和線程池的概念。用于處理ios多線程開發的問題。
網上部分資料提到一點是,雖然是queue,但是卻并不是帶有隊列的概念,放入的操作并非是按照嚴格的先進現出。
這邊又有個疑點是,對于隊列來說,先進先出的概念是Afunc添加進隊列,Bfunc緊跟著也進入隊列,Afunc先執行這個是必然的,
但是Bfunc是等Afunc完全操作完以后,B才開始啟動并且執行,因此隊列的概念理論上有點違背了多線程處理這個概念。
但是轉念一想其實可以參考銀行的取票和叫號系統。
因此對于A比B先排隊取票但是B率先執行完操作,我們亦然可以感性認為這還是一個隊列。
但是后來看到一票關于這操作隊列話題的文章,其中有一句提到
“因為兩個操作提交的時間間隔很近,線程池中的線程,誰先啟動是不定的。”
瞬間覺得這個queue名字有點忽悠人了,還不如pool~
綜合一點,我們知道他可以比較大的用處在于可以幫助多線程編程就好了。
樓上區分了線程執行時的次序(Afunc和Bfunc誰先啟動)和線程執行完成(Afunc和Bfunc誰先執行完)時的次序不同,而多線程的重要概念是并發(同時執行多個任務),NSOperationQueue是管理并發線程的對象,可以在其中放入NSOpertation對象(對象化的線程實體),通過設置maxConcurrentOperationCount的大小,控制并發數目,如樓上所說希望“Afunc添加進隊列,執行完后,Bfunc緊跟進入隊列,繼續執行”,那只需將maxConcurrentOperationCount設為1,變會依次執行,這時候實際是在單線程依次執行。所以這里的NSOperationQueue就是對象化抽象的去管理多線程,這樣的好處,使用者通過繼承NSOperation對象,可以方便的用對象來管理線程,而不再用關心線程同步、信號量等細節,更多地關注于業務邏輯。What is lazy loading?
答案:懶漢模式,只在用到的時候才去初始化。
也可以理解成延時加載。
我覺得最好也最簡單的一個列子就是tableView中圖片的加載顯示了。
一個延時載,避免內存過高,一個異步加載,避免線程堵塞。Can we use two tableview controllers on one viewcontroller?
是否在一個視圖控制器中嵌入兩個tableview控制器?
答案:一個視圖控制只提供了一個View視圖,理論上一個tableViewController也不能放吧,
只能說可以嵌入一個tableview視圖。當然,題目本身也有歧義,如果不是我們定性思維認為的UIViewController,
而是宏觀的表示視圖控制者,那我們倒是可以把其看成一個視圖控制者,它可以控制多個視圖控制器,比如TabbarController
那樣的感覺。Can we use one tableview with two different datasources? How you will achieve this?
一個tableView是否可以關聯兩個不同的數據源?你會怎么處理?
答案:首先我們從代碼來看,數據源如何關聯上的,其實是在數據源關聯的代理方法里實現的。
因此我們并不關心如何去關聯他,他怎么關聯上,方法只是讓我返回根據自己的需要去設置如相關的數據源。
因此,我覺得可以設置多個數據源啊,但是有個問題是,你這是想干嘛呢?想讓列表如何顯示,不同的數據源分區塊顯示?