C 部分
1.static 關(guān)鍵字的作用?
- 第一個作用:隱藏。 當(dāng)我們同時編譯多個文件時,所有未加static前綴的全局變量和函數(shù)都具有全局可見性。
- static的第二個作用是保持變量內(nèi)容的持久。存儲在靜態(tài)數(shù)據(jù)區(qū)的變量會在程序剛開始運(yùn)行時就完成初始化,也是唯一的一次初始化。共有兩種變量存儲在靜態(tài)存儲區(qū):全局變量和static變量,只不過和全局變量比起來, static可以控制變量的可見范圍,說到底static還是用來隱藏的。
- 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ū)別?
- 棧區(qū)(stack)― 由編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。
- 堆區(qū)(heap) ― 一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時可能由OS回收 。
4.C語言如何判斷兩個單向無環(huán)鏈表是否相交?
只需判斷兩個鏈表的尾節(jié)點地址是否相同,相同則相交,不同則不相交
5.程序在內(nèi)存中運(yùn)行時,內(nèi)存分幾個區(qū),各自用途?
- 棧 --有編譯器自動分配釋放。
- 堆 -- 一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時可能由 OS 回收
- 全局區(qū)(靜態(tài)區(qū)) -- 全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始 化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。程序結(jié)束釋放。
- 另外還有一個專門放常量的地方。程序結(jié)束釋放。
6.引用與指針有什么區(qū)別?
指針指向一塊內(nèi)存,它的內(nèi)容是所指內(nèi)存的地址;引用是某塊內(nèi)存的別名
- 指針是一個實體,而引用僅是個別名;
- 引用使用時無需解引用(*),指針需要解引用;
- 引用只能在定義時被初始化一次,之后不可變;指針可變;
- 引用沒有 const,指針有 const;
- 引用不能為空,指針可以為空;
- “sizeof 引用”得到的是所指向的變量(對象)的大小,而“sizeof指針”得到的是指針本身(所指向的變量或?qū)ο蟮牡刂?的大小;
- 指針和引用的自增(++)運(yùn)算意義不一樣;
- 從內(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 方法。
- 初始化 init 方法時候不會觸發(fā)。
- 滾動 UIScrollView 時會觸發(fā)
- 旋轉(zhuǎn) UIScreen 時會觸發(fā)
- 當(dāng)改變 view 的值時候會觸發(fā),前提是 frame 前后值發(fā)生了變化
- 當(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):
- 創(chuàng)建守護(hù)進(jìn)程
- 獲取或注冊服務(wù)
- 創(chuàng)建 socket 并綁定地址
- 開始監(jiān)聽
- 接收客戶端連接請求
- 進(jìn)行數(shù)據(jù)傳輸
客戶端 - 獲取或注冊服務(wù)
- 創(chuàng)建 socket
- 發(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。
語言
- 請簡述你對協(xié)議的理解
- 如何理解ARC自動引用計數(shù)機(jī)制
- 如何理解 retain/copy/assign/release/autor elease/dealloc關(guān)鍵字
- 請簡述self.name = xxx 與_name= xxx 的區(qū)別
- 請簡述類別和繼承有什么聯(lián)系和區(qū)別
- 請簡述你對strong和weak關(guān)鍵字的理 解
- 請簡述weak和assgin有什么區(qū)別
- 如何實現(xiàn)ARC和MRC的混合編程
- Objective-c中是否支持多繼承
- Objective-c中變量默認(rèn)是私有的 嗎,方法默認(rèn)是私有的嗎
-
#import"".h
和@class+類名的區(qū)別 - 請簡述頁面?zhèn)髦刀加心男崿F(xiàn)方式
- 請簡述深拷貝和淺拷貝的區(qū)別
設(shè)計模式
- 系統(tǒng)中有哪些對象是單例
- 請簡述你對MVC設(shè)計模式的理解
- iOS中哪些技術(shù)符合觀察者模式
- 請簡述你對工廠方法的理解
- 什么是代理模式,實現(xiàn)代理需要注意什么
UI
- 請簡述StoryBoard和Xib的聯(lián)系和區(qū)別
- 請簡述UITableView對Cell的重用機(jī) 制
- 如何使用UIScrollView實現(xiàn)無限加載 多張圖片
- 請簡述視圖控制器的生命周期
- UITableView有哪些優(yōu)化方式
- 請簡述iOS中的事件傳遞機(jī)制
- UITableView有哪些必須要實現(xiàn)的數(shù) 據(jù)源方法
網(wǎng)絡(luò)
- 請簡述Http協(xié)議中g(shù)et請求和post請求的區(qū)別
- 請簡述你對異步請求數(shù)據(jù)的理解
- iOS中都有哪些技術(shù)可以實現(xiàn)開辟線 程,它們的聯(lián)系和區(qū)別是什么
- NSThread中線程之間是如何實現(xiàn)通信 的
- CGD中有哪些創(chuàng)建線程的方式
- iOS中有哪些技術(shù)可以保證線程安全
- ASIHttpRequest的父類是什么
- 請簡述AFNetWork的實現(xiàn)原理
- 你如何理解block,block有什么用途
- 請簡述TCP和UDP的區(qū)別
- 請問怎樣能夠保證定位更省電
- 請簡述SDWebImage的實現(xiàn)原理
- 請簡述xml和json數(shù)據(jù)各有哪些優(yōu)勢
- 請簡述線程和進(jìn)程有什么聯(lián)系和區(qū)別
數(shù)據(jù)操作
- 請簡述NSUserDefaults的使用場景和 使用注意事項
- iOS中數(shù)據(jù)庫使用什么技術(shù)實現(xiàn)的
- 請簡述什么是主鍵、什么是外鍵
- iOS中如何實現(xiàn)數(shù)據(jù)模型的存儲
- 請簡述iOS的沙盒機(jī)制
項目
如何實現(xiàn)真機(jī)調(diào)試
如何查找項目中的內(nèi)存泄露
項目中的支付環(huán)節(jié)如何實現(xiàn)的
如何實現(xiàn)項目上線到AppStore
請簡述你在項目中遇到過哪些問題,如何解決的
如何實現(xiàn)流媒體格式的視頻邊播放,邊緩存
請簡述你理解的內(nèi)存管理
請簡述你理解的面向?qū)ο笏枷?/p>
如何設(shè)計一個緩存類
談?wù)勀銓λ{(lán)牙技術(shù)的了解
IOS8.0都有哪些新特性
什么是懶加載?
在ARC下發(fā)生內(nèi)存泄露怎么處理
GCD(異步的Block)中self.的處理
APNS 推送的實現(xiàn)過程
添加NSNotificationCenter 監(jiān) 聽,其后面的 object 的意義是什么?
談iOS的常用加密方式,以及各方 式的優(yōu)劣
論Socket 和http協(xié)議的區(qū)別
iOS中數(shù)據(jù)的持久化存儲方式有哪 些
什么是kvc/kvo 及它們之間有什么 關(guān)系
iOS中frame和bounds的區(qū)別
服務(wù)器連接三次握手。
GCD有哪三種隊列和用法。
CALayer的和UIView和繪圖API 的關(guān)系。
介紹動畫矩陣變換算法。
面試題#
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需要注意。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;
How many autorelease you can create in your application? Is there any limit?
在應(yīng)用中可以創(chuàng)建多少autorelease對象,是否有限制?
答案: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)存池When you will create an autorelease pool in your application?
什么時候需要在程序中創(chuàng)建內(nèi)存池?
答案:用戶自己創(chuàng)建的數(shù)據(jù)線程,則需要創(chuàng)建該線程的內(nèi)存池When retain count increase?
什么時候內(nèi)存計數(shù)會增加?
答案:見iOS面試題(一)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)常被使用What is convenience constructor?
什么是簡便構(gòu)造方法?
答案:簡便構(gòu)造方法一般由CocoaTouch框架提供,如NSNumber的 + numberWithBool: + numberWithChar: + numberWithDouble: + numberWithFloat: + numberWithInt:
Foundation下大部分類均有簡便構(gòu)造方法,我們可以通過簡便構(gòu)造方法,獲得系統(tǒng)給我們創(chuàng)建好的對象,并且不需要手動釋放。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。What is keyword atomic in Objective C?
在Objetive-C什么是原子關(guān)鍵字
答案:atomic,nonatomic見iOS面試題(一)What are UIView animations?
UIView的動畫效果有那些?
答案:有很多,如 UIViewAnimationOptionCurveEaseInOut UIViewAnimationOptionCurveEaseIn UIViewAnimationOptionCurveEaseOut UIViewAnimationOptionTransitionFlipFromLeft UIViewAnimationOptionTransitionFlipFromRight UIViewAnimationOptionTransitionCurlUpUIViewAnimationOptionTransitionCurlDownHow 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ù)庫中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ù)保存What is NSManagedObject model?
什么是NSManagedObject模型?
答案:NSManagedObject是NSObject的子類 ,也是coredata的重要組成部分,它是一個通用的類,實現(xiàn)了core data 模型層所需的基本功能,用戶可通過子類化NSManagedObject,建立自己的數(shù)據(jù)模型。What is NSManagedobjectContext?
什么是NSManagedobjectContext?
答案:NSManagedobjectContext對象負(fù)責(zé)應(yīng)用和數(shù)據(jù)庫之間的交互。-
What is predicate?
什么是謂詞?
答案:謂詞是通過NSPredicate,是通過給定的邏輯條件作為約束條件,完成對數(shù)據(jù)的篩選。predicate = [NSPredicate predicateWithFormat:@"customerID == %d",n]; a = [customers filteredArrayUsingPredicate:predicate];
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文件中)。談?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];
- 寫出上面代碼的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);
操作的函數(shù)執(zhí)行部分
答案:無做過的項目是否涉及網(wǎng)絡(luò)訪問功能,使用什么對象完成網(wǎng)絡(luò)功能?
答案:ASIHTTPRequest與NSURLConnection簡單介紹下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回到主線程,并其委托的對象。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ù)制好比你和你的克隆人,你完蛋,你的克隆人還活著。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ò)展父類方法,并且可以增加屬性。Difference between categories and extensions?
類別和類擴(kuò)展的區(qū)別?
答案:category和extensions的不同在于后者可以添加屬性。另外后者添加的方法是必須要實現(xiàn)的。
extensions可以認(rèn)為是一個私有的Category。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)方法。-
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查找的邏輯理解,就說的過去了。
What is purpose of delegates?
代理的作用?
答案:代理的目的是改變或傳遞控制鏈。允許一個類在某些特定時刻通知到其他類,而不需要獲取到那些類的指針。可以減少框架復(fù)雜度。
另外一點,代理可以理解為java中的回調(diào)監(jiān)聽機(jī)制的一種類似。What are mutable and immutable types in Objective C?
oc中可修改和不可以修改類型。
答案:可修改不可修改的集合類。這個我個人簡單理解就是可動態(tài)添加修改和不可動態(tài)添加修改一樣。
比如NSArray和NSMutableArray。前者在初始化后的內(nèi)存控件就是固定不可變的,后者可以添加等,可以動態(tài)申請新的內(nèi)存空間。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ǔ)?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)系。What is push notification?
什么是推送消息?
答案:太簡單,不作答~~~~~~~~~~
這是cocoa上的答案。
其實到不是說太簡單,只是太泛泛的一個概念的東西。就好比說,什么是人。
推送通知更是一種技術(shù)。
簡單點就是客戶端獲取資源的一種手段。
普通情況下,都是客戶端主動的pull。
推送則是服務(wù)器端主動push。Polymorphism?
關(guān)于多態(tài)性
答案:多態(tài),父類指針指向子類對象。
這個題目其實可以出到一切面向?qū)ο笳Z言中,
因此關(guān)于多態(tài),繼承和封裝基本最好都有個自我意識的理解,也并非一定要把書上資料上寫的能背出來。
最重要的是轉(zhuǎn)化成自我理解。Singleton?
對于單例的理解
答案:11,12題目其實出的有點泛泛的感覺了,可能說是編程語言需要或是必備的基礎(chǔ)。
基本能用熟悉的語言寫出一個單例,以及可以運(yùn)用到的場景或是你編程中碰到過運(yùn)用的此種模式的框架類等。
進(jìn)一步點,考慮下如何在多線程訪問單例時的安全性。What is responder chain?
說說響應(yīng)鏈
答案: 事件響應(yīng)鏈。包括點擊事件,畫面刷新事件等。在視圖棧內(nèi)從上至下,或者從下之上傳播。
可以說點事件的分發(fā),傳遞以及處理。具體可以去看下touch事件這塊。因為問的太抽象化了
嚴(yán)重懷疑題目出到越后面就越籠統(tǒng)。
可以從責(zé)任鏈模式,來講通過事件響應(yīng)鏈處理,其擁有的擴(kuò)展性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))Difference between method and selector?
方法和選擇器有何不同?
答案:selector是一個方法的名字,method是一個組合體,包含了名字和實現(xiàn).
詳情可以看apple文檔。Is there any garbage collection mechanism in Objective C.?
OC的垃圾回收機(jī)制?
答案: OC2.0有Garbage collection,但是iOS平臺不提供。
一般我們了解的objective-c對于內(nèi)存管理都是手動操作的,但是也有自動釋放池。
但是差了大部分資料,貌似不要和arc機(jī)制搞混就好了。
求更多~~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ù)邏輯。What is lazy loading?
答案:懶漢模式,只在用到的時候才去初始化。
也可以理解成延時加載。
我覺得最好也最簡單的一個列子就是tableView中圖片的加載顯示了。
一個延時載,避免內(nèi)存過高,一個異步加載,避免線程堵塞。Can we use two tableview controllers on one viewcontroller?
是否在一個視圖控制器中嵌入兩個tableview控制器?
答案:一個視圖控制只提供了一個View視圖,理論上一個tableViewController也不能放吧,
只能說可以嵌入一個tableview視圖。當(dāng)然,題目本身也有歧義,如果不是我們定性思維認(rèn)為的UIViewController,
而是宏觀的表示視圖控制者,那我們倒是可以把其看成一個視圖控制者,它可以控制多個視圖控制器,比如TabbarController
那樣的感覺。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ū)塊顯示?