你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS 面試題

iOS 面試題

編輯:IOS開發綜合
1.#import和#include的區別 @class?
@class一般用於頭文件中需要聲明該類的某個實例變量的時候用到,在m文 件中還是需要使用#import
#import比起#include的好處就是不會引起交叉編譯
2. readwrite,readonly,assign,retain,copy,nonatomic 屬性的作用
@property是 一個屬性訪問聲明,擴號內支持以下幾個屬性: 1,getter=getName,setter=setName,設置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,非原子性訪問,不加同步, 多線程並發訪問會提高性能。注意,如果不加此屬性,則默認是兩個訪問方法都為原子型事務訪問。鎖被加到所屬對象實例級(我是這麼理解的…)。
3.在一個對象的方法裡面:self.name= “object”;和 name =”object” 有什麼不同嗎?
self.name =”object”:會調用對象的setName()方法;name = “object”:會直接把object賦值給當前對象的name屬性。
4.請簡述self.name= nil的機制,以及與[namerelease]的區別?

self.name =nil;
//使用nil參數調用setName:方法

[name release] 生成的訪問器將自動釋放以前的name對象

5.請簡要說明viewDidLoad和viewDidUnload何時調用
viewDidLoad在view從nib文件初始化時調用loadView在controller的view為nil時調用。
此方法在編程實現view時調用,view控制器默認會注冊memory warning notification,當view controller的任何view沒有用的時候,
viewDidUnload會被調用,在這裡實現將retain的view release,如果是retain的IBOutlet view 屬性則不要在這裡release,IBOutlet會負責release 。

控制器View的生命周期:

首先判斷控制器是否有視圖,如果沒有就調用loadView方法創建:通過storyboard或者代碼

隨後調用viewDidLoad,可以進行下一步的初始化操作;只會被調用一次

在視圖顯示之前調用viewWillAppear;該函數可以多次調用視圖viewDidAppear在視圖顯示之前調用viewWillDisappear;該函數可以多次調用(如需要)在布局變化前後,調用viewWill/DidLayoutSubviews處理相關信息
6.實例化一個UITableView對象,要求寫出關鍵語句?
UITableView *my = [[UITableView alloc]initWithFrame:<(CGRect)frame> style:<(UITableViewStyle)style>];
my.delegate = self;
my.dataSource = self;
首先需要分配空間設置表格類型
然後需要設置兩個必須的委托對象。
7.使用sql語句查詢出省名以湖開頭,郵編為436001所在的市區?(表名及字段名自定義)

select*fromcitys where postcode=436001 and province=’湖%’;

8.打印結果
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].
void Func ( char str[100] )
{
    sizeof(str ) = ?
}
void *p = malloc( 100 );
sizeof( p ) = ?
這題 很常見了,Func ( char str[100] )函數中數組名作為函數形參時,在函數體內,數組名失去了本身的內涵,僅僅只是一個指針;在失去其內涵的同時,它還失去了其常量特性,可以作自增、自減等操作,可以被修改。Windows NT 32位平台下,指針的長度(占用內存的大小)為4字節,故sizeof( str ) 、sizeof( p ) 都為4。
9.用預處理指令#define聲明一個常數,用以表明1年中有多少秒(忽略閏年問題)
defineSECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
我在這想看到幾件事情:

#define 語法的基本知識(例如:不能以分號結束,括號的使用,等等)

懂得預處理器將為你計算常數表達式的值,因此,直接寫出你是如何計算一年中有多少秒而不是計算出實際的值,是更清晰而沒有代價的。
意識到這個表達式將使一個16位機的整型數溢出-因此要用到長整型符號L,告訴編譯器這個常數是的長整型數。
如果你在你的表達式中用到UL(表示無符號長整型),那麼你有了一個好的起點。記住,第一印象很重要。

10.寫一” 標准”宏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會作三次++自增操作。
11.數組和指針的區別
數組可以申請在棧區和數據區;指針可以指向任意類型的內存塊sizeof作用於數組時,得到的是數組所占的內存大小;作用於指針時,得到的都是4個字節的大小數組名表示數組首地址,值不可以改變,如不可以將++作用於數組名上;普通指針的值可以改變,如可將++作用於指針上用字符串初始化字符數組是將字符串的內容拷貝到字符數組中;用字符串初始化字符指針是將字符串的首地址賦給指針,也就是指針指向了該數組
12.static的作用
函數體內static 變量的作用范圍為該函數體,不同於 auto 變量,該變量的內存只被分配一次,
因此其值在下次調用時仍維持上次的值;在模塊內的static 全局變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問;在模塊內的static函數只可被這一模塊內的其它函數調用,這個函數的使用范圍被限制在聲明它的模塊內;在類中的static成員變量屬於整個類所擁有,對類的所有對象只有一份拷貝;在類中的static 成員函數屬於整個類所擁有,這個函數不接收 this 指針,因而只能訪問類的static 成員變量。
13.簡述內存分區情況
代碼區:存放函數二進制代碼數據區:系統運行時申請內存並初始化,系統退出時由系統釋放。存放全局變量、靜態變量、常量堆區:通過malloc等函數或new等操作符動態申請得到,需程序員手動申請和釋放棧區:函數模塊內申請,函數結束時由系統自動釋放。存放局部變量、函數參數
14.#include和#include”filename”有什麼區別
#include直接在庫文件目錄中搜索所包含的文件;#include”filename”在當前目錄下搜索所包含的文件,如果沒有的話再到庫文件目錄搜索。
15.const char * p; char const * p; char * const p; const char * const p;

四個修飾指針有什麼區別

(1)定義了一個指向不可變的字符串的字符指針(2)和(1)一樣(3)定義了一個指向字符串的指針,該指針值不可改變,即不可改變指向(4)定義了一個指向不可變的字符串的字符指針,且該指針也不可改變指向
16.MVC的理解?
MVC模式考慮三種對象: 模型對象 Model視圖對象 View控制器對象。Controller 模型對象負責應用程序的數據和定義操作數據的邏輯;視圖對象知道如何顯示應用程序的模型數據;控制器對象是M與V之間的協調者。
17.在Obj-c中有沒有私有方法?私有變量?一般采用什麼方法實現?
objective-c – 類裡面的方法只有兩種, 靜態方法和實例方法.這似乎就不是完整的面向對象了,按照OO的原則就是一個對象只暴露 有用的東西.如果沒有了私有方法的話,對於一些小范圍的代碼重用就不那麼順手了. 在類裡面聲名一個私有方法
@interfaceController : NSObject { NSString *something; }
+(void)thisIsAStaticMethod;
-(void)thisIsAnInstanceMethod;
@end
@interfaceController (private)
-(void)thisIsAPrivateMethod;
@end
@private可以用來修飾私有變量
在Objective‐C中,所有實例變量默認都是私有的,所有實例方法默認都是公有的
18.OC中加號方法與減號的區別?
加號方法是類方法,屬於靜態方法減號方法是實例方法必須由類的實例來調用
19.free與release的區別
20.在終端環境下,分別說明4,2,1,0對應的權限是什麼
linux系統下文件的權限由三位二進制數表示,從左到右依次表示讀、寫、可執行。0表示不行,1表示行。4對應2進制的100,就是可讀不可寫不可執行。
21.ARC機制

ARC就是automatic reference counting ,簡單說就是就是代碼中自動加入了retain/release,原先需要手動添加的用來處理內存管理的引用計數的代碼可以自動地由編譯器完成了。

使用ARC的好處
使用ARC有什麼好處呢?
看到上面的例子,大家就知道了,以後寫Objective-C的代碼變得簡單多了,因為我們不需要擔心煩人的內存管理,擔心內存洩露了,代碼的總量變少了,看上去清爽了不少,也節省了勞動力
代碼高速化,由於使用編譯器管理引用計數,減少了低效代碼的可能性不好的地方
記住一堆新的ARC規則—關鍵字及特性等需要一定的學習周期
一些舊的代碼,第三方代碼使用的時候比較麻煩;修改代碼需要工數,要麼修改編譯開關
22.自動釋放池是什麼,如何工作
當向一個對象發送一個autorelease 消息時,Cocoa就會將該對象的一個引用放入到最新的自動釋放池。它仍然是個正當的對象,因此自動釋放池定義的作用域內的其它對象可以向它發送消息。當程序執行到作用域結束的位置時,自動釋放池就會被釋放,池中的所有對象也就被釋放。 ojc-c 是 通過一種referring counting(引用計數)的方式來管理內存的, 對象在開始分配內存(alloc)的時候引用計數為一,以後每當碰到有copy,retain的時候引用計數都會加一, 每當碰到release和autorelease的時候引用計數就會減一,如果此對象的計數變為了0, 就會被系統銷毀.NSAutoreleasePool 就是用來做引用計數的管理工作的,這個東西一般不用你管的.autorelease和release沒什麼區別,只是引用計數減一的時機不同而已,autorelease會在對象的使用真正結束的時候才做引用計數減一.
23.淺復制和深復制的區別?//淺拷貝和深拷貝
淺層復制(copy):只復制指向對象的指針,而不復制引用對象本身。//通過對象的指針來訪問這個對象深層復制(mutableCopy):復制引用對象本身 意思就是有個A對象,復制一份後得到A_copy對象後,對於淺復制來說,A和A_copy指向的是同一個內存資源,復制的只不過是是一個指針,對象本身資源 還是只有一份,那如果我們對A_copy執行了修改操作,那麼發現A引用的對象同樣被修改,這其實違背了我們復制拷貝的一個思想。深復制就好理解了,內存中存在了 兩份獨立對象本身。//當修改A時,A copy不變。
25.frame和bounds有什麼不同?
frame指的是:該view在父view坐標系統中的位置和大小。(參照點是父親的坐標系統)//frame:框架、結構bounds指的是:該view在本身坐標系統中 的位置和大小。(參照點是本身坐標系統)//bounds:界限
26. obj-c的優缺點
優點: CateogiesPosing動態識別指標計算彈性訊息傳遞不是一個過度復雜的 C 衍生語言Objective-C 與 C++ 可混合編程 缺點: 不支援命名空間不支持運算符重載不支持多重繼承使用動態運行時類型,所有的方法都是函數調用,所以很多編譯時優化方法都用不到。(如內聯函數等),性能低劣。
27.用變量a給出下面的定義
a)一個整型數(An integer)
b)一個指向整型數的指針( A pointer to aninteger)
c)一個指向指針的的指針,它指向的指針是指向一個整型數( Apointer 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) 一個指向函數的指針,該函數有一個整型參數並返回一個整型數(Apointer to a function that takes an integer as an argument
 andreturns an integer)
h)一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數並返回一個整型數( An array of ten pointers to functions t
hat takean integer argument and return an integer )
a) int a; // Aninteger
b) int *a; // A pointer to aninteger
c) int **a; // A pointer to apointer to an integer
d) int a[10]; // An array of10 integers
e) int *a[10]; // An array of10 pointers to integers
f) int (*a)[10]; // A pointerto an array of 10 integers
g) int (*a)(int); // A pointerto a function a that takes an integer argument and returns aninteger
h) int (*a[10])(int); // Anarray of 10 pointers to functions that take an integer argument andreturn an integer
28.寫出幾個死循環?
29.隊列和棧有什麼區別:
隊列和棧是兩種不同的數據容器。從”數據結構”的角度看,它們都是線性結構,即數據元素之間的關系相同。 隊列是一種先進先出的數據結構,它在兩端進行操作,一端進行入隊列操作,一端進行出列隊操作。棧是一種先進後出的數據結構,它只能在棧頂進行操作,入棧和出棧都在棧頂操作。
30.HTTP協議中,POST和GET的區別是什麼?
1.GET方法 GET方法提交數據不安全,數據置於請求行,客戶端地址欄可見;GET方法提交的數據大小有限GET方法不可以設置書簽 2.POST方法 POST方法提交數據安全,數據置於消息主體內,客戶端不可見POST方法提交的數據大小沒有限制POST方法可以設置書簽
31. iOS的系統架構分為
(核心操作系統層theCore OS layer)(核心服務層theCore Services layer)(媒體層theMedia layer)(Cocoa界面服務層the Cocoa Touch layer)四個層次。
32. 控件主要響應3種事件:
(基於觸摸的事件)(基於值的事件)(基於編輯的事件)。
33.xib文件的構成分為哪3個圖標?都具有什麼功能。
File’s Owner是所有nib文件中的每個圖標,它表示從磁盤加載nib文件的對象;First Responder就是用戶當前正在與之交互的對象;View顯示用戶界面;完成用戶交互;是UIView類或其子類。
34. 簡述視圖控件器的生命周期。
loadView盡管不直接調用該方法,如多手動創建自己的視圖,那麼應該覆蓋這個方法並將它們賦值給試圖控制器的view屬性。

viewDidLoad只有在視圖控制器將其視圖載入到內存之後才調用該方法,這是執行任何其他初始化操作的入口。

viewVillAppear當試圖將要添加到窗口中並且還不可見的時候或者上層視圖移出圖層後本視圖變成頂級視圖時調用該方法,用於執行諸如改變視圖方向等的操作。實現該方法時確保調用[super viewWillAppear:].

viewDidAppear當視圖添加到窗口中以後或者上層視圖移出圖層後本視圖變成頂級視圖時調用,用於放置那些需要在視圖顯示後執行的代碼。確保調用[super viewDidAppear:]。viewDidUnload當試圖控制器從內存釋放自己的方法的時候調用,用於清楚那些可能已經在試圖控制器中創建的對象。
35. 動畫有基本類型有哪幾種;表視圖有哪幾種基本樣式?
動畫有兩種基本類型: 隱式動畫顯式動畫。
36. 實現簡單的表格顯示需要設置UITableView的什麼屬性、實現什麼協議?
實現簡單的表格顯示需要設置UITableView 的 dataSource 和 delegate 屬性,實現UITableViewDataSource 和 UITableViewDelegate 協議。
37. Cocoa Touch提供了哪幾種Core Animation過渡類型(10分)?
Cocoa Touch 提供了 4 種 Core Animation 過渡類型,分別為: 交叉淡化推擠顯示覆蓋
38. UIView與CLayer有什麼區別?
UIView 是 iOS 系統中界面元素的基礎,所有的界面元素都是繼承自它。它本身完全是由 CoreAnimation 來實現的。它真正的繪圖部分,是由一個 CALayer 類來管理。 UIView 本身更像是一個 CALayer 的管理器,訪問它的跟繪圖和跟坐標有關的屬性。UIView 有個重要屬性 layer ,可以返回它的主 CALayer 實例。UIView 的 CALayer 類似 UIView 的子 View 樹形結構,也可以向它的 layer 上添加子layer ,來完成某些特殊的表示。即 CALayer 層是可以嵌套的。UIView 的 layer 樹形在系統內部,被維護著三份 copy 。分別是邏輯樹,這裡是代碼可以操縱的;動畫樹,是一個中間層,系統就在這一層上更改屬性,進行各種渲染操作;顯示樹,其內容就是當前正被顯示在屏幕上得內容。動畫的運作:對 UIView 的 subLayer (非主 Layer )屬性進行更改,系統將自動進行動畫生成,動畫持續時間的缺省值似乎是 0.5 秒。坐標系統: CALayer 的坐標系統比 UIView 多了一個 anchorPoint 屬性,使用CGPoint 結構表示,值域是 0~1 ,是個比例值。這個點是各種圖形變換的坐標原點,同時會更改 layer 的 position 的位置,它的缺省值是 {0.5,0.5} ,即在 layer 的中央。渲染:當更新層,改變不能立即顯示在屏幕上。當所有的層都准備好時,可以調用setNeedsDisplay 方法來重繪顯示。變換:要在一個層中添加一個 3D 或仿射變換,可以分別設置層的 transform 或affineTransform 屬性。變形: Quartz Core 的渲染能力,使二維圖像可以被自由操縱,就好像是三維的。圖像可以在一個三維坐標系中以任意角度被旋轉,縮放和傾斜。 CATransform3D 的一套方法提供了一些魔術般的變換效果。
39.鏈表翻轉。
40. 鏈表逆序(C語言)。

鏈表逆序就是把一個鏈表按照原來的鏈接順序逆序實現(也就是將頭變成尾,尾變成頭)。
編程思路:其實最關鍵的是先通過原來的鏈接順序找到下個節點,然後再把前個節點反序。

41. Quatrz 2D的繪圖功能的三個核心概念是什麼並簡述其作用(10分)。
上下文:主要用於描述圖形寫入哪裡;路徑:是在圖層上繪制的內容;狀態:用於保存配置變換的值、填充和輪廓, alpha 值等。
42. iPhone OS主要提供了幾種播放音頻的方法(10分)?
SystemSound ServicesAVAudioPlayer 類Audio Queue ServicesOpenAL
43. 使用AVAudioPlayer類調用哪個框架、使用步驟(10分)?
AVFoundation.framework 步驟: 配置 AVAudioPlayer 對象;實現 AVAudioPlayer 類的委托方法;控制 AVAudioPlayer 類的對象;監控音量水平;回放進度和拖拽播放。
44. 有哪幾種手勢通知方法、寫清楚方法名?
-(void)touchesBegan:(NSSet*)touchedwithEvent:(UIEvent*)event;
-(void)touchesMoved:(NSSet*)touched withEvent:(UIEvent*)event;
-(void)touchesEnded:(NSSet*)touchedwithEvent:(UIEvent*)event;
-(void)touchesCanceled:(NSSet*)touchedwithEvent:(UIEvent*)event;
45. 實例化一個UITableView對象,要求寫出關鍵語句。
UITableView *my = [[UITableView alloc]initWithFrame:<(CGRect)frame> style:<(UITableViewStyle)style>];
my.delegate = self;
my.dataSource = self;
首先需要分配空間設置表格類型然後需要設置兩個必須的委托對象。
46. CFSocket使用有哪幾個步驟(10分)。
創建 Socket 的上下文;創建 Socket ;配置要訪問的服務器信息;封裝服務器信息;連接服務器;
47. Core Foundation中提供了哪幾種操作Socket的方法?
CFNetwork CFSocket BSD Socket 。
48. 解析XML文件有哪幾種方式(10分)?
以 DOM 方式解析 XML 文件以 SAX 方式解析 XML 文件;
49. 自定義一個委托(15分)。
@protocol SimpleProtocol
-(void)doSomething:(NSString*)str;
@end
@interfaceSimpleClass:NSObject< SimpleProtocol >{
}
@end
@implementationSimpleClass
-(void)doSomething:(NSString *)str
{
NSLog(str);
}
@end
50. 類別的作用?繼承和類別在實現中有何區別?
category 可以在不獲悉,不改變原來代碼的情況下往裡面添加新的方法,只能添加,不能刪除修改。 並且如果類別和原來類中的方法產生名稱沖突,則類別將覆蓋原來的方法,因為類別具有更高的優先級。 類別主要有 3 個作用: (1) 將類的實現分散到多個不同文件或多個不同框架中。 (2) 創建對私有方法的前向引用。 (3) 向對象添加非正式協議。 繼承可以增加,修改方法,並且可以增加屬性。
  1. 上一頁:
  2. 下一頁: