iOS 筆試題

轉:http://blog.sina.com.cn/s/blog_b0c5954101014upb.htmlhtml

 

1.截取字符串」20|http://www.621life.com「 中 ‘|’字符前面及後面的數據,分別輸出它們java

NSRange range = [responseString rangeOfString:@"|"];
int location = range.location;
NSString *str1 = [responseString substringToIndex:location];
NSString *str2 = [responseString substringFromIndex:location+1];

2.獲取項目根路徑,並在其下建立一個名稱爲userData的目錄。程序員

// 路徑
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    
    NSString *documentsDirectory = [paths firstObject];
    
    NSFileManager *fileManager = [[NSFileManager alloc]init];
    
    NSString *userDataPath = [NSString stringWithFormat:@"%@/userData",documentsDirectory];
    if (![fileManager fileExistsAtPath:userDataPath]) {
        [fileManager createDirectoryAtPath:userDataPath withIntermediateDirectories:false attributes:nil error:nil];
    }

3.在一個對象的方法裏面:self.name = 「object」;和name =」object」有什麼不一樣嗎?算法

self.name = 「object」會調用對象的setName()方法,
name = 「object」會直接把object賦值給當前對象的name 屬性。
而且 self.name 這樣retainCount會加1,而name就不會。
json

4.定義屬性時,什麼狀況使用copy,assign,和retain數組

assign用於簡單數據類型,如NSInteger,double,bool,retain 和copy用戶對象;xcode

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

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

另外:tomic和nonatomic用來決定編譯器生成的getter和setter是否爲原子操做。在多線程環境下,原子操做是必要的,不然有可能引發錯誤的結果。多線程

5.關鍵字const有什麼含意?修飾類呢?static的做用,用於類呢?還有extern c的做用

前兩個的做用是同樣,a是一個常整型數。

第三個意味着a是一個指向常整型數的指針(也就是,整型數是不可修改的,但指針能夠)。

第四個意思a是一個指向整型數的常指針(也就是說,指針指向的整型數是能夠修改的,但指針是不可修改的)。

最後一個意味着a是一個指向常整型數的常指針(也就是說,指針指向的整型數是不可修改的,同時指針也是不可修改的)。

結論:

 關鍵字const的做用是爲給讀你代碼的人傳達很是有用的信息,實際上,聲明一個參數爲常量是爲了告訴了用戶這個參數的應用目的。

 若是你曾花不少時間清理其它人留下的垃圾,你就會很快學會感謝這點多餘的信息。(固然,懂得用const的程序員不多會留下的垃圾讓

 別人 來清理的。)   經過給優化器一些附加的信息,使用關鍵字const也許能產生更緊湊的代碼。  


 合理地使用關鍵字const可使編譯器很天然地保護那些不但願被改變的參數,防止其被無心的代碼修改。簡而言之,這樣能夠減小bug

 的出  現。  
 

(1)欲阻止一個變量被改變,可使用 const 關鍵字。在定義該 const 變量時,一般須要對它進行初
始化,由於之後就沒有機會再去改變它了;
(2)對指針來講,能夠指定指針自己爲 const,也能夠指定指針所指的數據爲 const,或兩者同時指
定爲 const;
(3)在一個函數聲明中,const 能夠修飾形參,代表它是一個輸入參數,在函數內部不能改變其值;
(4)對於類的成員函數,若指定其爲 const 類型,則代表其是一個常函數,不能修改類的成員變量;
(5)對於類的成員函數,有時候必須指定其返回值爲 const 類型,以使得其返回值不爲「左值」。

關鍵字volatile有什麼含意?並給出三個不一樣的例子。

一個定義爲 volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。

精確地說就是,優化器在用到這個變量時必須每次都當心地從新讀取這個變量的值,而不是使用保存在寄存器裏的備份。

下面是volatile變量的幾個例子:

並行設備的硬件寄存器(如:狀態寄存器)  
 一箇中斷服務子程序中會訪問到的非自動變量(Non-automatic variables)  
 多線程應用中被幾個任務共享的變量


 一個參數既能夠是const還能夠是volatile嗎?解釋爲何。  
 一個指針能夠是volatile 嗎?解釋爲何。

下面是答案:  
 是的。一個例子是隻讀的狀態寄存器。它是volatile由於它可能被意想不到地改變。它是const由於程序不該該試圖去修改它。  
 是的。儘管這並不很常見。一個例子是當一箇中服務子程序修該一個指向一個buffer的指針時。

6. static 關鍵字的做用:

(1)函數體內 static 變量的做用範圍爲該函數體,不一樣於 auto 變量,該變量的內存只被分配一次,
所以其值在下次調用時仍維持上次的值;
(2)在模塊內的 static 全局變量能夠被模塊內所用函數訪問,但不能被模塊外其它函數訪問;
(3)在模塊內的 static 函數只可被這一模塊內的其它函數調用,這個函數的使用範圍被限制在聲明
它的模塊內;
(4)在類中的 static 成員變量屬於整個類所擁有,對類的全部對象只有一份拷貝;
(5)在類中的 static 成員函數屬於整個類所擁有,這個函數不接收 this 指針,於是只能訪問類的static 成員變量。

 extern "C" 的做用

(1)被 extern "C"限定的函數或變量是 extern 類型的;
     extern 是 C/C++語言中代表函數和全局變量做用範圍(可見性)的關鍵字,該關鍵字告訴編譯器,
     其聲明的函數和變量能夠在本模塊或其它模塊中使用。

(2)被 extern "C"修飾的變量和函數是按照 C 語言方式編譯和鏈接的;
 extern "C"的慣用法

(1)在 C++中引用 C 語言中的函數和變量,在包含 C 語言頭文件(假設爲 cExample.h)時,需進
       行下列處理:
  extern "C"  {  
   #include "cExample.h"  
  }  
而在 C 語言的頭文件中,對其外部函數只能指定爲 extern 類型,C 語言中不支持 extern "C"聲明,
在.c 文件中包含了 extern "C"時會出現編譯語法錯誤。

(2)在 C 中引用 C++語言中的函數和變量時,C++的頭文件需添加 extern "C",可是在 C 語言中不
能直接引用聲明瞭 extern "C"的該頭文件,應該僅將 C 文件中將 C++中定義的 extern "C"函數聲明爲
extern 類型。

 

 

7.readwrite,readonly,assign,retain,copy,nonatomic 屬性的做用

@property是一個屬性訪問聲明,擴號內支持如下幾個屬性:
1,getter=getterName,setter=setterName,設置setter與 getter的方法名
2,readwrite,readonly,設置可供訪問級別
2,assign,setter方法直接賦值,不進行任何retain操做,爲了解決原類型與環循引用問題
3,retain,setter方法對參數進行release舊值再retain新值,全部實現都是這個順序(CC上有相關資料)
4,copy,setter方法進行Copy操做,與retain處理流程同樣,先舊值release,再 Copy出新的對象,retainCount爲1。

 

   這是爲了減小對上下文的依賴而引入的機制。
5,nonatomic,非原子性訪問,不加同步,多線程併發訪問會提升性能。注意,若是不加此屬性,則默認是兩個訪問方法

 

   都爲原子型事務訪問。鎖被加到所屬對象實例級(我是這麼理解的...)。

 

33.線程的常見方法有哪些,你是如何處理多線程的,多線程同步問題你瞭解麼?
線程建立的幾種方式,線程的加鎖,休眠,喚醒,解鎖,退出,

多線程要考慮同步問題,解決同步問題的方式就是對某一資源加鎖,當一個線程操做本資源時,其餘線程不能操做 。

 
系統自帶線程池(NSOpertionQueue)的做用:

凡是須要啓動多個線程的地方均可以使用NSOpertionQueue,加入到NSOpertionQueue中的對象都須要繼承NSOpertion。 NSOpertionQueue會在系統內部啓動一個獨立線程去執行這個被加入對象的main方法。

經常使用的地方是用nsoprationqueue 下載圖片,文件。若是是本身建立一個線程池,無非就是啓動多個線程的時候,

把這些線程對象放到一個大數組中,若是須要啓動線程的時候,先從數組中找空閒線程來使用。

本身管理線程池最大的難題是很差處理當啓動多個線程後,用戶在多個界面的跳轉的時候,對線程方法的回調管理。

而NSOpertionQueue能夠很好的處理他。

 

34.init和initwithobject區別(語法)?

   init建立的對象不帶自動釋放

 

35.你鏈接服務器用的是什麼方法,若是請求過程當中,網絡出了問題這麼辦?
NSUrlConnection 鏈接後,有一系列委託方法來接受來自服務器的響應和數據,

其中接受相應的方法回獲得服務器要傳回的數據有多大,接受數據的方法會反覆調用來不斷接受服務器數據,

若是網絡出了問題了,會調用一個方法讓你來作相關處理。


36.你使用過json解析方式麼,他們的底層是如何處理的你瞭解麼?


json解析的用法,用框架的用法簡單介紹:

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

 {}號是一個字典的開始,[]號是一個數組的開始, : 號是字典的鍵和值的分水嶺,最終乃是將json數據轉化爲字典,

字典中值多是字典,數組,或字符串而已。

 

37.xml解析的原理是什麼,你還用過其餘解析方式麼?

NSXMLParser, 其餘解析方式有自定義二進制解析,就是按字節去解析,電話會談就是如此,

還能夠是字符串之間用特殊符號鏈接的數據,將此數據用特殊符號能夠分割成所用數據。

 

38.協議是什麼,有什麼做用.?


協議很像java中的接口,某個類實現協議後,就必須實現協議中規定的@require的方法,好比一個類A, 一個類B都實現某「協議」後,

這個類A的對象和B的對象均可以賦值給這個協議的類型變量,好比  id<協議> 變量名 = A類或B類的對象,

因而這個變量就完成了可以指向多個不一樣的類的對象並調用對象中的實現協議的方法。

39.類別有什麼做用?
類別的使用 。 類別有三大做用,

1. 可使原本須要在.h中聲明的方法放到.m文件中聲明,達到了可使方法不對外公開。

2. 能夠方便的擴展類,甚至系統類均可以輕易擴展,維護了代碼本來的結構不受影響。

3. 類別能夠寫到不一樣的.h或.m文件中,能夠分散代碼到跟類別的擴展功能想關聯的地方,方便查看。

40.分線程回調主線程方法是什麼,有什麼做用?
[self    performSelectorOnMainThread:@selector(buttonGo2) withObject:nil waitUntilDone:YES];
[self performSelector:@selector(buttonGo2) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES];
須要即時刷新ui控件的時候,常用。


41.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;

42.你在開發大型項目的時候,如何進行內存泄露檢測的?
  能夠經過xcode的自帶工具run---start with performance tool裏有instruments下有個leaks工具,

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

 

43.你作iphone開發時候,有哪些傳值方式,view和view之間是如何傳值的?

     壓棧。

 

44.讓一個物體從界面中的一點運動到另一點,有哪些方法?
四種方式:1. beginAnimation

              2. 線程

              3. NSTimer

              4. 圖層動畫(路徑)


45.你瞭解哪些加密方式?
   Base64, MD5, 循環右移位等.

 

46.地圖定位

CLLocationManager位置管理器  使用Core Location框架來肯定iphone的位置(GPS,蜂窩基站三角網,wps三種方式)    

MKMapView提供了一套可植入的地圖接口,可讓咱們在應用中展現地圖,並對其進行相關的操做。通常來講,咱們能夠指定一個展現區域,放一些標記在上面,還能夠加蓋一些層在上面。

MKMapView依賴Google map裏面相關服務(如Google Earth API等),因此地圖的左下角會有Google字樣。

 

47.打開url

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://8004664411"]];mailto://   sms://

 

48. http網絡通訊

ASIHTTPRequest 是一個直接在CFNetwork上作的開源項目:提供直接提交(HTTP POST)文件的API,異步請求與隊列,自動管理上傳與下載隊列管理機,ASIFormDataRequest用於適合上傳文件,圖片數據。

 

49. 圖片瀏覽

UIImagePickerController能夠從相冊,相機,膠捲裏得到圖片。

 

50. 對像序列化

NSCoding    encodeWithCoder   initWithCoder

NSKeyedUnarchiver   NSKeyedArchiver

 

51. 各類picker

UIDatePicker   UIPickerView

 

52. 電影播放

     MPMoviePlayerController

     音樂播放

     MPMusicPlayerController

 

53.線程 ?

      a. 線程的建立和使用規則?

         答:NSThread

                 三種方法

                - (id)init; // designated initializer

                - (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;

                + (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument

                 - (void)start;

       b. 主分線程

          答:啓動分線程,上面已提到!加到主線程方法performSelector!

          //加到主線程addData()是主線程的方法!只有加到主線程後,才能調用主線程的方法

         [target performSelector:@selector(addData:) onThread:[NSThread mainThread] withObject:item waitUntilDone:YES];

           //[target addData:item];//沒有加到主線程後,調用主線程的方法!必定會崩!

 

      c.線程鎖

         答:NSCondition

                 方法:

                 [thread lock];//加鎖

                 sleep(n);//線程休眠

                 [thread singnal];//至關於通知,線程啓動

                 [thread unlock];//解鎖

                 [thread exit];//線程退出

 

54.各類 排序算法?

     希爾排序、快速排序、冒泡排序、

 

55.通訊底層原理

    答:OSI七層模型

    7 應用層:    ftp,smtp,http,telnet,tftp(經過各類協議,最終仍是包裝成TCP數據包,發送到網絡中!)

    6 表現層:

    5 會話層:

    4 傳輸層:    tcp udp

    3 網絡層:    ip,ICMP,IGRP,EIGRP,OSPF,ARP

    2 數據鏈路層: STP,VT

    1 物理層:

 

56. 爲何不少內置類如UITableViewController的delegate屬性都是assign而不是retain的?

答:

      會引發循環引用

      全部的引用計數系統,都存在循環應用的問題。例以下面的引用關係:

          * 對象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模式時,也要注意這點。

 

57. 如下每行代碼執行後,person對象的retain count分別是多少?

      Person *person = [[Person alloc] init]; count 1

      [person retain]; retain  count 2

      [person release];retain count 1

      [person release];retain count = 0

 

58.在一個對象的方法裏面:

      self.name = 「object」;

      和

      name =」object」

      有什麼不一樣嗎?  

答:self.name = "object"會調用對象的setName()方法,會使object引用計數加1,name = "object"會直接把object賦值給當前對象的name 屬性,引用計數不增長。


59.readwrite,readonly,assign,retain,copy,nonatomic屬性的做用?

 

@property是一個屬性訪問聲明,擴號內支持如下幾個屬性:
1,getter=getterName,setter=setterName,設置setter與getter的方法名
2,readwrite,readonly,設置可供訪問級別


3,assign,setter方法直接賦值,不進行任何retain操做,爲了解決原類型與環循引用問題
4,retain,setter方法對參數進行release舊值再retain新值,全部實現都是這個順序(CC上有相關資料)


5,copy,setter方法進行Copy操做,與retain處理流程同樣,先舊值release,再Copy出新的對象,retainCount爲1。這是爲了減小對上下文的依賴而引入的機制。


6,nonatomic,非原子性訪問,不加同步,多線程併發訪問會提升性能。注意,若是不加此屬性,則默認是兩個訪問方法都爲原子型事務訪問。鎖被加到所屬對象實例級(我是這麼理解的…)。

7,@synthesize xxx; 來實現實際代碼

60.1.main() {   int a[5]={1,2,3,4,5};   int *ptr=(int *)(&a+1);   printf("%d,%d",*(a+1),*(ptr-1));}答:2,5     *(a+1)就是a[1],*(ptr-1)就是a[4],執行結果是2,5  &a+1不是首地址+1,系統會認爲加一個a數組的偏移,是偏移了一個數組的大小(本例是5個int)  int *ptr=(int *)(&a+1);  則ptr實際是&(a[5]),也就是a+5緣由以下:  &a是數組指針,其類型爲 int (*)[5];  而指針加1要根據指針類型加上必定的值,不一樣類型的指針+1以後增長的大小不一樣。  a是長度爲5的int數組指針,因此要加 5*sizeof(int)  因此ptr實際是a[5]  可是prt與(&a+1)類型是不同的(這點很重要)  因此prt-1只會減去sizeof(int*)    a,&a的地址是同樣的,但意思不同     a是數組首地址,也就是a[0]的地址,&a是對象(數組)首地址,     a+1是數組下一元素的地址,即a[1],&a+1是下一個對象的地址,即a[5].

相關文章
相關標籤/搜索