李洪強經典面試題22

1. 回答person的retainCount值,並解釋爲何php

 


Person * per = [[Person alloc] init]; java

此時person 的retainCount的值是1node

 self.person = per;
在self.person 時,若是是assign,person的 retainCount的值不變,仍爲1 ios

如果:retain person的retainCount的值加1,變爲2c++


如果:copy person的retainCount值不變,仍爲1程序員

 

 

二、 這段代碼有什麼問題嗎: web

@implementation Personobjective-c


- (void)setAge:(int)newAge {sql

self.age = newAge; }數據庫

@end

 

會死循環,會重複調用本身!self.age 改成_age便可;

而且書寫不規範:setter方法中的newAge應該爲age

三、這段代碼有什麼問題,如何修改

 


for (int i = 0; i < someLargeNumber; i++) 

NSString *string = @」Abc」;


string = [string lowercaseString];


string = [string stringByAppendingString:@"xyz"]; 

NSLog(@「%@」, string);


}


會出現內存泄露
修改以後:
for(int i = 0; i<1000;i++){

NSAutoreleasePool * pool1 = [[NSAutoreleasePool alloc] init]; 

NSString *string = @"Abc";
string = [string lowercaseString

];
string = [string stringByAppendingString:@"xyz"]; NSLog(@"%@",string);

//釋放池

[pool1 drain]; }

 

延伸:堆棧的區別:

(1)管理方式:

對於棧來說,

是由編譯器自動管理,無需咱們手工控制;

對於堆來講,

釋放工做由程序員控制,容易產生 memory leak。

(2)申請大小:

能從棧得到的空間較小,堆是向高地址擴展的數據結構,是不連續的內存區域。

堆的大小受限於計算機系統中 有效的虛擬內存。因而可知,堆得到的空間比較靈活,也比較大。

(3)碎片問題:

對於堆來說,頻繁的new/delete勢必會形成內存空間的不連續,從而形成大量的碎片,使程序效率下降。

對於棧來說,則不會存在這個問題,由於棧是先進後出的隊列,他們是如此的一一對應,以致於永遠都不可能有一個內存塊 從棧中間彈出 

 

(4)分配方式:

堆都是動態分配的,沒有靜態分配的堆。

棧有2種分配方式:

靜態分配和動態分配。

靜態分配是編譯器完成 的,好比局部變量的分配。

動態分配由 alloca函數進行分配,可是棧的動態分配和堆是不一樣的,他的動態分配是由編譯器 進行釋放,無需咱們手工實現。

 

(5)分配效率:

棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧 都有專門的指令執行,這就決定了棧的效率比較高。

堆則是C/C++函數庫提供的,它的機制是很複雜的。 

 

四、寫一個便利構造器

+(id)Person {

Person *person=[Person alloc]init];
return [person autorelease]; 

備註:ARC時不用 autorelease

}

五、截取字符串

」20 | http://www.baidu.com」

中,」|」字符前面和後面的數據,分別輸出它們。

􏵦NSString * str = @"20 | http://www.baidu.com";


NSArray *array = [str componentsSeparatedByString:@"|"]; 

//這是分別輸出的截取後的字符串

for (int i = 0; i<[array count]; ++i) 

NSLog(@"%d=%@",i,[array objectAtIndex:i]);

}

六、用obj-c寫一個冒泡排序

-(void)mySort:(NSMutableArray *)mutArray {

id tmpObj = nil;
unsigned long flag = mutArray.count-

1;//flag :最大腳標 

while (flag > 0)

 {

int k = flag;
flag = 0;
for (int j = 0 ; j < k ; j++) {

int order = NSOrderedAscending;

// 或 NSOrderedDescending
if ([[mutArray[j] description] compare:[mutArray[j+1] description]] == -order) 

{

tmpObj = mutArray[j]; mutArray[j] = mutArray[j+1]; mutArray[j+1] = tmpObj; flag = j;

} }

} }

延伸:C語言的冒泡排序: (1)冒泡法對一維數組中的元素進行排序 void sort(int arr[],int arr_len)
{

for(int i=0;i<arr_len-1;i++)//外層循環 {

for(int j=0;j<arr_len-1-i;j++)//藉助j實現一趟的次數 {

if(arr[j]>arr[j+1]) {

int temp=0; temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp;

} }

} }

(2)用指針數組給字符串排序
void sort_a(char * name[],int n) {

char *temp;
for(int i=0;i<n-1;i++) {

for(int j=0;j<n-1-i;j++) {

if(strcmp(name[j], name[j+1])>0)

{
temp=name[j]; name[j]=name[j+1]; name[j+1]=temp;

} }

} }

(3)給字符串數組排序
void rang(char str[][20],int n) {

for(int i=0;i<n-1;i++) {

for(int j=0;j<n-1-i;j++) {

int result=strcmp(str[j],str[j+1]); if(result>=0)
{

char temp[20]; strcpy(temp, str[j]); strcpy(str[j], str[j+1]); strcpy(str[j+1], temp);

} }

} }

七、簡述你對UIView、UIWindow和CALayer的理解

 

UIView:

屬於UIkit.framework框架,負責渲染矩形區域的內容,爲矩形區域添加動畫,響應區域的觸摸事件,佈局和管 理一個或多個子視圖 UIWindow:

屬於UIKit.framework框架,是一種特殊的UIView,一般在一個程序中只會有一個UIWindow,但能夠手 動建立多個UIWindow,同時加到程序裏面。UIWindow在程序中主要起到三個做用:

一、做爲容器,包含app所要顯示的全部視圖


二、傳遞觸摸消息到程序中view和其餘對象


三、與UIViewController協同工做,方便完成設備方向旋轉的支持

CAlayer:

屬於QuartzCore.framework,是用來繪製內容的,對內容進行動畫處理依賴與UIView來進行顯示,不能處 理用戶事件。

UIView和CALayer是相互依賴的,

UIView依賴CALayer提供內容,

CALayer依賴UIView一共容器顯示 繪製內容。

延伸: UIViewController:管理視圖的幾成熟,每一個視圖控制器都有一個自帶的視圖,而且負責這個視圖相關的一切事務。方便 管理視圖中的子視圖,負責model與view的通訊;檢測設備旋轉以及內存警告;是全部視圖控制類的積累,定義了控制器 的基本功能。

UIResponder的那張圖 􏵦􏵦􏵦􏵦􏵦􏵦􏵦􏵦􏵦􏵦􏵦􏵦􏵦􏵦􏵦􏵦􏵦􏵦􏵦􏵦􏵦􏵦􏵦􏵦􏵦􏵦􏵦 八、

寫一個完整的代理,包括聲明,實現
//建立

 


@protocol BeforeMarriedDelagate <NSObject> 

@required

-(void)doCook:(NSString *)foodName; 

-(void)doHomework;


@optional


-(void)driveCar;

-(void)makeMoney; 

@end

//聲明


@interface Boy : NSObject< BeforeMarriedDelagate>

-(void)doCook:(NSString *)foodName; 

-(void)doHomework;

 -(void)makeMoney;


//實現

@implementation 

Boy


-(void)doCook:(NSString *)foodName

{ NSLog(@"作飯:%@!",foodName);

}


-(void)doHomework

NSLog(@"今天洗衣服!");

}


-(void)makeMoney

NSLog(@"Coding!!");

}


@end


 

 

九、

分析json、xml的區別?

json、xml解析方式的底層是如何處理的?


區別:


(1)可讀性方面:

基本相同,xml的可讀性比較好


(2)可擴展性方面:

都具備很好的擴展性


(3)編碼難度方面:

相對而言:JSON的編碼比較容易

(4)解碼難度:

json的解碼難度基本爲零,xml須要考慮子節點和父節點

(5)數據體積方面:

json相對於xml來說,數據體積小,傳遞的速度更快些 

(6)數據交互方面:

json與JavaScript的交互更加方面,更容易解析處理,更好的數據交互 

(7)數據描述方面:

xml對數據描述性比較好


(8)傳輸速度方面:

json的速度遠遠快於xml

JSON底層原理:

遍歷字符串中的字符,最終根據格式規定的特殊字符,好比{}號,[]號, : 號 等進行區分,

{}號是一個字典 的開始,

[]號是一個數組的開始, 

: 號是字典的鍵和值的分水嶺,

最終乃是將json數據轉化爲字典,字典中值多是字典,數 組,或字符串而已。


XML底層原理: 

XML解析經常使用的解析方法有兩種:

DOM解析和SAX解析。

DOM

採用創建樹形結構的方式訪問 XML 文檔,

 

DOM 解析把 XML 文檔轉化爲一個包含其內容的樹,並能夠對樹進行遍歷。

使用 DOM 解析器的時候需 要處理整個 XML 文檔,因此對性能和內存的要求比較高。



SAX

採用的事件模型。 

SAX在解析 XML 文檔的時候能夠觸發一系列的事件,當發現給定的tag 的時候,它能夠激活一個回調方法,告訴該方法制定的標籤已經找到。

SAX 對內存的要求一般會比較低,由於它讓開發人員本身來決 定所要處理的tag。

特別是當開發人員只須要處理文檔中所包含的部分數據時,SAX 這種擴展能力獲得了更好的體現。 

 

延伸:SAX與DOM的區別: 

一、SAX處理的優勢很是相似於流媒體的優勢。

分析可以當即開始,而不是等待全部的數據被處理。

並且因爲應用程序只是 在讀取數據時檢查數據,所以不須要將數據存儲在內存中。

這對於大型文檔來講是個巨大的優勢。

事實上,應用程序甚至不 必解析整個文檔;它能夠在某個條件獲得 知足時中止解析。

通常來講,SAX 還比它的替代者 DOM 快許多。

另外一方面,由 於應用程序沒有以任何方式存儲數據,使用 SAX 來更改數據或在數據流中日後移是不可能的。


二、DOM 以及廣義的基於樹的處理具備幾個優勢。

首先,因爲樹在內存中是持久的,所以能夠修改它以便應用程序能對數 據和結構做出更改。

它還能夠在任什麼時候候在樹中上下 導航,而不是像 SAX 那樣是一次性的處理。

DOM 使用起來也要簡單 得多。

另外一方面,在內存中構造這樣的樹涉及大量的開銷。

大型文件徹底佔用系統內存容量的狀況並不鮮見。

此外,建立一 棵 DOM 樹多是一個緩慢的過程。


三、選擇 DOM 仍是選擇 SAX,這取決於下面幾個因素:


 

應用程序的目的:

若是打算對數據做出更改並將它輸出爲 XML,那麼在大多數狀況下,DOM 是適當的選擇。

並非說使 用 SAX 就不能更改數據,可是該過程要複雜得多,由於您必須對數據的一份拷貝而不是對數據自己做出更改。


數據容量: 

對於大型文件,SAX 是更好的選擇。

數據將如何使用:

若是隻有數據中的少許部分會被使用,那麼使用 SAX 來將該部分數據提取到應用程序中可能更好。 

另外一方面,若是您知道本身之後會回頭引用已處理過的大量信息,那麼 SAX 也許不是恰當的選擇。


對速度的須要:

SAX 實現一般要比 DOM 實現更快。


SAX 和 DOM 不是相互排斥的,記住這點很重要。

您能夠使用 DOM 來建立 SAX 事件流,也能夠使用 SAX 來建立 DOM 樹。

事實上,用於建立 DOM 樹的大多數解析器實際上都使用 SAX 來完成這個任務!


十、

ViewController 的 didReceiveMemoryWarning

是在何時被調用的?

默認的操做是什麼? 

 

當程序接到內存警告時ViewController將會收到這個消息:

didReceiveMemoryWarning

從iOS3.0開始,不須要重載這個函數,把釋放內存的代碼放到viewDidUnload中去。 

這個函數的默認實現是:檢查controller是否能夠安全地釋放它的view,若是view能夠被釋放,那麼這個函數釋放view並

調用viewDidUnload。

重載這個函數來釋放controller中使用的其餘內存。

但要記得調用這個函數的super實現來容許父 類(通常是UIVIewController)釋放view。 

若是你的ViewController保存着view的子view的引用,那麼,在早期的iOS版本中,你應該在這個函數中來釋放這些引 用。

而在iOS3.0或更高版本中,你應該在viewDidUnload中釋放這些引用。 

 

十一、面向對象的三大特徵,並做簡單的介紹。

面向對象的三個基本特徵是:

封裝、繼承、多態。


封裝

是面向對象的特徵之一,是對象和類概念的主要特性。 

封裝,也就是把客觀事物封裝成抽象的類,而且類能夠把本身的 數據和方法只讓可信的類或者對象操做,對不可信的進行信息隱藏。

隱藏對象的屬性和實現細節,僅對外公開接口,提升代 碼安全性,封轉程度越高,獨立性越強,使用越方便。 

 

繼承

是指這樣一種能力:

它能夠使用現有類的全部功能,並在無需從新編寫原來的類的狀況下對這些功能進行擴展。 

經過 繼承建立的新類稱爲「子類」或「派生類」。 

被繼承的類稱爲「基類」、「父類」或「超類」 

 

多態性:

容許你將父對象設置成爲和一個或更多的他的子對象相等的技術,賦值以後,父對象就能夠根據當前賦值給它的子 對象的特性以不一樣的方式運做。

簡單的說,就是一句話:容許將子類類型的指針賦值給父類類型的指針 

 

十二、

 

咱們說的obc是動態運行時語言是什麼意思?

多態。

主要是將數據類型的肯定由編譯時,推遲到了運行時。

這個問題其實淺涉及到兩個概念,

運行時和多態。

簡單來講, 運行時機制使咱們直到運行時纔去決定一個對象的類別,以及調用該類別對象指定方法。

多態:

不一樣對象以本身的方式響應 相同的消息的能力叫作多態。

意思就是假設生物類(life)都用有一個相同的方法-eat;那人類屬於生物,豬也屬於生物,都 繼承了life後,實現各自的eat,可是調用是咱們只需調用各自的eat方法。也就是不一樣的對象以本身的方式響應了相同的消 息(響應了eat這個選擇器)。所以也能夠說,運行時機制是多態的基礎 

 

 

 

1三、

readwrite,

readonly,

assign,

retain,

copy,

nonatomic 、

strong、

weak

屬性的做用?

並區別strong(強引用)、 weak(弱引用)?

什麼狀況使用copy,assign,和retain?

readwrite 

是可讀可寫特性;須要生成getter方法和setter方法時


readonly 

是隻讀特性 只會生成getter方法 不會生成setter方法 ;不但願屬性在類外改變


assign 

是賦值特性,setter方法將傳入參數賦值給實例變量;僅設置變量時;


retain 

表示持有特性,setter方法將傳入參數先保留,再賦值,傳入參數的retaincount會+1;


copy

表示賦值特性,setter方法將傳入對象複製一份;須要徹底一份新的變量時。


nonatomic 

非原子操做,決定編譯器生成的setter getter是不是原子操做,

atomic

表示多線程安全,通常使用 nonatomic
assign用於簡單數據類型,如NSInteger,double,bool。


retain 和copy用戶對象,copy用於當 a指向一個對象,b也想指向一樣的對象的時候,若是用assign,a若是釋放,再 調用b會crash,若是用copy 的方式,a和b各自有本身的內存,就能夠解決這個問題。

retain 會使計數器加1,也能夠解 決assign的問題。

另外:atomic和nonatomic用來決定編譯器生成的getter和setter是否爲原子操做。 

在多線程環境 下,原子操做是必要的,不然有可能引發錯誤的結果。 

 

 

1四、爲何不少內置類如UITableViewController的delegate屬性都是assign而不是retain的?

會引發循環引用----

如果retain,在alloc一次以後,若release一次,會致使內訓泄漏,若release兩次會致使兩個 對象的dealloc嵌套執行,結果就是都沒有執行成功,最後崩潰! 全部的引用計數系統,都存在循環應用的問題。例以下面的引用關係:

* 對象a建立並引用到了對象b. * 對象b建立並引用到了對象c. * 對象c建立並引用到了對象b.

這時候b和c的引用計數分別是2和1。 當a再也不使用b,調用release釋放對b的全部權,由於c還引用了b,因此b的引用計數爲1,b不會被釋放。 b不釋放,c的引用計數就是1,c也不會被釋放。今後,b和c永遠留在內存中。 這種狀況,必須打斷循環引用,經過其餘規則來維護引用關係。咱們常見的delegate每每是assign方式的屬性而不是 retain方式 的屬性,賦值不會增長引用計數,就是爲了防止delegation兩端產生沒必要要的循環引用。 

若是一個UITableViewController 對象a經過retain獲取了UITableView對象b的全部權,這個UITableView對象b的 delegate又是a,若是這個delegate是retain方式的,那基本上就沒有機會釋放這兩個對象了。

本身在設計使用 delegate模式時,也要注意這點。 

 

1五、

ObjC中,與retain配對使用的方法是dealloc仍是release,爲何?

須要與alloc配對使用的方法是dealloc仍是release,爲何?

與retain配對使用的方法是

release,由於retain使retainCount計數加1,release使retainCount計數減1;與 retain語義相反的是release。 

與alloc配對使用的是

release,由於:alloc是使retainCount計數加1,使retainCount計數減1。

與alloc語義相反的是dealloc,由於:alloc是建立一個對象,,dealloc是銷燬一個對象。

 

 

1六、

重寫一個NSStrng類型的,

retain方式聲明name屬性的

setter和getter方法

{

 NSString * _name; 

@property NSString *name;

----加上這些是爲了不錯誤

setter方法:


-(void)setName:(NSString*)name


{


{

[_name release];


_name=[name retain];


}


}

 


1七、

17.1分別描述內存管要點、autorelease、release、NSAutoreleasePool?

17.2並說明autorelease是何時被release的?

17.3簡述何時由你負責釋放對象,何時不禁你釋放?[NSAutoreleasePool release]和[NSAutoreleasePool drain]有什麼區別?

內存管理要點:

Objective-C 使用引用計數機制(retainCount)來管理內存。

每被引用一次,該內存的引用計數+1,

每被釋放一次引用計數-1。

當引用計數 = 0 的時候,調用該對象的 dealloc 方法,來完全從內存中刪除該對象。 

alloc,allocWithZone,new(帶初始化)時:該對象引用計數 +1;
retain:

手動爲該對象引用計數 +1;

copy:

對象引用計數 +1;


mutableCopy:

生成一個新對象,新對象引用計數爲 1;


release:

手動爲該對象引用計數 -1; 

autorelease:

把該對象放入自動釋放池,當自動釋放池釋放時,其內的對象引用計數 -1。


NSAutoreleasePool:

NSAutoreleasePool是經過接收對象向它發送的autorelease消息,記錄該對象的release消息,當自動釋放池被銷燬 時,會自動向池中的對象發送release消息。


autorelease 

是在自動釋放池被銷燬,向池中的對象發送release
只能釋放本身擁有的對象,

區別是:

在引用計數環境下(在不使用ARC狀況下),二者基本同樣,在

GC環境下,release 是一個no-op(無效操 做),因此不管是否是gc都使用drain


18

􏵧IPhone OS有沒有垃圾回收?

autorelease 和垃圾回收制(gc)有什麼關係? 

沒有。

autorelease只是延遲釋放,

gc是每隔一段時間詢問程序,看是否有無指針指向的對象,如有,就將它回收。

他們 二者沒有什麼關係。


 

 

1九、

drawRect和layoutSubviews的區別 

相同點:

兩個方法都是異步執行的,

不一樣點:

layoutSubviews方便數據計算,

drawRect方便視圖重繪。 

layoutSubviews對subviews從新佈局


layoutSubviews方法調用先於drawRect

 

 

20、

簡述

NotificationCenter、KVC、KVO、Delegate?

並說明它們之間的區別?􏵦

Notification 

是觀察者模式的實現,

KVO

是觀察者模式的OB-C底層實現。


NOtification 經過 Notifydcation addobserver 和 remove observer 工做。

KVO

是鍵值監聽,鍵值觀察機制,提供了觀察某一屬性變化的方法 

KVC

是鍵值編碼,是一種間接訪問對象的屬性,使用字符串來標示屬性(例如:setValue:forKey:) 

Delegate:

把某個對象要作的事情委託給別的對象去作。

那麼別的對象就是這個對象的代理,代替它來打理要作的 事。反映到程序中,首先要明確一個對象的委託方是哪一個對象,委託所作的內容是什麼。


區別:


 

2一、

線程與進程的區別和聯繫?


線程是進程的基本單位

相同點: 

進程和線程都是由操做系統所體會的程序運行的基本單元,

系統利用該基本單元實現系統對應用的併發性。 

 

主要差異是

不一樣的操做系統資源管理方式。

進程

有獨立的地址空間,一個進程崩潰後,在保護模式下 不會對其它進程產生影響,

線程

只是一個進程中的不一樣執行路徑。線程有本身的堆棧和局部變量,但線程之間沒有單獨的 地址空間,一個線程死掉就等於整個進程死掉,

因此多進程的程序要比多線程的程序健壯,

但在進程切換時,耗費資源較 大,效率要差一些。

但對於一些要求同時進行而且又要共享某些變量的併發操做,只能用線程,不能用進程。

 

2二、

22.1 - 簡述多線程的做用以及什麼地方會用到多線程?

 

(1)、多線程的做用:

能夠解決負載均衡問題,充分利用cpu資源 。

爲了提升CPU的使用率,採用多線程的方式去同時完成幾件事情而互不干擾,

(2)、應用場景:

處理大量的IO操做時或處理的狀況須要花大量的時間等等

好比:讀寫文件、視頻圖像的採集、處理、顯示保存等。



22.2 -OC實現多線程的方法有哪些?

 

(3)、ios有三種方法:

一、NSThread。

二、NSOperation。

三、GCD。



22.3 -談談多線程安全問題的幾種解決方案?

 

(4)解決方案:

使用鎖:

鎖是線程編程同步工具的基礎。

鎖可讓你很容易保護代碼中一大塊區域以便你能夠確保代碼的正 確性。

使用POSIX互斥鎖;

使用NSLock類;

使用@synchronized指令等。

 

 

22.4 -何爲線程同步,如何實現的?

 

getter方法 -(NSString*)name

{return _name if(_name!=name) }



22.5 -分線程回到主線程方法是什麼,有什麼做用?

(5)回到主線程的方法:

 dispatch_async(dispatch_get_main_queue(), ^{ });

做用:

主線程是顯示UI界面

子線程多數是進行數據處理

 

 

2三、

http和scoket通訊的區別?

socket鏈接相關庫,TCP,UDP的鏈接方法,

HTTP的幾種經常使用方式? 

http和scoket通訊的區別: 

http

是客戶端用http協議進行請求,發送請求時候須要封裝http請求頭,並綁定請求的數據,服務器通常有web服務器配 合(固然也非絕對)。 

http請求方式爲客戶端主動發起請求,服務器才能給響應,一次請求完畢後則斷開鏈接,以節省資源。服務器不能主動給客戶端響應(除非採起http長鏈接技術)。iphone主要使用類是NSUrlConnection。 

scoket

是客戶端跟服務器直接使用socket「套接字」進行鏈接,並無規定鏈接後斷開,因此客戶端和服務器能夠保持連 接通道,雙方均可以主動發送數據。

通常在遊戲開發或股票開發這種要求即時性很強而且保持發送數據量比較大的場合使 用。

主要使用類是CFSocketRef。 

UDP:

是用戶數據報協議:

主要用在實時性要求高以及對質量相對較弱的地方,但面對如今高質量的線路不是容易丟包除非 是一些擁塞條件下 ,如流媒體

 

TCP:

是傳輸控制協議:

是面鏈接的,那麼運行環境必然要求其可靠性不可丟包有良好的擁塞控制機制如http ftp telnet 等

http的經常使用方式:get,post

2四、

What is lazy loading?


什麼是懶加載模式?

就是懶漢模式,只在用到的時候纔去初始化。

也能夠理解成延時加載。 

我以爲最好也最簡單的一個列子就是tableView中圖片的加載顯示了。 

一個延時載,避免內存太高

一個異步加載,避免線程堵塞。 

 

2五、

你鏈接服務器用的是什麼方法?

若是請求過程當中,網絡出了問題這麼辦?


NSUrlConnection 

鏈接後,有一系列委託方法來接受來自服務器的響應和數據,其中接受相應的方法回獲得服務器要傳 回的數據有多大,接受數據的方法會反覆調用來不斷接受服務器數據

若是網絡出了問題了

會調用一個方法讓你來作相關 處理。 

 

2六、

OC有多繼承嗎?

沒有的話能夠用什麼方法替代?

 

---多繼承即

一個子類能夠有多個父類,它繼承了多個父類的特性。

Object-c的類沒有多繼承,只支持單繼承,

若是要實現多繼承的話,

能夠經過類別和協議的方式來實現

OC相似於多繼承,是在 用protocol委託代理來實現的;

能夠實現多個接口,經過實現多個接口能夠完成C++的多重繼承;

Category是類別,一 般狀況用分類好,用Category去重寫類的方法,僅對本Category有效,不會影響到其餘類與原有類的關係。 

 

2七、

什麼是Protocol?

什麼是代理?

寫一個委託的interface?

委託的property聲明用什麼屬性?爲何?

 

Protocol:

一個方法簽名的列表,在其中能夠定義若干個方法。

根據配置,遵照協議的類,會實現這個協議中的若干個方 法。

代理:

實現這個協議中的方法的類
委託的

interface:

聲明一個某協議的屬性

delagate
用assgin屬性,緣由是,爲了不循環引用。

 

 

2八、

分別描述類別(categories)和延展(extensions)是什麼?

以及二者的區別?

繼承和類別在實現中有何區別?

爲何Category只能爲對象添加方法,卻不能添加成員變量?

 

類別:

在沒有原類.m文件的基礎上,給該類添加方法;

延展:

一種特殊形式的類別,主要在一個類的.m文件裏聲明和實現延展的做用,就是給某類添加私有方法或是私有變量。 

兩個的區別:

延展能夠添加屬性而且它添加的方法是必需要實現的。

延展能夠認爲是一個私有的類目。 

繼承和類別在實現中的區別:

類別能夠在不獲悉,不改變原來代碼的狀況下往裏面添加新的方法,只能添加,不能刪除修 改。

而且若是類別和原來類中的方法產生名稱衝突,則類別將覆蓋原來的方法,由於類別具備更高的優先級。

Category只能爲對象添加方法,卻不能添加成員變量的緣由:

若是能夠添加成員變量,添加的成員變量沒有辦法初始 化----這是語言規則


 

 

2九、

寫一個NSString類的實現

+ (id)initWithCString:(constchar *)nullTerminatedCString encoding:

(NSStringEncoding)encoding;

NSString *obj;

obj = [self allocWithZone: NSDefaultMallocZone()];

obj = [obj initWithCString: nullTerminatedCString encoding: encoding]; 

return [obj autorelease];

}

30、

Objective-C有私有方法麼?

私有變量呢?

如多沒有的話,有沒有什麼代替的方法?

objective-c類裏面的方法只有兩種, 靜態方法和實例方法.

可是能夠經過把方法的聲明和定義都放在.m文件中來實現一個表 面上的私有方法。

有私有變量,

能夠經過@private來修飾,或者把聲明放到.m文件中。在Objective‐C中,全部實例變 量默認都是私有的,全部實例方法默認都是公有的

 


3一、

#import、#include和@class有什麼區別 

@class

通常用於頭文件中須要聲明該類的某個實例變量的時候用到,它只是聲明瞭一個類名,關於這個類的內部實現都沒 有告訴編譯器

在m文件中仍是須要使用#import。

而#import比起#include的好處就是不會引發交叉編譯。

 

 

3二、

談談你對MVC的理解?

 

MVC就是Model-View-Controller的縮寫

M

指的是業務模型

V

指的是用戶頁面

C

指的是控制器。

 

爲何要用MVC?

MVC

是架構模式,是將M和 V的代碼分離,從而使同那個一個程序能夠使用不一樣的表現形式。 

 

在Cocoa中MVC是怎麼實現的?

M:

表示數據和業務規則

V

是用戶看到的並與之交互的頁面

C

是接受用戶的輸入並調用M和V取完成用戶需求的 

 

你還熟悉其餘的OC設計模式或別的設計模式嗎?

單例,

代理,

觀察者,

工廠模式

等 

單例模式:

說白了就是一個類不經過alloc方式建立對象,而是用一個靜態方法返回這個類的對象。

系統只須要擁有一個全局對象,這樣有利於咱們協調系統總體的行爲; 

代理模式:

代理模式給某一個對象提供一個代理對象,並由代理對象控制對源對象的引用.

好比一個工廠生產了產品,並不想 直接賣給用戶,而是搞了不少代理商,用戶能夠直接找代理商買東西,代理商從工廠進貨.

常見的如QQ的自動回覆就屬於代理攔截,代理模式在iphone中獲得普遍應用.

觀察者模式: 

當一個物體發生變化時,會通知全部觀察這個物體的觀察者讓其作出反應。

實現起來無非就是把全部觀察者的 對象給這個物體,當這個物體的發生改變,就會調用遍歷全部觀察者的對象調用觀察者的方法從而達到通知觀察者的目的; 

 

 

3三、

如監測系統鍵盤的彈出


- (id) init

{


self = [super init]; 

if (self)


{

NSNotificationCenter *center = [NSNotificationCenter defaultCenter];


[center addObserver:self selector:@selector(keyboardDidShow)

name:UIKeyboardDidShowNotification object:nil];


[center addObserver:self selector:@selector(keyboardDidHide)

name:UIKeyboardWillHideNotification object:nil];

 _keyboardIsVisible = NO;

}

return self; }

      

 -  (void)keyboardDidShow 

{ 


_keyboardIsVisible = YES;

 }

  -  (void)keyboardDidHide 

{


_keyboardIsVisible = NO; 

}

    -  (BOOL)keyboardIsVisible

 {


return _keyboardIsVisible; 

 

 

 


3四、

 

objective-c中的詞典對象、可變詞典對象是哪一個?

初始化一個含有兩個鍵值對的可變詞典對象,並動態的添 加和刪除一條記錄,輸出第一條記錄

詞典NSDictionary,

可變詞典NSMutableDictionary,

 //初始化一個可變詞典,帶有2個鍵值對


NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2",nil]; 

//添加

[dic setObject:@"value3" forKey:@"key3"]; 

//刪除


[dic removeObjectForKey:@"key3"]; 

//獲取(按key獲取)

[dic objectForKey:@"key1"];

 

 

 

3五、

c和obj-c如何混用? 

1)obj-c的編譯器處理後綴爲m的文件時,能夠識別obj-c和c的代碼,

處理mm文件能夠識別obj-c,c,c++代碼,

但cpp文件必須只

能用c/c++代碼,並且cpp文件include的頭文件中,也不能出現obj- c的代碼,由於cpp只是cpp。


2) 在mm文件中混用cpp直接使用便可,

因此obj-c混cpp不是問題


3)在cpp中混用obj- c其實就是使用obj-c編寫的模塊是咱們想要的。

若是模塊以類實現,那麼要按照cpp class的標準寫類的定義,頭文件中不能出現obj-c的東西,包括#import cocoa的。 

實現文件中,即類的實現代碼中能夠使用obj-c的東西,能夠import,只是後綴是mm。

若是模塊以函數實現

那麼頭文件要按 c的格 式聲明函數,實現文件中

c++函數內部能夠用obj-c,但後綴仍是mm或m。

 

總結:

1 - 只要cpp文件和cpp include的文件中不包含 obj-c的東西就能夠用了

2 - cpp混用obj-c的關鍵是使用接口,而不能直接使用實現代碼

3 - 實際上cpp混用的是obj-c編譯後的o文 件,這個東西實際上是無差異的,因此能夠用。

4 - obj-c的編譯器支持cpp。

 

 


3六、

舉出5個以上你所熟悉的ios sdk庫有哪些和第三方庫有哪些?
ios-sdk:

1 - 
Foundation.

2 - framework

3 - CoreGraphics

4 - framework

5 - UIKit.framework,

6 - MediaPlayer

7 - framework,

8 - CoreAudio

9 - framework


第三方庫: 

1.json編碼解碼;

2.ASIHTTPRequest等相關協議封裝;

3.EGORefreshTableHeaderView下拉刷新代 碼;

4.AsyncImageView 異步加載圖片並緩存;

5.SDWebImage——簡化網絡圖片處理 

 

 

3七、

objc優缺點----

OC的特色:

id類型,動態


objc優勢:


1)Cateogies

 2)Posing 

3)動態識別 

4)指標計算

5)彈性訊息傳遞


6)不是一個過分複雜的C衍生語言 

7)Objective-C與C++可混合編程


缺點:


1)不支援命名空間 

2)不支持運算符重載 

3)不支持多重繼承 

4)使用動態運行時類型,全部的方法都是函數調用,因此不少編譯時優化 方法都用不到。(如內聯函數等),性能低劣。

 

 

3八、

UITableView的重用機制?

如何在一個view上顯示多個tableView,tableView要求不一樣的數據源以及不一樣的樣式 (要求自定義cell),

如何組織各個tableView的delegate和dataSource?

請說說實現思路?

在一個tableView 中須要自定義多種樣式的cell(兩種或三種),一般你如何實現,說說思路便可?

UITableView的那些元素是能夠自 定義的?

 

UITableView的重用機制:

查看UITableView頭文件,會找到NSMutableArray*visiableCells,和NSMutableArray*reusableTableCells兩 個結構。

visiableCells內保存當前顯示的cells,

reusableTableCells保存可重用的cells。

TableView顯示之初,reusableTableCells爲空,那麼
tableView dequeueReusableCellWithIdentifier:CellIdentifier返回nil。

開始的cell都 是經過 

[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] 

來創 建,並且cellForRowAtIndexPath只是調用最大顯示cell數的次數。 

好比:有100條數據,iPhone一屏最多顯示10個cell。程序最開始顯示TableView的狀況是:

1. 

[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] 

建立10次cell,並給cell指定一樣的重用標識(固然,能夠爲不一樣顯示類型的cell指定不一樣的標識)。

而且10個cell所有都加 入到 visiableCells數組,reusableTableCells爲空。


2. 向下拖動tableView,當cell1徹底移出屏幕,而且 cell11(它也是alloc出來的,緣由同上)徹底顯示出來的時候。 cell11加入到visiableCells,cell1移出 visiableCells,cell1加入到reusableTableCells。

3. 接着向下拖動tableView,由於reusableTableCells中已 經有值,因此,當須要顯示新的cell, cellForRowAtIndexPath再次被調用的時 候,
tableView dequeueReusableCellWithIdentifier:CellIdentifier,返回cell1。

cell1加入到visiableCells,cell1 移出reusableTableCells;cell2移出 visiableCells,cell2加入到reusableTableCells。

以後再須要顯示的Cell就可 以正常重用了􏰠

 

 

3九、

一個tableView是否能夠關聯兩個不一樣的數據源?

你會怎麼處理? 

首先從代碼來看,數據源如何關聯上的,其次是在數據源關聯的代理方法裏實現的。

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath {

if(indexPath.section == 0) {}
if(indexPath.section == 1) {}

}

 

 

40、

 

OC中有哪些數據存儲方式,各有什麼區別?


四種存儲方式: 

1.NSUserDefaults

用於存儲配置信息

2.SQLite

用於存儲查詢需求較多的數據

3.CoreData

用於規劃應用中的對象

 

4.使用基本對象類型定製的個性化緩存方案. 

 

NSUserDefaults:

對象中儲存了系統中用戶的配置信息,開發者能夠經過這個實例對象對這些已有的信息進行修改,也 能夠按照本身的需求建立新的配置項。

SQLite

擅長處理的數據類型其實與NSUserDefaults差很少,也是基礎類型的小數據,只是從組織形式上不一樣。

開發者可 以以關係型數據庫的方式組織數據,使用SQL DML來管理數據。

通常來講應用中的格式化的文本類數據能夠存放在數據庫 中,尤爲是相似聊天記錄、Timeline等這些具備條件查詢和排序需求的數據。 

CoreData

是一個管理方案,它的持久化能夠經過SQLite、XML或二進制文件儲存。

它能夠把整個應用中的對象建模並進 行自動化的管理。

從歸檔文件還原模型時CoreData並非一次性把整個模型中的全部數據都載入內存,而是根據運行時狀 態,把被調用到的對象實例載入內存。

框架會自動控制這個過程,從而達到控制內存消耗,避免浪費。 

不管從設計原理仍是使用方法上看,CoreData都比較複雜。

所以,若是僅僅是考慮緩存數據這個需求,CoreData絕對不 是一個優選方案。

CoreData的使用場景在於:

整個應用使用CoreData規劃,把應用內的數據經過CoreData建模,徹底 基於CoreData架構應用。

使用基本對象類型定製的個性化緩存方案:從需求出發分析緩存數據有哪些要求:按Key查找,快速讀取,寫入不影響正常 操做,不浪費內存,支持歸檔。

這些都是基本需求,那麼再進一步或許還須要固定緩存項數量,支持隊列緩存,緩存過時 等。

 


4一、

 

 

ios平臺怎麼作數據的持久化?

coredata和sqlite有無必然聯繫?

coredata是一個關係型數據庫嗎?

 

 iOS中能夠有四種持久化數據的方式: 

屬性列表、

對象歸檔、

SQLite3

和Core Data 

coredata

能夠使你以圖形界面的方式快速的定義app的數據模型,同時在你的代碼中容易獲取到它。

coredata

提供了基礎結構去處 理經常使用的功能,例如保存,恢復,撤銷和重作,容許你在app中繼續建立新的任務。

在使用coredata的時候,你不用安裝額外的數據庫系統,由於coredata使用內置的sqlite數據庫。

coredata將你app的模型層放入到一組定義在內存中的數據對象。

coredata會 追蹤這些對象的改變,同時能夠根據須要作相應的改變,例如用戶執行撤銷命令。

當coredata在對你app數據的改變進行保存的時 候,core data會把這些數據歸檔,並永久性保存。


mac os x中sqlite庫,它是一個輕量級功能強大的關係數據引擎,也很容易嵌入到應用程序。

能夠在多個平臺使用,sqlite是一個輕 量級的嵌入式sql數據庫編程。與coredata框架不一樣的是,sqlite是使用程序式的,sql的主要的API來直接操做數據表。


Core Data不是一個關係型數據庫,也不是關係型數據庫管理系統(RDBMS)。

雖然Core Data支持SQLite做爲一種存儲類型, 但它不能使用任意的SQLite數據庫。

Core Data在使用的過程種本身建立這個數據庫。

Core Data支持對1、對多的關係。

 

 

4二、

OC中的數字對象都有哪些,

簡述它們與基本數據類型的區別是什麼

 


Objective-C中的數字對象

NSNumber; 

Objective-C中的基本類型和C語言中的基本類型同樣.主要有:

int,

long,

float,

double,

char,

void,

bool

等. 對於基本類型變量,不須要用指針,也不用手動回收,方法執行結束會自動回收.

 

數字對象須要指針,也須要手動回收內存。

 

 

4三、

什麼是動態識別,

動態綁定?

延展--程序的編譯過程

 

 

4四、

單件實例是什麼?


 

Foundation 和 Application Kit 框架中的一些類只容許建立單件對象,即這些類在當前進程中的惟一實例。

舉例來講, NSFileManager 和NSWorkspace 類在使用時都是基於進程進行單件對象的實例化。

當向這些類請求實例的時候,它們 會向您傳遞單一實例的一個引用,若是該實例還不存在,則首先進行實例的分配和初始化。

單件對象充當控制中心的角色, 負責指引或協調類的各類服務。

 

 


4五、

如何將產品進行多語言發佈?

程序國際化;


好比:

本地化應用程序名稱

(

一、選中工程,Info—Localizations點擊「+」添加要國際化的語言。 

(二、在InfoPlist.strings右邊會多出一個三角形,點擊展開可看到InfoPlish.strings(english)和

InfoPlish.strings(chinese)兩個版本的文件; 

(三、在InfoPlish.strings(english)文件中加入:

CFBundleDisplayName ="Program"; 

其中「Program」爲英文應用程序名稱,同理在InfoPlish.strings(chinese)文件中加入: 

CFBundleDisplayName ="應用程序"; 其中「應用程序」爲中文名稱,注意:CFBundleDisplayName加不加雙引號都行;

(四、編輯Info.plist,添加一個新的屬性Application has localized display name, 設置其類型爲boolean,並將其 value設置爲YES便可。

 

 

 

4六、

 

什麼是動態連接庫和靜態連接庫?

調用一個類的靜態方法需不須要release?

 

􏵦程序的編譯過程

--連接--- 

靜態鏈接庫

就是把(lib)文件中用到的函數代碼直接連接進目標程序,程序運行的時候再也不須要其它的庫文件;

動態連接

就是 把調用的函數所在文件模塊 (DLL)和調用函數在文件中的位置等信息連接進目標程序,程序運行的時候再從DLL中尋找 相應函數代碼,所以須要相應DLL文件的支持。

靜態連接庫和動態連接庫的另一個區別在於靜態連接庫中不能再包含其餘的動態連接庫或者靜態庫,而在動態連接庫中還 能夠再包含其餘的動態或靜態連接庫。

動態的是:

運行時才加載到內存中,

靜態:

編譯時就加載到內存中 

靜態方法也就是類方法,

不須要release 

 

 

 

4七、
聲明一個靜態方法和一個實例方法? 

 

解釋:就是類方法和對象方法,

 

 

4八、什麼是push?

遠程推送?


 

第一步:

UIApplication向APNS註冊push notification服務


一、應用程序 要支持 推送服務(在網頁裏配置) (1)https://developer.apple.com/devcenter/ios/index.action


(2)登陸 蘋果開發者帳號(注意是收費帳號,$99或$299) 

3)下載push證書(主要是給程序簽名,push服務只有收費開發者才具有。

因此須要簽名驗證),若是沒有 push證書,建立一個push證書(App ID->鑰匙串程序生成request->push證書)注意事項:App ID的 Bundle ID必須和程序plist文件裏的Bundle identifier一致。

App ID一旦生成,將不可修改。

(4)把證書安裝到鑰匙串裏(雙擊證書文件)


(5)生成 編譯程序 用的描述文件(網頁裏進行) 

二、向APNS註冊push服務(UIApplication的registerForRemoteNotificationTypes:方法)


 

 

第二步 

獲取APNS分配的DeviceToken(64位16進制串)


- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken


 

第三步 

把DeviceToken發送給本身的後臺服務器,服務器記錄每臺設備的DeviceToken以便往後推送信息給客 戶端。

(須要有一個網絡接口,讓客戶端發送DeviceToken)


 

第四步 

服務器推送信息給客戶端 

一、服務器除了須要有客戶端的DeviceToken以外,還要有push證書,對push的內容進行簽名。

(蘋果爲了防 止 惡意向客戶端(好比DeviceToken泄露了)發送消息,每次推送消息,都須要證書進行簽名,從而避免黑客惡 意攻擊用戶手機。)

 二、若是你的服務器是java寫的,能夠直接使用鑰匙串導出的p12文件(證書和密鑰一塊兒導出)。

若是你的服務器 是php寫的,由於php語言不支持p12文件類型,須要轉換爲pem文件。


三、將p12轉換爲pem文件:終端 先找到你p12所在的目錄 openssl pkcs12 -in CertificateName.p12 - outCertificateName.pem -nodes


四、服務器發送信息給APNS,APNS自動將信息推送給客戶端


 

第五步 

客戶端處理收到的信息
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo


 

注意事項􏵨

一、測試版的push證書僅僅用於開發期間測試,發佈版的程序須要生成一個發佈版的push證書。 

二、測試版APNS的ssl地址和發佈版的ssl地址不一樣

三、測試版的DeviceToken和發佈版的DeviceToken也不一樣


四、php文件要和pem文件放在同一目錄。


五、除了alert sound和badge以外,json串裏還能夠包含自定義信息。


六、推送的信息最大255字節

七、推送的信息受網絡影響較大,有可能形成延遲甚至丟失,重要信息的傳遞不該該使用push通知,應該有專門的 後臺接口。

八、藉助push推送,兩個客戶端能夠實現即時通訊,工程裏面存放咱們的p12文件,客戶端本身組織json串,發 送請求到APNS。

 


4九、

什麼是沙箱模型?

哪些操做是屬於私有api範疇? 

 

某個iphone工程進行文件操做有此工程對應的指定的位置,不能逾越。 iphone常見私有api的應用(好比直接發送短信,訪問沙箱以外的磁盤文件).

 

50、如何將敏感字變成** 延展---幾個字變爲幾個*如何實現?

調用stringByReplacingOccurrencesOfString:withString:

給定字符串,指定替換字,替換**

 

5一、

iphone閱讀器,若是要讀取一個文本文件,請問你是如何處理編碼問題的?

另外像pdf格式的文件,你如何讀

取?

首先檢測文本編碼格式(只需讀取小部分用來判斷), iphone手機閱讀器中對於PDF格式的閱讀,能夠直接用UIWebView控件顯示,也能夠從網上下到不少直接讀取pdf格式 的代碼
直接從pdf中獲得數據。

複雜表格動畫

- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;

 


-(void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation: (UITableViewRowAnimation)animation;

 

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation; 

 

 

5二、

在開發大型項目的時候,如何進行內存泄露檢測的? 

內存泄露怎麼處理?


 

如何檢測內存泄露:


能夠經過xcode的自帶工具

run---

start with performance tool裏有

instruments

下有個leaks工具,

啓動此工具 後,運行項目,工具裏能夠顯示內存泄露的狀況,雙擊可找到源碼位置,能夠幫助進行內存泄露的處理。

如何處理:先定位到具體位置, 再解決之。

 


5三、

iphone app爲何會被打回來,如何制止? 􏵦

app的設置界面、按鈕使用了相似iphone的操做方式以及icon的圓角設計 

-> 從新設計⋯
app的年齡設置過低

-> 改了年齡⋯
app裏有實物獎勵

-> 免責聲明,和蘋果無關⋯
app描述裏提了後續版本的功能的字樣 

-> 刪除⋯
app有打分的功能 

-> 有reject的,也有經過的⋯
app須要使用location,沒有提示用戶

-> 加了提示,容許用戶拒絕⋯
app沒提供測試帳號

-> 提供⋯

app裏有私有api

 -> 修改⋯ 應用內含有有某公司LOGO的圖片,沒有該公司受權文件,

被拒-> 修改⋯

第三方靜態庫包含私有api的調用(聯繫第三方技術支持,更新靜態庫); 包含潛在的色情,暴力等內容(調整應用年齡限制等級,並加入舉報功能) 作瀏覽器的,分級必須選17+

 

5四、
iphone應用程序的項目基本結構?
·

 Classes 

-> 源程序文件(.h、.m)
· Other Sources

-> main.m 等,不須要程序員修改 -Prefix.pch
· Resources 

-> 界面文件(.xib)、配置文件-info.plist
· Framewor

ks -> 連接的庫· Targets 

-> 項目的不一樣Target(資源、編譯配置不一樣)
· Executables 

-> 項目中全部的可執行文件 -Prefix.pch:_Prefix爲全部的項目程序文件預先配置運行環境的前綴標頭,在程序運行以前,引入所需框架中的(.h)頭文 件。這樣能夠減小每一個頭文件對程序編譯作出相同的定義,在巨型的應用程序項目開發中節省大量的時間,例如,程序有 100個根文件須要定義abc.h,只須要在_Preix.pch文件下創建一個對象,全部的根文件即可以重複地對程序編譯作出定 義。

 

 

5五、請寫出代碼,用blocks來取代上例中的protocol,並比較兩種方法的優點。實際應用部分?請寫出代碼,用

blocks取代協議或回調方法

 

 

5六、你作iphone開發時候,有哪些傳值方式,view和view之間是如何傳值的? block, target-action ,代理,屬性,

 

5七、給定的一個字符串,判斷字符串中是否還有png,有就刪除它? 

NSMutableString *mstr=[NSMutableString stringWithFormat:@"ccc"];

NSRange substr = [mstr rangeOfString:@"png"];

 //字符串查找,能夠判斷字符串中是否有

if (substr.location != NSNotFound) 

{


[mstr deleteCharactersInRange:substr];

}

 

 

5八、

編譯語言和解釋語言的區別 

 

區別:

C語言,OC語言屬於編譯語言;

解釋語言:

也能夠理解爲腳本文件,不須要編譯, 編譯型語言寫的程序執行以前,須要一個專門的編譯過程,把程序編譯成爲機器語言的文件,好比exe文件,之後要運行的 話就不用從新翻譯了,直接使用編譯的結果就好了(exe文件),由於翻譯只作了一次,運行時不須要翻譯,因此編譯型語 言的程序執行效率高,但也不能一律而論,部分解釋型語言的解釋器經過在運行時動態優化代碼,甚至可以使解釋型語言的 性能超過編譯型語言。

解釋則不一樣,解釋性語言的程序不須要編譯,省了道工序,解釋性語言在運行程序的時候才翻譯, 好比解釋性basic語言,專門有一個解釋器可以直接執行basic程序,每一個語句都是執行的時候才翻譯。

這樣解釋性語言每 執行一次就要翻譯一次,效率比較低。

解釋是一句一句的翻譯。

 

 


5九、

對於語句

NSString* testObject = [[NSData alloc] init];

testObject 在編譯時和運行時分別是什麼類型的對

象?

編譯時是NSString,運行時是NSDate

 

 

60、

給用戶推送的通知的僞代碼


 

6一、

ViewController的 loadView, viewDidLoad,viewWillAppear,viewDidUnload,dealloc、init分別是在什麼時

候調用的?

在自定義ViewController的時候這幾個函數裏面應該作什麼工做?

 

一、viewDidLoad

此方法只有當view從nib文件初始化的時候才被調用

二、viewDidUnload
當系統內存吃緊的時候會調用該方法,在該方法中將全部IBOutlet(不管是property仍是實例變量) 置 爲nil(系統release view時已經將其release掉了)在該方法中釋放其餘與view有關的對象、其餘在運行時建立(但 非系統必須)的對象、

在viewDidLoad中 被建立的對象、緩存數據等 release對象後,將對象置爲nil(IBOutlet只須要 將其置爲nil,系統release view時已經將其release掉了)

 dealloc

方法,viewDidUnload和dealloc方法沒有關聯,dealloc仍是繼續作它該作的事情
流程應該是這樣:
(loadView/nib文件)來加載view到內存 

-->viewDidLoad函數進一步初始化這些view 

-->內存不足時,調用 viewDidUnload函數釋放views 

-->當須要使用view時有回到第一步
如此循環

四、viewWillAppear

方法,視圖即將過渡到屏幕上時調用,(通常在返回須要刷新頁面時,我都選擇使用代理,因此不多用到) 

 

五、viewWillDisappear

方法,這個A->B以後,A在B以後的操做

 


6二、描述程序啓動的順序
􏵦 

一、main.m是程序的入口

二、UIApplicationMain()建立應用程序對象,而且爲此對象指定委託,檢測程序的執行,同時開啓事件循環,處理程序接收到的事 件

三、UIApplicationDelegate方法的執行 

四、加載window


五、指定根視圖控制器 

六、在指定的試圖控制器中添加控件,實現應用程序界面

 

 

6三、

OC中全部對象間的交互是如何實現的?

經過指針實現的 

 

6四、

objective-c中的類型轉換分爲哪幾類? 

可變與不可變之間的轉化; 可變與可變之間的轉化;

不可變與不可變之間。

 

 

6五、獲取項目根路徑,並在其下建立一個名稱爲userData的目錄? 

1 - // 獲取根路徑

NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); 

NSString *documentsDirectory = [paths objectAtIndex:];

2 - 
// 建立文件系統管理器


NSFileManager *fileManager = [[NSFileManager alloc] init];

3 - // 判斷userData目錄是否存在


if(![fileManager fileExistsAtPath:[NSString stringWithFormat:@"%@/userData", documentsDirectory]]) 

4 - // 若是不存在,建立一個userData目錄


[fileManager createDirectoryAtPath:[NSString stringWithFormat:@"%@/userData", documentsDirectory]withIntermediateDirectories:false attributes:nil error:nil];
}

 

 

6六、

目標-動做機制 

目標是動做消息的接收者。

一個控件,或者更爲常見的是它的單元,以插座變量的形式保有其動做消息的目標。

動做是控件發送給目標的消息,或者從目標的角度看,它是目標爲了響應動做而實現 的方法。

程序須要某些機制來進行事件和指令的 翻譯。

這個機制就是目標-動做機制。


參考target-action


 

 

6七、

淺複製和深複製的區別? 

 

淺層複製(copy):

只複製指向對象的指針,

而不復制引用對象自己。

//經過對象的指針來訪問這個對象

----只賦值地址 

深層複製(mutableCopy):

複製引用對象自己

---再建立一個對象 

意思就是有個A對象,複製一份後獲得A_copy對象後,對於淺複製來講,A和A_copy指向的是同一個內存資源,複製的 只不過是是一個指針,對象自己資源 仍是隻有一份,那若是咱們對A_copy執行了修改操做,那麼發現A引用的對象一樣被修改,這其實違背了咱們複製拷貝的一 個思想。

深複製就好理解了,內存中存在了

兩份獨立對象自己。

//當修改A時,A copy不變。

 

 

6八、

oc中可修改和不能夠修改類型 可修改不可修改的集合類。

這個我我的簡單理解就是可動態添加修改和不可動態添加修改同樣。

好比NSArray和 NSMutableArray。

前者在初始化後的內存控件就是固定不可變的,後者能夠添加等,能夠動態申請新的內存空間。

 

6九、

 

什麼是安全釋放?


[_instance release],

_instance = nil;


 

70、

類變量的

@protected 

@private

@public

@package

聲明各有什麼含義? 

變量的做用域不一樣,

@protected 

該類和全部子類中 的方法能夠直接訪問這樣的變量,這是默認的;
@private 

該類中的方法能夠訪問這樣的變量,子類不能夠; 

@public除了本身和子類方法外,也能夠被其餘類或者其餘模塊中的方法訪問;


@package 

目前還沒有得出結論


 

71􏵦 . 

OC中異常exception 怎麼捕獲?

不一樣的CPU結構上開銷怎樣?

C中又什麼相似的方法? 

瞭解一下異常捕獲
CPU的開銷:

 

 

7二、

關於Objective-C++中的異常處理,能夠相互捕獲到嗎?


不能夠;

 


7三、

for(int index = 0; index < 20; index ++)

{

NSString *tempStr =

@」tempStr」;

NSLog(tempStr);

NSNumber *tempNumber = [NSNumber numberWithInt: 2];

NSLog(tempNumber);

 

}

這段代碼有什麼問題.?

會不會形成內存泄露(多線程)?

在內存緊張的設備上作大 循環時自動釋放池是寫在循環內好仍是循環外好?

爲何?

 

 

7四、

什麼是序列化或者Acrchiving,能夠用來作什麼,怎樣與copy結合,原理是什麼?.


序列化就是:歸檔

 

7五、

runloop是什麼?

在主線程中的某個函數裏調用了異步函數,怎麼樣block當前線程,且還能響應當前線程的

timer事件,touch事件等

---NSRunLoop,NSTimer須要本身實現

----GCD的返回主線程的方法,看前面的題

run loop,

正如其名稱所示,是線程進入和被線程用來響應事件以及調用事件處理函數的地方。

須要在代碼中使用控制語 句實現run loop的循環,也就是說,須要代碼提供while 或者 for循環來驅動run loop。

在這個循環中,使用一個 runloop對象

[NSRunloop currentRunloop]

執行接收消息,調用對應的處理函數。

 

7六、描述下拉刷新的實現機制?

獲取數據,刷新頁面

 

7七、

什麼是沙盒?

沙盒包含哪些文件,描述每一個文件的使用場景。

如何獲取這些文件的路徑?

如何獲取應用程序包 中文件的路徑?

沙盒

是某個iphone工程進行文件操做有此工程對應的指定的位置,不能逾越。 包括:四個文件夾:

documents,

tmp,

app,

Library。 
手動保存的文件在documents文件裏。

Nsuserdefaults保存的文件在tmp文件夾裏。

Documents 目錄:

您應該將全部de應用程序數據文件寫入到這個目錄下。

這個目錄用於存儲用戶數據或其它應該按期備 份的信息。

AppName.app 目錄:

這是應用程序的程序包目錄,包含應用程序的自己。

因爲應用程序必須通過簽名,因此 您在運行時不能對這個目錄中的內容進行修改,不然可能會使應用程序沒法啓動。

Library 目錄:

這個目錄下有兩個子目 錄:Caches 和 Preferences

Preferences 目錄包含應用程序的偏好設置文件。
您不該該直接建立偏好設置文件,而是 應該使用NSUserDefaults類來取得和設置應用程序的偏好.

Caches 目錄用於存放應用程序專用的支持文件,保存應用程 序再次啓動過程當中須要的信息。

tmp 目錄:這個目錄用於存放臨時文件,保存應用程序再次啓動過程當中不須要的信息。

獲取這些目錄路徑的方法:


1,獲取家目錄路徑的函數:


NSString *homeDir = NSHomeDirectory();


2,獲取Documents目錄路徑的方法:


NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);


NSString *docDir = [paths objectAtIndex:0];


3,獲取Caches目錄路徑的方法:


NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);


NSString *cachesDir = [paths objectAtIndex:0];


4,獲取tmp目錄路徑的方法:


NSString *tmpDir = NSTemporaryDirectory();


5,獲取應用程序程序包中資源文件路徑的方法:


例如獲取程序包中一個圖片資源

(apple.png)路徑的方法:


NSString *imagePath = [[NSBundle mainBundle] pathForResource:@」apple」 ofType:@」png」]; 

UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath]; 代碼中的mainBundle類方法用於返回一個表明應用程序包的對象。

 


7八、

介紹一下XMPP?

有什麼優缺點嗎?


 

XMPP(Extensible Messaging and Presence Protocol,前稱)

是一種以XML爲基礎的開放式實時通訊協議

是經由互聯網工程工做小組(IETF)經過的互聯網標準。

簡單的說,XMPP就是一種協議,一種規定。

就是說,在網絡上傳東西,要創建鏈接,TCP/IP鏈接,創建後再傳東西

而XMPP就是規定你傳的東西的格式。

XMPP是基於XML的協議。 

優勢
開放:

XMPP協議是自由、開放、公開的,而且易於瞭解。 

並且在客戶端 、服務器 、組件源碼庫等方面,都已經各自有多種實現。

標準:

互聯網工程工做小組( IETF )已經將Jabber的核心XML流協議以XMPP之名,正式列爲承認的實時通訊及Presence技術。 

而XMPP的技術規格已被定義在RFC 3920及RFC 3921 。 

任何IM供應商在遵循XMPP協議下,均可與Google Talk實現鏈接.證明可用:

第一個Jabber(如今XMPP)技術是Jeremie Miller在1998年開發的,如今已經至關穩定;數以百計的開發者爲XMPP技術而努 力。 今日的互聯網上有數以萬計的XMPP服務器運做着,並有數以百萬計的人們使用XMPP實時傳訊軟件。
分散式:

XMPP網絡的架構和電子郵件十分相像;

XMPP核心協議通訊方式是先建立一個stream,XMPP以TCP傳遞XML數據流,沒有 中央主服務器。 

任何人均可以運行本身的XMPP服務器,使我的及組織可以掌控他們的實時傳訊體驗。


安全:

任何XMPP協議的服務器能夠獨立於公衆XMPP網絡(例如在企業內部網絡中),而使用SASL及TLS等技術的可靠安全性,已自 帶於核心XMPP技術規格中。
可擴展:

XML 命名空間的威力可以使任何人在覈心協議的基礎上建造定製化的功能;爲了維持通透性,常見的擴展由XMPP標準基金會 。 

彈性佳:

XMPP除了可用在實時通訊的應用程序,還能用在網絡管理、內容供稿、協同工具、文件共享、遊戲、遠程系統監控等。 

多樣性:

用XMPP協議來建造及佈署實時應用程序及服務的公司及開放源代碼計劃分佈在各類領域;

用XMPP技術開發軟件,資源及支持的來源是多樣的,使得使你不會陷於被「綁架」的困境。


缺點


數據負載過重:

隨着一般超過70%的XMPP協議的服務器的數據流量的存在和近60%的被重複轉發,XMPP協議目前擁有一個大型架空中存在的 數據提供給多個收件人。 

新的議定書正在研究,以減輕這一問題。


沒有二進制數據:
XMPP

協議的方式被編碼爲一個單一的長的XML文件,所以沒法提供修改二進制數據。 

所以, 文件傳輸協議同樣使用外部的 HTTP。 

若是不可避免,XMPP協議還提供了帶編碼的文件傳輸的全部數據使用的Base64 。 

至於其餘二進制數據加密會話 (encrypted conversations)或圖形圖標(graphic icons)以嵌入式使用相同的方法。 

 

7九、

談談對性能優化的見解,如何作? 

 

控制好內存,不用的內存實時釋放;

冗餘代碼;

用戶體驗度;

耗時操做,開線程進行處理 

 

80、

寫一個遞歸方法:

計算N的階乘,而後將計算結果進行存儲。

以便應用退出後下次啓動可直接獲取該值。 

開啓一個線程,在線程種實現遞歸的方法,將結果存到本地,下次運行時先看本地,沒有在運行這個遞歸方法。--

---用代碼實現----

 

8一、

簡述應用程序按Home鍵進入後臺時的生命週期,和從後臺回到前臺時的生命週期? 

應用程序:


-[AppDelegate application:willFinishLaunchingWithOptions:]


-[AppDelegate application:didFinishLaunchingWithOptions:]

-[AppDelegate applicationDidBecomeActive:] 

1 - 退到後臺:


-[AppDelegate applicationWillResignActive:] 

-[AppDelegate applicationDidEnterBackground:] 

2 - 回到前臺:

-[AppDelegate applicationWillEnterForeground:] 

-[AppDelegate applicationDidBecomeActive:] ViewController之間


3 - 加載頁面:

-[mainViewController viewDidLoad] -[mainViewController viewWillAppear:] -[mainViewController viewWillLayoutSubviews]

 -[mainViewController viewDidLayoutSubviews]

 -[mainViewController viewDidAppear:] 

4 - 退出當前頁面:

-[mainViewController viewWillDisappear:]


-[mainViewController viewDidDisappear:]


返回以前頁面:


-[mainViewController viewWillAppear:]


-[mainViewController viewWillLayoutSubviews]


-[mainViewController viewDidLayoutSubviews]


-[mainViewController viewDidAppear:]


 

8二、

     

簡述值傳遞和引用傳遞的區別? 

 

所謂值傳遞

就是說僅將對象的值傳遞給目標對象,就至關於copy;

系統將爲目標對象從新開闢一個徹底相同的內存空間。 

所謂引用傳遞

就是說將對象在內存中的地址傳遞給目標對象,就至關於使目標對象和原始對象對應同一個內存存儲空間。

此時,若是對目標對象進行修改,內存中的數據也會改變。 

 

8三、

NSArray和NSMutableArray的區別

多線程操做哪一個更安全? 

NSArray更安全,當同時被訪問時,NSArray是不可改變 

 

8四、

當前有一個數組,裏面有若干重複的數據,如何去除重複的數據?

(會幾個寫幾個) 能夠由數組,到集合。。。。

 

 

8五、

isKindOfClass、

isMemberOfClass、

selector做用分別是什麼

isKindOfClass做用是

某個對象屬於某個類型,包括繼承的類型

isMemberOfClass:

某個對象確切屬於某個類型,是否是具體的實例

selector:

經過方法名,獲取在內存中的函數的入口地址 

 

 

8六、

寫出下面程序段的輸出結果

NSDictionary *dict = [NSDictionary dictionaryWithObject:@"a string value" forKey:@"akey"]; 

NSLog(@"%@", [dict objectForKey:@"akey"]);


[dict release];

 


打印輸出 a string value,而後崩潰----

緣由:

便利構造器建立的對象,以後的release,會形成過分釋放

 

 

8七、請寫出如下代碼的執行結果

NSString * name = [ [ NSString alloc] init ];


name = @」Haab」;


[ name release];


打印輸出結果是: Habb

在[name release]先後打印均有輸出結果

---會形成內存泄露---

原先指向的區域變成了野指針,以後的釋放,不能釋放以前建立的區域

 

 

8八、

請分別寫出SEL、id、@的意思? 

SEL

是「selector」的一個類型,表示一個方法的名字-------就是一個方法的入口地址 

id

是一個指向任何一個繼承了Object(或者NSObject)類的對象。

須要注意的是id是一個指針,因此在使用id 的時候不須要加*。

@:OC中的指令符

 

8九、

以.mm爲拓展名的文件裏,能夠包含的代碼有哪些? 

.mm是oc和C++混編類型文件後綴,給編譯器識別的。

 

90、

說說如何進行後臺運行程序?


答:判斷是否支持多線程

 

UIDevice* device = [UIDevice currentDevice];


BOOL backgroundSupported = NO;


if ([device respondsToSelector:@selector(isMultitaskingSupported)])


backgroundSupported = device.multitaskingSupported; 

聲明你須要的後臺任務Info.plist中添加UIBackgroundModes鍵值,

它包含一個或多個string的值,

包括audio:在後臺提供聲音 播放功能,包括音頻流和播放視頻時的聲音 location:

在後臺能夠保持用戶的位置信息 

voip:在後臺使用VOIP功能前面的每一個value讓系統知道你的應用程序應該在適當的時候被喚醒。

例如,一個應用程序,開始播放音樂,而後移動到後臺仍然須要執行時間,以填補音頻輸出緩衝區。

添加audio鍵用來告訴系統框架,須要繼續播放音頻,而且能夠在合適的時間間隔下回調應用程 序;若是應用程序不包括此項,任何音頻播放在移到後臺後將中止運行。

除了添加鍵值的方法,IOS還提供了兩種途徑使應用程序在後 臺工做:


Task completion—

應用程序能夠向系統申請額外的時間去完成給定的任務


Local notifications—

應用程序能夠預先安排時間執行

local notifications 

傳遞實現長時間的後臺任務:

應用程序能夠請求在後臺運行以實現特殊的服務。

這些應用程序並不連續的運行,可是會被系統框架在合適的時間喚醒,以實現這些服務 

 

9一、

你瞭解svn,cvs等版本控制工具麼?


 

版本控制 svn,cvs 是兩種版控制的器,須要配套相關的svn,cvs服務器。

scm

是xcode裏配置版本控制的地方。

版本控制的原理

就是a和b同時開發一個項目,

a寫完當天的代碼以後把代碼提交給服務器,

b要作的時候先從服務器獲得最新版本, 就能夠接着作。 

若是a和b都要提交給服務器,而且同時修改了同一個方法,就會產生代碼衝突,

若是a先提交,那麼b提交 時,服務器能夠提示衝突的代碼,b能夠清晰的看到,並作出相應的修改或融合後再提交到服務器。

 

 

 

寫一個NSString類的實現

 

+ (id)initWithCString:(const char*)nullTerminatedCString encoding:(NSStringEncoding)encoding;

 

+ (id) stringWithCString: (const char*)nullTerminatedCString encoding:(NSStringEncoding)encoding 

{  

 

NSString  *obj;  

obj = [self allocWithZone:NSDefaultMallocZone()];  

 obj = [obj initWithCString:nullTerminatedCString encoding: encoding];   

return AUTORELEASE(obj);

 

 }

相關文章
相關標籤/搜索