ios筆試題


最近找工作,有面試有筆試部分,故把筆試題自己整理了下。

 

面試能力要求:精通iphone的UI開發,能熟練操作復雜表視圖,熟練使用圖層技術, 可以自定義UI控件,使用類別擴展系統控件功能;  

擅長通訊技術,熟悉各種通信協議,精通xml, json, 二進制或其他形式的自定義解析,能架設服務器實現客戶端與服務器的通訊以提交開發效率; 

熟練掌握各種數據存儲技術,如core data, sqlite,  對象序列化,文件讀寫操作,熟悉數據庫的設計。  

精通 object-c,java, c  等編程語言, 熟悉c++,對於 面向對象編程思想有深入理解,熟悉常見設計模式的應用,

對於大型項目有一定的架構能力。

 

1. ViewController的didReceiveMemoryWarning怎么被調用:

[supper didReceiveMemoryWarning];

2.什么時候用delegate,什么時候用Notification?

delegate針對one-to-one關系,用於sender接受到reciever的某個功能反饋值。

notification針對one-to-one/many/none,reciver,用於通知多個object某個事件。

 

3.用預處理指令#define聲明一個常數,用以表明1年中有多少秒(忽略閏年問題)


#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL  
我在這想看到幾件事情:  
 #define 語法的基本知識(例如:不能以分號結束,括號的使用,等等)  
 懂得預處理器將為你計算常數表達式的值,因此,直接寫出你是如何計算一年中有多少秒而不是計算出實際的值,是更清晰而沒有代價的。
 
 意識到這個表達式將使一個16位機的整型數溢出-因此要用到長整型符號L,告訴編譯器這個常數是的長整型數。  
 如果你在你的表達式中用到UL(表示無符號長整型),那么你有了一個好的起點。記住,第一印象很重要。

 

寫一個"標准"宏MIN ,這個宏輸入兩個參數並返回較小的一個。

 
#define MIN(A,B) ((A) <= (B) ? (A) : (B))  
這個測試是為下面的目的而設的:  

標識#define在宏中應用的基本知識。這是很重要的,因為直到嵌入(inline)操作符變為標准C的一部分,宏是方便產生嵌入代碼的唯一方
法,
對於嵌入式系統來說,為了能達到要求的性能,嵌入代碼經常是必須的方法。  

三重條件操作符的知識。這個操作符存在C語言中的原因是它使得編譯器能產生比 if-then-else 更優化的代碼,了解這個用法是很重要的。
 

 懂得在宏中小心地把參數用括號括起來  
 我也用這個問題開始討論宏的副作用,例如:當你寫下面的代碼時會發生什么事?  
 
least = MIN(*p++, b);

 

結果是:
((*p++) <= (b) ? (*p++) : (*p++))
這個表達式會產生副作用,指針p會作三次++自增操作。

 

4.寫一個委托的 interface

@protocol MyDelegate;

 
@interface MyClass: NSObject

{

    id <MyDelegate> delegate;

}

// 委托方法

@protocol MyDelegate

- (void)didJobs:(NSArray *)args;

@end

 

5. 寫一個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);
}

6.obj-c有多重繼承么?不是的話有什么替代方法?


cocoa 中所有的類都是NSObject 的子類

多繼承在這里是用protocol 委托代理 來實現的
你不用去考慮繁瑣的多繼承 ,虛基類的概念.
ood的多態特性  在 obj-c 中通過委托來實現.

 

7.obj-c有私有方法么?私有變量呢

 objective-c - 類里面的方法只有兩種, 靜態方法和實例方法. 這似乎就不是完整的面向對象了,按照OO的原則就是一個對象只暴露有用的東西. 如果沒有了私有方法的話, 對於一些小范圍的代碼重用就不那么順手了. 在類里面聲名一個私有方法

@interface Controller : NSObject {

   NSString *something;

}

+ (void)thisIsAStaticMethod;

- (void)thisIsAnInstanceMethod;

@end

@interface Controller (private)

-(void)thisIsAPrivateMethod;

@end

 
@private可以用來修飾私有變量

在Objective‐C中,所有實例變量默認都是私有的,所有實例方法默認都是公有的。

8.關鍵字const有什么含意?修飾類呢?static的作用,用於類呢?還有extern c的作用

const 意味着"只讀",下面的聲明都是什么意思?  
const int a;  
int const a;  
const int *a;  
int * const a;  
int const * a const;

 
前兩個的作用是一樣,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的指針時。

9. 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 類型。

 

10.為什么標准頭文件都有類似以下的結構?  
   #ifndef __INCvxWorksh  
   #define __INCvxWorksh  
   #ifdef __cplusplus  
   extern "C" {  
   #endif  
   /*...*/  
   #ifdef __cplusplus  
   }  
   #endif  
   #endif /* __INCvxWorksh */

顯然,頭文件中的編譯宏“#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif” 的作用
是防止該頭文件被重復引用。

 

10.#import跟#include的區別,@class呢?

 @class一般用於頭文件中需要聲明該類的某個實例變量的時候用到,在m文件中還是需要使用#import。
 而#import比起#include的好處就是不會引起交叉編譯。

 

11.MVC模式的理解

MVC設計模式考慮三種對象:模型對象、視圖對象、和控制器對象。

模型對象代表特別的知識和專業技能,它們負責保有應用程序的數據和定義操作數據的邏輯。

視圖對象知道如何顯示應用程序的模型數據,而且可能允許用戶對其進行編輯。

控制器對象是應用程序的視圖對象和模型對象之間的協調者。

12.線程與進程的區別和聯系?

進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的並發性。

進程和線程的主要差別在於它們是不同的操作系統資源管理方式。

進程有獨立的地址空間,一個進程崩潰后,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。

線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉。

所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。

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

 13.列舉幾種進程的同步機制,並比較其優缺點。

答案:  原子操作 信號量機制    自旋鎖    管程,會合,分布式系統


1.進程之間通信的途徑

答案:共享存儲系統消息傳遞系統管道:以文件系統為基礎


2.進程死鎖的原因

答案:資源競爭及進程推進順序非法


3.死鎖的4個必要條件

答案:互斥、請求保持、不可剝奪、環路


4.死鎖的處理

答案:鴕鳥策略、預防策略、避免策略、檢測與解除死鎖

 

14.堆和棧的區別


管理方式:對於棧來講,是由編譯器自動管理,無需我們手工控制;對於堆來說,釋放工作由程序員控制,容易產生memory leak。

1.申請大小:
棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩余空間時,將提示 overflow。因此,能從棧獲得的空間較小。


堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由於系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。

2.碎片問題:對於堆來講,頻繁的new/delete勢必會造成內存空間的不連續,從而造成大量的碎片,使程序效率降低。對於棧來講,則不會存在這個問題,因為棧是先進后出的隊列,他們是如此的一一對應,以至於永遠都不可能有一個內存塊從棧中間彈出

3.分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如局部變量的分配。動態分配由 alloca函數進行分配,但是棧的動態分配和堆是不同的,他的動態分配是由編譯器進行釋放,無需我們手工實現。

4.分配效率:棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函數庫提供的,它的機制是很復雜的。

 
15.什么是鍵-值,鍵路徑是什么

模型的性質是通過一個簡單的鍵(通常是個字符串)來指定的。視圖和控制器通過鍵來查找相應的屬性值。

在一個給定的實體中,同一個屬性的所有值具有相同的數據類型。

鍵-值編碼技術用於進行這樣的查找—它是一種間接訪問對象屬性的機制。

鍵路徑是一個由用點作分隔符的鍵組成的字符串,用於指定一個連接在一起的對象性質序列。第一個鍵的
性質是由先前的性質決定的,接下來每個鍵的值也是相對於其前面的性質。鍵路徑使您可以以獨立於模型
實現的方式指定相關對象的性質。通過鍵路徑,您可以指定對象圖中的一個任意深度的路徑,使其指向相
關對象的特定屬性。

16.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。

總結:只要cpp文件和cpp include的文件中不包含obj-c的東西就可以用了,cpp混用obj-c的關鍵是使用接口,

而不能直接使用實現代碼,實際上cpp混用的是 obj-c編譯后的o文件,這個東西其實是無差別的,所以可以用。obj-c的編譯器支持cpp.


17.cocoa touch框架


iPhone OS 應用程序的基礎 Cocoa Touch 框架重用了許多 Mac 系統的成熟模式,但是它更多地專注於觸摸的接口和優化。

UIKit 為您提供了在 iPhone OS 上實現圖形,事件驅動程序的基本工具,其建立在和 Mac OS X 中一樣的 Foundation 框架上,

包括文件處理,網絡,字符串操作等。

 
Cocoa Touch 具有和 iPhone 用戶接口一致的特殊設計。有了 UIKit,您可以使用 iPhone OS 上的獨特的圖形接口控件,按鈕,

以及全屏視圖的功能,您還可以使用加速儀和多點觸摸手勢來控制您的應用。


各色俱全的框架 除了 UIKit 外,Cocoa Touch 包含了創建世界一流 iPhone 應用程序需要的所有框架,從三維圖形,到專業音效,

甚至提供設備訪問 API 以控制攝像頭,或通過 GPS 獲知當前位置。

Cocoa Touch 既包含只需要幾行代碼就可以完成全部任務的強大的 Objective-C 框架,也在需要時提供基礎的 C 語言 API 來直接訪問系統。這些框架包括:

Core Animation:通過 Core Animation,您就可以通過一個基於組合獨立圖層的簡單的編程模型來創建豐富的用戶體驗。

Core Audio:Core Audio 是播放,處理和錄制音頻的專業技術,能夠輕松為您的應用程序添加強大的音頻功能。

Core Data:提供了一個面向對象的數據管理解決方案,它易於使用和理解,甚至可處理任何應用或大或小的數據模型。

功能列表:框架分類
下面是 Cocoa Touch 中一小部分可用的框架:

音頻和視頻:Core Audio ,OpenAL ,Media Library ,AV Foundation
數據管理 :Core Data ,SQLite
圖形和動畫 :Core Animation ,OpenGL ES ,Quartz 2D
網絡:Bonjour ,WebKit ,BSD Sockets
用戶應用:Address Book ,Core Location ,Map Kit ,Store Kit

 

18.自動釋放池是什么,如何工作

 當您向一個對象發送一個autorelease消息時,Cocoa就會將該對象的一個引用放入到最新的自動釋放池。

 它仍然是個正當的對象,因此自動釋放池定義的作用域內的其它對象可以向它發送消息。

 當程序執行到作用域結束的位置時,自動釋放池就會被釋放,池中的所有對象也就被釋放。

1.  ojc-c 是通過一種"referring counting"(引用計數)的方式來管理內存的, 對象在開始分配內存(alloc)的時候引用計數為一,

     以后每當碰到有copy,retain的時候引用計數都會加一, 每當碰到release和autorelease的時候引用計數就會減一,如果此

     對象的計數變為了0, 就會被系統銷毀.
2. NSAutoreleasePool 就是用來做引用計數的管理工作的,這個東西一般不用你管的.
3. autorelease和release沒什么區別,只是引用計數減一的時機不同而已,autorelease會在對象的使用真正結束的時候才做引用計數減一.

19.objc優點:
  1) Cateogies
  2) Posing
  3) 動態識別
  4) 指標計算
  5)彈性訊息傳遞
  6) 不是一個過度復雜的 C 衍生語言
  7) Objective-C 與 C++ 可混合編程
   objc缺點:
  1) 不支援命名空間
  2)  不支持運算符重載
  3) 不支持多重繼承
  4) 使用動態運行時類型,所有的方法都是函數調用,所以很多編譯時優化方法都用不到。(如內聯函數等),性能低劣。

 

20.sprintf,strcpy,memcpy使用上有什么要注意的地方

 
strcpy是一個字符串拷貝的函數,它的函數原型為strcpy(char *dst, const char *src);

將src開始的一段字符串拷貝到dst開始的內存中去,結束的標志符號為 '\0',由於拷貝的長度不是由我們自己控制的,

所以這個字符串拷貝很容易出錯。具備字符串拷貝功能的函數有memcpy,這是一個內存拷貝函數,它的函數原型

為memcpy(char *dst, const char* src, unsigned int len);

將長度為len的一段內存,從src拷貝到dst中去,這個函數的長度可控。但是會有內存疊加的問題。

sprintf是格式化函數。將一段數據通過特定的格式,格式化到一個字符串緩沖區中去。sprintf格式化的函數的長度不可控,

有可能格式化后的字符串會超出緩沖區的大小,造成溢出。

21. 用變量a給出下面的定義

a) 一個整型數(An integer)  
b)一個指向整型數的指針( A pointer to an integer)  
c)一個指向指針的的指針,它指向的指針是指向一個整型數( A pointer to a pointer to an intege)r  
d)一個有10個整型數的數組( An array of 10 integers)  
e) 一個有10個指針的數組,該指針是指向一個整型數的。(An array of 10 pointers to integers)  
f) 一個指向有10個整型數數組的指針( A pointer to an array of 10 integers)  
g) 一個指向函數的指針,該函數有一個整型參數並返回一個整型數(A pointer to a function that takes an integer as an argument
 and returns an integer)  
h) 一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數並返回一個整型數( An array of ten pointers to functions t
hat take an integer argument and return an integer )  
 
答案是:  
a) int a; // An integer  
b) int *a; // A pointer to an integer  
c) int **a; // A pointer to a pointer to an integer  
d) int a[10]; // An array of 10 integers  
e) int *a[10]; // An array of 10 pointers to integers  
f) int (*a)[10]; // A pointer to an array of 10 integers  
g) int (*a)(int); // A pointer to a function a that  takes an integer argument and returns an integer  
h) int (*a[10])(int); // An array of 10 pointers to functions  that take an integer argument and return an integer

 

22.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,非原子性訪問,不加同步,多線程並發訪問會提高性能。注意,如果不加此屬性,則默認是兩個訪問方法

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

 

23.http和scoket通信的區別。

http是客戶端用http協議進行請求,發送請求時候需要封裝http請求頭,並綁定請求的數據,服務器一般有web服務器配合(當然也非絕對)。 http請求方式為客戶端主動發起請求,服務器才能給響應,一次請求完畢后則斷開連接,以節省資源。服務器不能主動給客戶端響應(除非采取http長連接技術)。iphone主要使用類是NSUrlConnection。


scoket是客戶端跟服務器直接使用socket“套接字”進行連接,並沒有規定連接后斷開,所以客戶端和服務器可以保持連接通道,雙方都可以主動發送數據。一般在游戲開發或股票開發這種要求即時性很強並且保持發送數據量比較大的場合使用。主要使用類是CFSocketRef。

24.mvc設計模式是什么? 你還熟悉什么設計模式?

設計模式:並不是一種新技術,而是一種編碼經驗,使用比如java中的接口,iphone中的協議,繼承關系等基本手段,

用比較成熟的邏輯去處理某一種類型的事情,總結為所謂設計模式。面向對象編程中,java已經歸納了23中設計模式。

mvc設計模式 ,模型,視圖,控制器,可以將整個應用程序在思想上分成三大塊,對應是的數據的存儲或處理,前台的顯示,

業務邏輯的控制。 Iphone本身的設計思想就是遵循mvc設計模式。其不屬於23中設計模式范疇。

代理模式:代理模式給某一個對象提供一個代理對象,並由代理對象控制對源對象的引用.比如一個工廠生產了產品,

並不想直接賣給用戶,而是搞了很多代理商,用戶可以直接找代理商買東西,代理商從工廠進貨.
常見的如QQ的自動回復就屬於代理攔截,代理模式在iphone中得到廣泛應用.

單例模式:說白了就是一個類不通過alloc方式創建對象,而是用一個靜態方法返回這個類的對象。系統只需要擁有一個的全局對象,

這樣有利於我們協調系統整體的行為,比如想獲得[UIApplication sharedApplication];任何地方調用都可以得到 UIApplication的對象,

這個對象是全局唯一的。

觀察者模式: 當一個物體發生變化時,會通知所有觀察這個物體的觀察者讓其做出反應。實現起來無非就是把所有觀察者的對象給這個物體,

當這個物體的發生改變,就會調用遍歷所有觀察者的對象調用觀察者的方法從而達到通知觀察者的目的。

工廠模式:


public class Factory{
  public static Sample creator(int which){
 
  if (which==1)
      return new SampleA();
  else if (which==2)
      return new SampleB();
      }
 }

25.你了解svn,cvs等版本控制工具么?
版本控制 svn,cvs 是兩種版控制的器,需要配套相關的svn,cvs服務器。
scm是xcode里配置版本控制的地方。版本控制的原理就是a和b同時開發一個項目,a寫完當天的代碼之后把代碼提交給服務器,

b要做的時候先從服務器得到最新版本,就可以接着做。 如果a和b都要提交給服務器,並且同時修改了同一個方法,就會產生代碼沖突,

如果a先提交,那么b提交時,服務器可以提示沖突的代碼,b可以清晰的看到,並做出相應的修改或融合后再提交到服務器。

 

26.什么是push(了解一下)。

客戶端程序留下后門端口,客戶端總是監聽針對這個后門的請求,於是 服務器可以主動像這個端口推送消息。

 

27.靜態鏈接庫(了解一下)

(此為.a文件,相當於java里的jar包,把一些類編譯到一個包中,在不同的工程中如果導入此文件就可以使用里面的類,

  具體使用依然是#import “ xx.h”)。

 

28.fmmpeg框架(了解一下)

(音視頻編解碼框架,內部使用UDP協議針對流媒體開發,內部開辟了六個端口來接受流媒體數據,完成快速接受之目的).

 

29.fmdb框架(了解一下)

(數據庫框架,對sqllite的數據操作進行了封裝,使用着可把精力都放在sql語句上面)。

 

30.320框架(了解一下)

(ui框架,導入320工程作為框架包如同添加一個普通框架一樣)。

  cover(open)   flower框架 (2d 仿射技術),內部核心類是CATransform3D.

 

31.什么是沙箱模型?哪些操作是屬於私有api范疇?


某個iphone工程進行文件操作有此工程對應的指定的位置,不能逾越。

iphone沙箱模型的有四個文件夾,分別是什么,永久數據存儲一般放在什么位置,得到模擬器的路徑的簡單方式是什么.

documents,tmp,app,Library。

(NSHomeDirectory()),

手動保存的文件在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類方法用於返回一個代表應用程序包對象。


文件IO寫入
1,將數據寫到Documents目錄:
- (BOOL)writeApplicationData:(NSData *)data toFile:(NSString *)fileName {


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

   NSString *docDir = [paths objectAtIndex:0];

   if (!docDir) {

    NSLog(@”Documents directory not found!”); return NO;

   }

   NSString *filePath = [docDir stringByAppendingPathComponent:fileName];
   return [data writeToFile:filePath atomically:YES];

}


2,從Documents目錄讀取數據:
- (NSData *)applicationDataFromFile:(NSString *)fileName {
   NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

   NSString *docDir = [paths objectAtIndex:0];

   NSString *filePath = [docDir stringByAppendingPathComponent:fileName];

   NSData *data = [[[NSData alloc] initWithContentsOfFile:filePath] autorelease];

   return data;

}
NSSearchPathForDirectoriesInDomains這個主要就是返回一個絕對路徑用來存放我們需要儲存文件。


- (NSString *)dataFilePath {


   NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
   NSString *documentsDirectory = [paths objectAtIndex:0];
   return [documentsDirectory stringByAppendingPathComponent:@"shoppingCar.plist"];
}


NSFileManager* fm=[NSFileManager defaultManager];
if(![fm fileExistsAtPath:[self dataFilePath]]){


//下面是對該文件進行制定路徑保存
[fm createDirectoryAtPath:[self dataFilePath] withIntermediateDirectories:YES attributes:nil error:nil];


//取得一個目錄下得所有文件名
NSArray *files = [fm subpathsAtPath: [self dataFilePath] ];


//讀取某個文件
NSData *data = [fm contentsAtPath:[self dataFilePath]];


//或者
NSData *data = [NSData dataWithContentOfPath:[self dataFilePath]];
}

iphone常見私有api的應用(比如直接發送短信,訪問沙箱之外的磁盤文件).

32.你在開發項目中時,用到了哪些數據存儲方式,iphone中常見的方式有哪些,各有什么區別?

數據存儲五種形式的應用范圍和性能區別

(core data,  sqllite,對象序列化,文件直接讀寫,NSUserDefault(保存數據到temp文件夾中))
文件直接讀寫 >core data> 對象序列化> sqllite>NSUserDefault.


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].


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM