ios 面試題整合1

3.在一個對象的方法裏面:self.name= “object”;和\u2028name =”object”\u2028有什麼不同嗎?

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 。
6.實例化一個UITableView對象,要求寫出關鍵語句?
答:UITableView *my = [[UITableView alloc]initWithFrame:<(CGRect)frame> style:<(UITableViewStyle)style>];
my.delegate = self;
my.dataSource = self;
首先需要分配空間設置表格類型
然後需要設置兩個必須的委託對象。
7.使用sql語句查詢出省名以湖開頭,郵編爲436001所在的市區?(5分)(表名及字段名自定義)

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] )  \u2028

{ \u2028 

sizeof(str ) = ?  \u2028

} \u2028

void*p = malloc( 100 ); \u2028sizeof( 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.寫一"\u2028標準"宏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.數組和指針的區別

(1)數組可以申請在棧區和數據區;指針可以指向任意類型的內存塊

(2)sizeof作用於數組時,得到的是數組所佔的內存大小;作用於指針時,得到的都是4個字節的大小

(3)數組名錶示數組首地址,值不可以改變,如不可以將 ++ 作用於數組名上;普通指針的值可以改變,如可將++作用於指針上

(4)用字符串初始化字符數組是將字符串的內容拷貝到字符數組中;用字符串初始化字符指針是將字符串的首地址賦給指針,也就是指針指向了該數組

13.簡述內存分區情況

(1)代碼區:存放函數二進制代碼

(2)數據區:系統運行時申請內存並初始化,系統退出時由系統釋放。存放全局變量、靜態變量、常量

(3)堆區:通過malloc等函數或new等操作符動態申請得到,需程序員手動申請和釋放

(4)棧區:函數模塊內申請,函數結束時由系統自動釋放。存放局部變量、函數參數

 

14.#include<filename>和#include”filename”有什麼區別

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

15.(1)const char *p;(2)charconst*p;(3)char*const p;(4)const char* const p;四個修飾指針有什麼區別

答:(1)定義了一個指向不可變的字符串的字符指針

    (2)和(1)一樣

    (3)定義了一個指向字符串的指針,該指針值不可改變,即不可改變指向

    (4)定義了一個指向不可變的字符串的字符指針,且該指針也不可改變指向


 

19.free與release的區別
free()是C標準庫裏面的,是一個函數。它調用malloc(),可以立即釋放內存。因此它必須有malloc()傳遞一個指針,不然會引起異常。
-release是NSobject類的一個方法。它不會立即釋放內存,它只是減少對象的一個引用計數。一直到它檢測到0,然後調用-dealloc()。
21.ARC機制

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

看到上面的例子,大家就知道了,以後寫Objective-C的代碼變得簡單多了,因爲我們不需要擔心煩人的內存管理,擔心內存泄露了

代碼的總量變少了,看上去清爽了不少,也節省了勞動力

代碼高速化,由於使用編譯器管理引用計數,減少了低效代碼的可能性

不好的地方

記住一堆新的ARC規則—關鍵字及特性等需要一定的學習週期

一些舊的代碼,第三方代碼使用的時候比較麻煩;修改代碼需要工數,要麼修改編譯開關

 22.自動釋放池是什麼,如何工作

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

24. 淺複製和深複製的區別?//淺拷貝和深拷貝\u2028

\u2028淺層複製(copy):只複製指向對象的指針,而不復制引用對象本身。//通過對象的指針來訪問這個對象\u2028

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

25. frame和bounds有什麼不同

\u2028答案:frame指的是:該view在父view座標系統中的位置和大小。(參照點是父親的座標系統)//frame:框架、結構\u2028

bounds指的是:該view在本身座標系統中 的位置和大小。(參照點是本身座標系統)//bounds:界限

26. obj-c的優缺點 

objc優點: 

  1) Cateogies 

  2) Posing 

  3) 動態識別 

  4) 指標計算 

  5)彈性訊息傳遞 

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

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

缺點: 

  1) 不支援命名空間 

  2)  不支持運算符重載 

  3) 不支持多重繼承 

  4) 使用動態運行時類型,所有的方法都是函數調用,所以很多編譯時優化方法都用不到。(如內聯函數等),性能低劣。 

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 

29.隊列和棧有什麼區別:

答:隊列和棧是兩種不同的數據容器。從"數據結構"的角度看,它們都是線性結構,即數據元素之間的關係相同。

隊列是一種先進先出的數據結構,它在兩端進行操作,一端進行入隊列操作,一端進行出列隊操作。

答案: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個圖標?都具有什麼功能。(10分)

答:File’s Owner 是所有nib文件中的每個圖標,它表示從磁盤加載nib文件的對象;

First Responder就是用戶當前正在與之交互的對象;

View顯示用戶界面;完成用戶交互;是UIView類或其子類。

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

答:loadView儘管不直接調用該方法,如多手動創建自己的視圖,那麼應該覆蓋這個方法並將它們賦值給試圖控制器的view屬性。

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

viewDidUnload當試圖控制器從內存釋放自己的方法的時候調用,用於清楚那些可能已經在試圖控制器中創建的對象。

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

viewDidAppear當視圖添加到窗口中以後或者上層視圖移出圖層後本視圖變成頂級視圖時調用,用於放置那些需要在視圖顯示後執行的代碼。確保調用[super viewDidAppear]

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

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

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

答:實現簡單的表格顯示需要設置UITableViewdataSourcedelegate屬性,實現UITableViewDataSourceUITableViewDelegate協議。

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

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

38.  UIView與CLayer有什麼區別(10分)?

答:1. UIViewiOS系統中界面元素的基礎,所有的界面元素都是繼承自它。它本身完全是由CoreAnimation來實現的。它真正的繪圖部分,是由一個CALayer類來管理。UIView本身更像是一個CALayer的管理器,訪問它的跟繪圖和跟座標有關的屬性。

2. UIView有個重要屬性layer,可以返回它的主CALayer實例。

3. UIViewCALayer類似UIView的子View樹形結構,也可以向它的layer上添加子layer,來完成某些特殊的表示。即CALayer層是可以嵌套的。

4. UIViewlayer樹形在系統內部,被維護着三份copy。分別是邏輯樹,這裏是代碼可以操縱的;動畫樹,是一箇中間層,系統就在這一層上更改屬性,進行各種渲染操作;顯示樹,其內容就是當前正被顯示在屏幕上得內容。

5. 動畫的運作:對UIViewsubLayer(非主Layer)屬性進行更改,系統將自動進行動畫生成,動畫持續時間的缺省值似乎是0.5秒。

6. 座標系統:CALayer的座標系統比UIView多了一個anchorPoint屬性,使用CGPoint結構表示,值域是0~1,是個比例值。這個點是各種圖形變換的座標原點,同時會更改layerposition的位置,它的缺省值是{0.5,0.5},即在layer的中央。

7.渲染:當更新層,改變不能立即顯示在屏幕上。當所有的層都準備好時,可以調用setNeedsDisplay方法來重繪顯示。

8.變換:要在一個層中添加一個3D或仿射變換,可以分別設置層的transformaffineTransform屬性。

9.變形:Quartz Core的渲染能力,使二維圖像可以被自由操縱,就好像是三維的。圖像可以在一個三維座標系中以任意角度被旋轉,縮放和傾斜。CATransform3D的一套方法提供了一些魔術般的變換效果。

40.  鏈表逆序(C語言)(10分)。

鏈表逆序就是把一個鏈表按照原來的鏈接順序逆序實現(也就是將頭變成尾,尾變成頭)。

編程思路:其實最關鍵的是先通過原來的鏈接順序找到下個節點,然後再把前個節點反序。

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

答:上下文:主要用於描述圖形寫入哪裏;

路徑:是在圖層上繪製的內容;

狀態:用於保存配置變換的值、填充和輪廓,alpha值等。

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

答:SystemSound Services

AVAudioPlayer

Audio Queue Services

OpenAL

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

答:AVFoundation.framework

步驟:配置AVAudioPlayer對象;

實現AVAudioPlayer類的委託方法;

控制AVAudioPlayer類的對象;

監控音量水平;

回放進度和拖拽播放。

44.  有哪幾種手勢通知方法、寫清楚方法名(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; 

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

答: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的方法(10分)?

答:CFNetworkCFSocketBSD Socket

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

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

49.  delegate 自定義一個委託(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)向對象添加非正式協議。繼承可以增加,修改方法,並且可以增加屬性。

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

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

52.關於多態性\u2028

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

53.對於單例的理解\u2028

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

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

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

55.\u2028一個tableView是否可以關聯兩個不同的數據源?你會怎麼處理?

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

57. id聲明的對象有什麼特性?

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

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

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

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

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

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

iOS中可以有四種持久化數據的方式:屬性列表、對象歸檔、SQLite3Core Datacore 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支持對一、對多的關係。

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

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

例:*****A*BC*DEF*G****    結果爲:A*BC*DEF*G****

void fun (char *a)

 {

int j=0;

char *p=a;

while (*p=='*')p++;

while (*p){

a[j++]=*p;

p++;

 }

a[j]=0;

 }

64.截取字符串”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];

65.獲取項目根路徑,並在其下創建一個名稱爲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];

}

66.tableView的重用機制(10分)?

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

67.這段代碼有什麼問題嗎

@implementation Person  

i.       (void)setAge:(int)newAge

{  self.age = newAge;  }

死循環

68.用變量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);

 

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

比如"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;

}

70.objective-c中的數字對象都有哪些,簡述它們與基本數據類型的區別是什麼?

在OC中NSNumber是數字對象,可以進行拆裝箱操作!

//將int轉爲NSNumber

NSNumber *num = [NSNumber numberWithInt:123];

//得到一個int

inttestNum = [numintValue];

71.用NSLog函數輸出一個浮點類型,結果四捨五入,並保留一位小數

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

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

詞典NSDictionary,可變詞典NSMutableDictionary,

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

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

//添加

[dicsetObject:@"value3"forKey:@"key3"];

//刪除

[dicremoveObjectForKey:@"key3"];

//獲取(按key獲取)

[dicobjectForKey:@"key1"];

73.獲取項目根路徑,並在其下創建一個名稱爲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];

}

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

do-while 先執行循環體,然後判斷條件,如果條件判斷爲ture,則繼續執行循環體,如果判斷爲false,則不執行循環體

while-do 是先判斷條件是否正確,若正確則執行循環體,若不正確則不執行循環體。

所以do-while至少循環一次,而while-do有可能一次也不循環。

75.用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;

}

76.單件實例是什麼(10分)。

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

77.自動釋放池是什麼,如何工作。

當您向一個對象發送一個autorelease消息時,Cocoa就會將該對象的一個引用放入到最新的自動釋放池。它仍然是個正當的對象,因此自動釋放池定義的作用域內的其它對象可以向它發送消息。當程序執行到作用域結束的位置時,自動釋放池就會被釋放,池中的所有對象也就被釋放
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章