iOS面試題合集(77道)

  1. #import#include的區別 @class

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

  1. readwrite,readonly,assign,retain,copy,nonatomic 屬性的作用

@property是 一個屬性訪問聲明,擴號內支持以下幾個屬性:
1,getter=getName,setter=setName,設置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,非原子性訪問,不加同步, 多線程并發訪問會提高性能。注意,如果不加此屬性,則默認是兩個訪問方法都為原子型事務訪問。鎖被加到所屬對象實例級(我是這么理解的…)。

  1. 在一個對象的方法里面:self.name= “object”;和 name =”object” 有什么不同嗎?

答:
self.name =”object”:會調用對象的setName()方法;
name = “object”:會直接把object賦值給當前對象的name屬性。

  1. 請簡述self.name= nil的機制,以及與[name release]的區別?

self.name =nil; //使用nil參數調用setName:方法
[name release]生成的訪問器將自動釋放以前的name對象

  1. 請簡要說明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 。

  1. 實例化一個UITableView對象,要求寫出關鍵語句?

答:
UITableView *my = [[UITableView alloc]initWithFrame:<(CGRect)frame> style:<(UITableViewStyle)style>];
my.delegate = self;
my.dataSource = self;
首先需要分配空間設置表格類型
然后需要設置兩個必須的委托對象。

  1. 使用sql語句查詢出省名以湖開頭,郵編為436001所在的市區?(5分)(表名及字段名自定義)

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

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

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

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

  1. 寫一” 標準”宏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會作三次++自增操作。

  1. 數組和指針的區別

(1)數組可以申請在棧區和數據區;指針可以指向任意類型的內存塊
(2)sizeof作用于數組時,得到的是數組所占的內存大小;作用于指針時,得到的都是4個字節的大小
(3)數組名表示數組首地址,值不可以改變,如不可以將++作用于數組名上;普通指針的值可以改變,如可將++作用于指針上
(4)用字符串初始化字符數組是將字符串的內容拷貝到字符數組中;用字符串初始化字符指針是將字符串的首地址賦給指針,也就是指針指向了該數組

  1. static的作用

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

  1. 簡述內存分區情況

(1)代碼區:存放函數二進制代碼
(2)數據區:系統運行時申請內存并初始化,系統退出時由系統釋放。存放全局變量、靜態變量、常量
(3)堆區:通過malloc等函數或new等操作符動態申請得到,需程序員手動申請和釋放
(4)棧區:函數模塊內申請,函數結束時由系統自動釋放。存放局部變量、函數參數

  1. #include<filename>#include”filename”有什么區別

答:#include<filename>直接在庫文件目錄中搜索所包含的文件;#include”filename”在當前目錄下搜索所包含的文件,如果沒有的話再到庫文件目錄搜索。

  1. const char p; charconstp; charconst p; const char const p;四個修飾指針有什么區別

答:
(1)定義了一個指向不可變的字符串的字符指針
(2)和(1)一樣
(3)定義了一個指向字符串的指針,該指針值不可改變,即不可改變指向
(4)定義了一個指向不可變的字符串的字符指針,且該指針也不可改變指向

  1. MVC的理解?

答:MVC模式考慮三種對象:模型對象、視圖對象和控制器對象。 模型對象負責應用程序的數據和定義操作數據的邏輯; 視圖對象知道如何顯示應用程序的模型數據; 控制器對象是M與V之間的協調者。

  1. 在Obj-c中有沒有私有方法?私有變量?一般采用什么方法實現?

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

    @interfaceController : NSObject { NSString *something; }

    +(void)thisIsAStaticMethod;

    -(void)thisIsAnInstanceMethod;

    @end

    @interfaceController (private)

    -(void)thisIsAPrivateMethod;

    @end

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

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

  1. OC中加號方法與減號的區別?

加號方法是類方法,屬于靜態方法
減號方法是實例方法必須由類的實例來調用

  1. free與release的區別
  2. 在終端環境下,分別說明4,2,1,0對應的權限是什么
  3. ARC機制

ARC就是automatic reference counting ,簡單說就是就是代碼中自動加入了retain/release,原先需要手動添加的用來處理內存管理的引用計數的代碼可以自動地由編譯器完成了。
使用ARC的好處
使用ARC有什么好處呢?
看到上面的例子,大家就知道了,以后寫Objective-C的代碼變得簡單多了,因為我們不需要擔心煩人的內存管理,擔心內存泄露了
代碼的總量變少了,看上去清爽了不少,也節省了勞動力
代碼高速化,由于使用編譯器管理引用計數,減少了低效代碼的可能性
不好的地方
記住一堆新的ARC規則—關鍵字及特性等需要一定的學習周期
一些舊的代碼,第三方代碼使用的時候比較麻煩;修改代碼需要工數,要么修改編譯開關

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

當 您向一個對象發送一個autorelease 消息時,Cocoa就會將該對象的一個引用放入到最新的自動釋放池。它仍然是個正當的對象,因此自動釋放池定義的作用域內的其它對象可以向它發送消息。當 程序執行到作用域結束的位置時,自動釋放池就會被釋放,池中的所有對象也就被釋放。

  • ojc-c 是 通過一種”referring counting”(引用計數)的方式來管理內存的, 對象在開始分配內存(alloc)的時候引用計數為一,以后每當碰到有copy,retain的時候引用計數都會加一, 每當碰到release和autorelease的時候引用計數就會減一,如果此對象的計數變為了0, 就會被系統銷毀.
  • NSAutoreleasePool 就是用來做引用計數的管理工作的,這個東西一般不用你管的.
  • autorelease和release沒什么區別,只是引用計數減一的時機不同而已,autorelease會在對象的使用真正結束的時候才做引用計數減一.
  1. ViewController 的 loadView, viewDidLoad,viewDidUnload 分別是在什么時候調用的?在自定義ViewController的時候這幾個函數里面應該做什么工作?

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 。

  1. 淺復制和深復制的區別?//淺拷貝和深拷貝

答案:
淺層復制(copy):只復制指向對象的指針,而不復制引用對象本身。//通過對象的指針來訪問這個對象
深層復制(mutableCopy):復制引用對象本身 意思就是有個A對象,復制一份后得到A_copy對象后,對于淺復制來說,A和A_copy指向的是同一個內存資源,復制的只不過是是一個指針,對象本身 資源 還是只有一份,那如果我們對A_copy執行了修改操作,那么發現A引用的對象同樣被修改,這其實違背了我們復制拷貝的一個思想。深復制就好理解了,內存 中存在了 兩份獨立對象本身。//當修改A時,A copy不變。

  1. frame和bounds有什么不同?

答案:frame指的是:該view在父view坐標系統中的位置和大小。(參照點是父親的坐標系統)//frame:框架、結構
bounds指的是:該view在本身坐標系統中 的位置和大小。(參照點是本身坐標系統)//bounds:界限

  1. obj-c的優缺點

答案:
objc優點:

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

  1. 寫出幾個死循環?
  2. 隊列和棧有什么區別:

答:隊列和棧是兩種不同的數據容器。從”數據結構”的角度看,它們都是線性結構,即數據元素之間的關系相同。
隊列是一種先進先出的數據結構,它在兩端進行操作,一端進行入隊列操作,一端進行出列隊操作。
棧是一種先進后出的數據結構,它只能在棧頂進行操作,入棧和出棧都在棧頂操作。

  1. HTTP協議中,POST和GET的區別是什么?

答案:
1.GET 方法
GET 方法提交數據不安全,數據置于請求行,客戶端地址欄可見;
GET 方法提交的數據大小有限
GET 方法不可以設置書簽
2.POST 方法
POST 方法提交數據安全,數據置于消息主體內,客戶端不可見
POST 方法提交的數據大小沒有限制
POST 方法可以設置書簽

  1. iOS的系統架構分為( 核心操作系統層 theCore OS layer )、( 核心服務層theCore Services layer )、( 媒體層 theMedia layer )和( Cocoa 界面服務層 the Cocoa Touch layer )四個層次。
  2. 控件主要響應3種事件:( 基于觸摸的事件 )、( 基于值的事件 )和( 基于編輯的事件 )。
  3. xib文件的構成分為哪3個圖標?都具有什么功能。(10分)

答: File’s Owner 是所有 nib 文件中的每個圖標,它表示從磁盤加載 nib 文件的對象;
First Responder 就是用戶當前正在與之交互的對象;
View 顯示用戶界面;完成用戶交互;是 UIView 類或其子類。

  1. 簡述視圖控件器的生命周期(10分)。

答: loadView 盡管不直接調用該方法,如多手動創建自己的視圖,那么應該覆蓋這個方法并將它們賦值給試圖控制器的 view 屬性。
viewDidLoad 只有在視圖控制器將其視圖載入到內存之后才調用該方法,這是執行任何其他初始化操作的入口。
viewDidUnload 當試圖控制器從內存釋放自己的方法的時候調用,用于清楚那些可能已經在試圖控制器中創建的對象。
viewVillAppear 當試圖將要添加到窗口中并且還不可見的時候或者上層視圖移出圖層后本視圖變成頂級視圖時調用該方法,用于執行諸如改變視圖方向等的操作。實現該方法時確保調用 [super viewWillAppear:].
viewDidAppear 當視圖添加到窗口中以后或者上層視圖移出圖層后本視圖變成頂級視圖時調用,用于放置那些需要在視圖顯示后執行的代碼。確保調用 [super viewDidAppear: ] 。

  1. 動畫有基本類型有哪幾種;表視圖有哪幾種基本樣式(10分)?

答:動畫有兩種基本類型:隱式動畫和顯式動畫。

  1. 實現簡單的表格顯示需要設置UITableView的什么屬性、實現什么協議(10分)?

答:實現簡單的表格顯示需要設置 UITableView 的 dataSource 和 delegate 屬性,實現UITableViewDataSource 和 UITableViewDelegate 協議。

  1. Cocoa Touch提供了哪幾種Core Animation過渡類型(10分)?

答: Cocoa Touch 提供了 4 種 Core Animation 過渡類型,分別為:交叉淡化、推擠、顯示和覆蓋。

  1. UIView與CLayer有什么區別(10分)?

答:

  • 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 的一套方法提供了一些魔術般的變換效果。

  1. 鏈表翻轉。
  2. 鏈表逆序(C語言)(10分)。

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

  1. Quatrz 2D的繪圖功能的三個核心概念是什么并簡述其作用(10分)。

答:
上下文:主要用于描述圖形寫入哪里;
路徑:是在圖層上繪制的內容;
狀態:用于保存配置變換的值、填充和輪廓, alpha 值等。

  1. iPhone OS主要提供了幾種播放音頻的方法(10分)?

答:
SystemSound Services
AVAudioPlayer 類
Audio Queue Services
OpenAL

  1. 使用AVAudioPlayer類調用哪個框架、使用步驟(10分)?

答: AVFoundation.framework
步驟:配置 AVAudioPlayer 對象;
實現 AVAudioPlayer 類的委托方法;
控制 AVAudioPlayer 類的對象;
監控音量水平;
回放進度和拖拽播放。

  1. 有哪幾種手勢通知方法、寫清楚方法名(10分)?

答:
-(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;

  1. 實例化一個UITableView對象,要求寫出關鍵語句(10分)。

答:
UITableView *my = [[UITableView alloc]initWithFrame:<(CGRect)frame> style:<(UITableViewStyle)style>];
my.delegate = self;
my.dataSource = self;
首先需要分配空間設置表格類型
然后需要設置兩個必須的委托對象。

  1. CFSocket使用有哪幾個步驟(10分)。

答:創建 Socket 的上下文;創建 Socket ;配置要訪問的服務器信息;封裝服務器信息;連接服務器;

  1. Core Foundation中提供了哪幾種操作Socket的方法(10分)?

答: CFNetwork 、 CFSocket 和 BSD Socket 。

  1. 解析XML文件有哪幾種方式(10分)?

答:以 DOM 方式解析 XML 文件;以 SAX 方式解析 XML 文件;

  1. 自定義一個委托(15分)。

答:
@protocol SimpleProtocol
-(void)doSomething:(NSString*)str;
@end

    @interfaceSimpleClass:NSObject< SimpleProtocol >{

    }

    @end

    @implementationSimpleClass

    -(void)doSomething:(NSString *)str

    {
        NSLog(str);
    }
    @end
  1. 類別的作用?繼承和類別在實現中有何區別?

答 案: category 可以在不獲悉,不改變原來代碼的情況下往里面添加新的方法,只能添加,不能刪除修改。 并且如果類別和原來類中的方法產生名稱沖 突,則類別將覆蓋原來的方法,因為類別具有更高的優先級。 類別主要有 3 個作用: (1) 將類的實現分散到多個不同文件或多個不同框架 中。 (2) 創建對私有方法的前向引用。 (3) 向對象添加非正式協議。 繼承可以增加,修改方法,并且可以增加屬性。

  1. 通知和協議的不同之處?

答 案:協議有控制鏈 (has-a) 的關系,通知沒有。 首先我一開始也不太明白,什么叫控制鏈(專業術語了 ~ )。但是簡單分析下通知和代理的行為模 式,我們大致可以有自己的理解 簡單來說,通知的話,它可以一對多,一條消息可以發送給多個消息接受者。代理按我們的理解,到不是直接說不能一對多,比如 我們知道的明星經濟代理人,很多時候一個經濟人負責好幾個明星的事務。 只是對于不同明星間,代理的事物對象都是不一樣的,一一對應,不可能說明天要處 理 A 明星要一個發布會,代理人發出處理發布會的消息后,別稱 B 的 發布會了。但是通知就不一樣,他只關心發出通知,而不關心多少接收到感興趣要處 理。 因此控制鏈( has-a 從英語單詞大致可以看出,單一擁有和可控制的對應關系。

  1. 關于多態性

答案:多態,子類指針可以賦值給父類。 這個題目其實可以出到一切面向對象語言中, 因此關于多態,繼承和封裝基本最好都有個自我意識的理解,也并非一定要把書上資料上寫的能背出來。 最重要的是轉化成自我理解。

  1. 對于單例的理解

答案:基本能用熟悉的語言寫出一個單例,以及可以運用到的場景或是你編程中碰到過運用的此種模式的框架類等。 進一步點,考慮下如何在多線程訪問單例時的安全性。

  1. 是否在一個視圖控制器中嵌入兩個tableview控制器?

答 案:一個視圖控制只提供了一個 View 視圖,理論上一個 tableViewController 也不能放吧, 只能說可以嵌入一 個 tableview 視圖。當然,題目本身也有歧義,如果不是我們定性思維認為的 UIViewController , 而是宏觀的表示視圖控制 者,那我們倒是可以把其看成一個視圖控制者,它可以控制多個視圖控制器,比如 TabbarController 那樣的感覺。

  1. 一個tableView是否可以關聯兩個不同的數據源?你會怎么處理?

答 案:首先我們從代碼來看,數據源如何關聯上的,其實是在數據源關聯的代理方法里實現的。 因此我們并不關心如何去關聯他,他怎么關聯上,方法只是讓我返回 根據自己的需要去設置如相關的數據源。 因此,我覺得可以設置多個數據源啊,但是有個問題是,你這是想干嘛呢?想讓列表如何顯示,不同的數據源分區塊顯 示?

  1. Object -c 的類可以多重繼承么?可以實現多個接口么?重寫一個類的方式用繼承好還是分類 好?為什么?

答案: Objective-c 只支持單繼承,如果要實現多繼承的話,可以通過類別和協議的方式來實現, cocoa 中所有的類都是 NSObject 的子類,多繼承在這里是用 protocol 委托代理來實現的。

  1. id 聲明的對象有什么特性?

答案: id 是個很重要的類型,是個可以指向任何類型的指針或者可以理解為指向任何未知類型的指針。

  1. 自動釋放池跟GC (垃圾回收)有什么區別?iPhone上有GC么?[poolrelease] 和[pooldrain]有什么區別?

iPhone 上 沒有 GC 。 iPhone 開發的時候沒有垃圾回收機制。 在垃圾回收環境中,release 是一個空操作。因 此, NSAutoreleasePool 提供了 drain 方法,在引用計數環境中,該方法的作用等同于調用 release ,但在垃圾回收環境 中,它會觸發垃圾回收(如果自上次垃圾回收以來分配的內存大于當前的閾值)。因此,在通常情況下,您應該使用 drain 而不是 release 來銷 毀自動釋放池。

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

答案 : 進程和線程都是由操作系 統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的并發性。 程和線程的主要差別在于它們是不同的操作系統資源管理方式。進程有獨立的地 址空間,一個進程崩潰后,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的 地址空間,一個線程死掉就等于整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對于一些要求同時進 行并且又要共享某些變量的并發操作,只能用線程,不能用進程。

  1. ios 平臺怎么做數據的持久化?coredata 和sqlite有無必然聯系?coredata是一個關系型數據庫嗎?

iOS 中 可以有四種持久化數據的方式:屬性列表、對象歸檔、 SQLite3 和 Core Data; core data 可以使你以圖形界面的方式快速的定義 app 的數據模型,同時在你的代碼中容易獲取到它。 coredata 提供了基礎結構去處理常用的功 能,例如保存,恢復,撤銷和重做,允許你在 app 中繼續創建新的任務。在使用 core data 的時候,你不用安裝額外的數據庫系統,因為 core data 使用內置的 sqlite 數據庫。 core data 將你 app 的模型層放入到一組定義在內存中的數據對象。 coredata 會追蹤這些對象的改變,同時可以根據需要做相反的改變,例如用 戶執行撤銷命令。當 core data 在對你 app 數據的改變進行保存的時候, core data 會把這些數據歸檔,并永久性保存。 mac os x 中sqlite 庫,它是一個輕量級功能強大的關系數據引擎,也很容易嵌入到應用程序。可以在多個平臺使用, sqlite 是一個輕量級的嵌入 式 sql 數據庫編程。與 core data 框架不同的是, sqlite 是使用程序式的, sql 的主要的 API 來直接操作數據表。 Core Data 不是一個關系型數據庫,也不是關系型數據庫管理系統 (RDBMS) 。雖然 Core Dta 支持SQLite 作為一種存儲類型,但它不能使用任意的 SQLite 數據庫。 Core Data 在使用的過程種自己創建這個數據庫。 Core Data 支持對一、對多的關系。

  1. obj-c 有多重繼承么? 如果沒有什么替代方法?

cocoa 中所有的類都是NSObject 的子類,多繼承在這里是用protocol 委托代理來實現的。你不用去考慮繁瑣的多繼承,虛基類的概念。

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

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

    @interface Controller : NSObject { NSString *something; }

    + (void)thisIsAStaticMethod;

    - (void)thisIsAnInstanceMethod;

    @end

    @interface Controller (private) -

    (void)thisIsAPrivateMethod;

    @end

@private 可以用來修飾私有變量
在Objective‐C 中,所有實例變量默認都是私有的,所有實例方法默認都是公有的

  1. 假定輸入的字符串中只包含字母和* 號。編寫函數fun,功能是,除了中間和尾部的*號外,

將字符串中其他* 號全部刪除。編寫時,不用c的其他函數。
例:*****ABCDEFG**** 結果為:ABCDEFG****

    void fun (char *a)

    {
      int j=0;
      char *p=a;
      while (*p==’*')p++;
      while (*p){
          a[j++]=*p;
          p++;
     }
      a[j]=0;
     }
  1. 截取字符串”20 |http://www.621life.com“ 中 ‘|’字符前面及后面的數據,分別輸出它們(10分)。
    NSString *str = “20|http://www.621life.com”;
    NSRange range = [strrangeOfString:@"|"];
    int location = range.location;
    NSString *str1 = [strsubstringToIndex:location];
    NSString *str2 = [str substringFromIndex:location+1];
    
  2. 獲取項目根路徑,并在其下創建一個名稱為userData 的目錄。(10分)。
    // 獲取根路徑
    NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
    NSString *documentsDirectory = [paths objectAtIndex:];
    
    // 創建文件系統管理器
    NSFileManager *fileManager = [[NSFileManageralloc] init];
    // 判斷userData 目錄是否存在
    if(![fileManagerfileExistsAtPath:[NSStringstringWithFormat:@"%@/userData",documentsDirectory]]) {
    // 不存在, 創建一個userData目錄
    [fileManagercreateDirectoryAtPath:[NSStringstringWithFormat:@"%@/userData",documentsDirectory]withIntermediateDirectories:falseattributes:nilerror:nil];
    }
    
  3. tableView 的重用機制(10 分)?

UITableView 通 過重用單元格來達到節省內存的目的: 通過為每個單元格指定一個重用標識符(reuseIdentifier),即指定了單元格的種類,以及當單元格滾出 屏幕時,允許恢復單元格以便重用.對于不同種類的單元格使用不同的ID,對于簡單的表格,一個標識符就夠了.

  1. 這段代碼有什么問題嗎
    @implementation Person  
    
    - (void)setAge:(int)newAge
    {  
        self.age = newAge;  
     }
    死循環
    
  2. 用變量a 給出下面的定義

a) 一個整型
b) 一個指向整型數的指針
c) 一個指向指針的的指針,它指向的指針是指向一個整型數
d) 一個有10 個整型數的數組
e) 一個有10 個指針的數組,該指針是指向一個整型數的
f) 一個指向有10 個整型數數組的指針
g) 一個指向函數的指針,該函數有一個整型參數并返回一個整型數
h) 一個有10 個指針的數組,該指針指向一個函數,該函數有一個整型參數并返回一個整型數
a) int a;
b) int *a;
c) int a;
d) int a[10]
e) int a[10];
f) int (
a)[10];
g) int (
a)(int);
i) int (
a[10])(int);

  1. 給定一個字符串,輸出本字符串中只出現一次并且最靠前的那個字符的位置?

比如”abaccddeeef” 則是b,輸出2

    int find(char *_str)
    {
        char *p = _str;
        inti = 1;
        while (*p)
            {
                char *temp = _str;
                while (*temp)
          {
                if ((*p ==*temp)&&(p != temp))
                  {
                      break;
                   }
                temp++;
                 if (*temp == 0) {
                               returni;
                  }
            }
                  i++;
                  p++;
          }
          return-1;
        }

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    intfind_char(constchar* str)
    {
        staticintpos[256];
        const unsigned char* p =(const unsigned char*)str;
        inti = 0;
        if( (!str) || (!(*str)) )return -1;
        memset(pos,-1,sizeof(pos));
        while(*p){
            if(pos[*p] == -1){
            pos[*p] = p-(const unsigned char*)str;
      }else{
            pos[*p] = -2;
      }
         p++;
     }
    for(i=0;i<sizeof(pos)/sizeof(pos[0]);i++){
    if(pos[i]>=0)returnpos[i];
    }
      return -1;
    }
    int main()
    {
        constchar* p =”abaccddeeef”;
        intpos = find_char(p);
        printf(“%d, it is’%c’\n”,pos,pos!=-1?p[pos]:’ ‘);
        p =”abcdefghijklmnopqrstuvwxyz “
        “abcdefghijklmnopqrstuwxyz”;
        pos = find_char(p);
        printf(“%d, it is’%c’\n”,pos,pos!=-1?p[pos]:’ ‘);
        return0;
     }
  1. objective-c 中的數字對象都有哪些,簡述它們與基本數據類型的區別是什么?

在OC 中NSNumber是數字對象,可以進行拆裝箱操作!
// 將int 轉為NSNumber
NSNumber *num = [NSNumber numberWithInt:123];
// 得到一個int
inttestNum = [numintValue];

  1. 用NSLog 函數輸出一個浮點類型,結果四舍五入,并保留一位小數

NSLog(@”%0.1f”,4.4324);

  1. objective-c 中的詞典對象、可變詞典對象是哪個,初始化一個含有兩個鍵值對的可變詞典對象,并動態的添加和刪除一條記錄,輸出第一條記錄.

詞典NSDictionary ,可變詞典NSMutableDictionary,
// 初始化一個可變詞典,帶有2 個鍵值對
NSMutableDictionary *dic =[NSMutableDictionarydictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2",nil];
// 添加
[dicsetObject:@"value3"forKey:@"key3"];
// 刪除
[dicremoveObjectForKey:@"key3"];
// 獲取(按key 獲取)
[dicobjectForKey:@"key1"];

  1. 獲取項目根路徑,并在其下創建一個名稱為userData 的目錄。

// 獲取根路徑
NSArray paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString
documentsDirectory = [paths objectAtIndex:];
// 創建文件系統管理器
NSFileManager *fileManager= [[NSFileManageralloc] init];
// 判斷userData 目錄是否存在
if(![fileManagerfileExistsAtPath:[NSStringstringWithFormat:@"%@/userData",documentsDirectory]]) {
// 不存在, 創建一個userData目錄
[fileManagercreateDirectoryAtPath:[NSStringstringWithFormat:@"%@/userData",documentsDirectory]withIntermediateDirectories:falseattributes:nilerror:nil];
}

  1. do-while 與 while-do 的區別?

do-while 先執行循環體,然后判斷條件,如果條件判斷為ture ,則繼續執行循環體,如果判斷為false,則不執行循環體
while-do 是先判斷條件是否正確,若正確則執行循環體,若不正確則不執行循環體。
所以do-while 至少循環一次,而while-do有可能一次也不循環。

  1. 用C 語言,求2到100內的所有素數和。
    #include<stdio.h>
    
      intisPrime(int n)             // 求素數,這是最經典的算法代碼。建議記住
    {
      inti;
      for(i=2;i*i<=n;i++)
      if(n%i==0)
      return 0;
      return 1;
    }
      int main()
    {
      inti,sum=0;
      for(i=2;i<100;i++)
      if( isPrime(i))
      sum+=i;
      printf(“%5d”,sum);
      return 0 ;
     }
    
      intisPrime(int n)
    {
       inti;
       for(i=2;i<=n/2;i++)
    

    {
    if(n%i==0)
    break;
    }
    if(i>n/2)
    return1;
    else
    return0;
    }

  2. 單件實例是什么(10分)。

Foundation 和 Application Kit 框架中的一些 類 只允 許創 建 單 件 對 象,即 這 些 類 在當前 進 程中的唯一 實 例。 舉 例 來 說 ,NSFileManager 和NSWorkspace 類 在使用時 都是基于 進 程 進 行 單 件 對 象的 實 例化。當 向 這 些 類請 求 實 例的 時 候,它 們會向您 傳遞單 一 實 例的一個引用,如果 該實 例 還 不存在, 則 首先 進 行 實 例的分配 和初始化。 單 件 對 象充當控制中心的角色, 負責 指引或 協調類 的各種服 務 。如果 類 在概念上只有一個 實 例(比如
NSWorkspace ),就 應該產 生 一個 單 件 實 例,而不是多個 實 例;如果將來某一天可能有多個 實 例,您可以使用 單 件 實 例機制,而不是工廠方法或函數。

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

當您向一個對象發送一個autorelease 消息時,Cocoa就會將該對象的一個

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容