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,設置可供訪問級別
2,assign,setter方法直接賦值,不進行任何retain操作,為了解決原類型與環循引用問題
3,retain,setter方法對參數進行release舊值再retain新值,所有 實現都是這個順序(CC上有相關資料)
4,copy,setter方法進行Copy操作,與retain處理流程一樣,先舊值release,再 Copy出新的對象,retainCount為1。這是為了減少對上下文的依賴而引入的機制。
5,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 。
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] )
{
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.數組和指針的區別
(1)數組可以申請在棧區和數據區;指針可以指向任意類型的內存塊
(2)sizeof作用於數組時,得到的是數組所占的內存大小;作用於指針時,得到的都是4個字節的大小
(3)數組名表示數組首地址,值不可以改變,如不可以將++作用於數組名上;普通指針的值可以改變,如可將++作用於指針上
(4)用字符串初始化字符數組是將字符串的內容拷貝到字符數組中;用字符串初始化字符指針是將字符串的首地址賦給指針,也就是指針指向了該數組
12.static的作用
(1)函數體內static 變量的作用范圍為該函數體,不同於 auto 變量,該變量的內存只被分配一次,
因此其值在下次調用時仍維持上次的值;
(2)在模塊內的static 全局變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問;
(3)在模塊內的static 函數只可被這一模塊內的其它函數調用,這個函數的使用范圍被限制在聲明
它的模塊內;
(4)在類中的static 成員變量屬於整個類所擁有,對類的所有對象只有一份拷貝;
(5)在類中的static 成員函數屬於整個類所擁有,這個函數不接收 this 指針,因而只能訪問類的static 成員變量。
13.簡述內存分區情況
(1)代碼區:存放函數二進制代碼
(2)數據區:系統運行時申請內存並初始化,系統退出時由系統釋放。存放全局變量、靜態變量、常量
(3)堆區:通過malloc等函數或new等操作符動態申請得到,需程序員手動申請和釋放
(4)棧區:函數模塊內申請,函數結束時由系統自動釋放。存放局部變量、函數參數
14.#include<filename>和#include”filename”有什麼區別
答:#include<filename>直接在庫文件目錄中搜索所包含的文件;#include”filename”在當前目錄下搜索所包含的文件,如果沒有的話再到庫文件目錄搜索。
15.const char *p; charconst*p; char*const p; const char* const p;四個修飾指針有什麼區別
答:(1)定義了一個指向不可變的字符串的字符指針
(2)和(1)一樣
(3)定義了一個指向字符串的指針,該指針值不可改變,即不可改變指向
(4)定義了一個指向不可變的字符串的字符指針,且該指針也不可改變指向
16.MVC的理解?
答:MVC模式考慮三種對象:模型對象、視圖對象和控制器對象。 模型對象負責應用程序的數據和定義操作數據的邏輯; 視圖對象知道如何顯示應用程序的模型數據; 控制器對象是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對應的權限是什麼
21.ARC機制
ARC就是automatic reference counting ,簡單說就是就是代碼中自動加入了retain/release,原先需要手動添加的用來處理內存管理的引用計數的代碼可以自動地由編譯器完成了。
使用ARC的好處
使用ARC有什麼好處呢?
看到上面的例子,大家就知道了,以後寫Objective-C的代碼變得簡單多了,因為我們不需要擔心煩人的內存管理,擔心內存洩露了
代碼的總量變少了,看上去清爽了不少,也節省了勞動力
代碼高速化,由於使用編譯器管理引用計數,減少了低效代碼的可能性
不好的地方
記住一堆新的ARC規則—關鍵字及特性等需要一定的學習周期
一些舊的代碼,第三方代碼使用的時候比較麻煩;修改代碼需要工數,要麼修改編譯開關
22.自動釋放池是什麼,如何工作
當您向一個對象發送一個autorelease 消息時,Cocoa就會將該對象的一個引用放入到最新的自動釋放池。它仍然是個正當的對象,因此自動釋放池定義的作用域內的其它對象可以向它發送消息。當程序執行到作用域結束的位置時,自動釋放池就會被釋放,池中的所有對象也就被釋放。
1. ojc-c 是 通過一種"referring counting"(引用計數)的方式來管理內存的, 對象在開始分配內存(alloc)的時候引用計數為一,以後每當碰到有copy,retain的時候引用計數都會加一, 每當碰到release和autorelease的時候引用計數就會減一,如果此對象的計數變為了0, 就會被系統銷毀.
2. NSAutoreleasePool 就是用來做引用計數的管理工作的,這個東西一般不用你管的.
3. autorelease和release沒什麼區別,只是引用計數減一的時機不同而已,autorelease會在對象的使用真正結束的時候才做引用計數減一.
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. 淺復制和深復制的區別?//淺拷貝和深拷貝
答案:
淺層復制(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的優缺點
答案:
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
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個圖標?都具有什麼功能。(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分)?
答:實現簡單的表格顯示需要設置UITableView的dataSource和delegate屬性,實現UITableViewDataSource和UITableViewDelegate協議。
37. Cocoa Touch提供了哪幾種Core Animation過渡類型(10分)?
答:Cocoa Touch提供了4種Core Animation過渡類型,分別為:交叉淡化、推擠、顯示和覆蓋。
38. UIView與CLayer有什麼區別(10分)?
答:1. UIView是iOS系統中界面元素的基礎,所有的界面元素都是繼承自它。它本身完全是由CoreAnimation來實現的。它真正的繪圖部分,是由一個CALayer類來管理。UIView本身更像是一個CALayer的管理器,訪問它的跟繪圖和跟坐標有關的屬性。
2. UIView有個重要屬性layer,可以返回它的主CALayer實例。
3. UIView的CALayer類似UIView的子View樹形結構,也可以向它的layer上添加子layer,來完成某些特殊的表示。即CALayer層是可以嵌套的。
4. UIView的layer樹形在系統內部,被維護著三份copy。分別是邏輯樹,這裡是代碼可以操縱的;動畫樹,是一個中間層,系統就在這一層上更改屬性,進行各種渲染操作;顯示樹,其內容就是當前正被顯示在屏幕上得內容。
5. 動畫的運作:對UIView的subLayer(非主Layer)屬性進行更改,系統將自動進行動畫生成,動畫持續時間的缺省值似乎是0.5秒。
6. 坐標系統:CALayer的坐標系統比UIView多了一個anchorPoint屬性,使用CGPoint結構表示,值域是0~1,是個比例值。這個點是各種圖形變換的坐標原點,同時會更改layer的position的位置,它的缺省值是{0.5,0.5},即在layer的中央。
7.渲染:當更新層,改變不能立即顯示在屏幕上。當所有的層都准備好時,可以調用setNeedsDisplay方法來重繪顯示。
8.變換:要在一個層中添加一個3D或仿射變換,可以分別設置層的transform或affineTransform屬性。
9.變形:Quartz Core的渲染能力,使二維圖像可以被自由操縱,就好像是三維的。圖像可以在一個三維坐標系中以任意角度被旋轉,縮放和傾斜。CATransform3D的一套方法提供了一些魔術般的變換效果。
39.鏈表翻轉。
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分)?
答: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)向對象添加非正式協議。繼承可以增加,修改方法,並且可以增加屬性。
51.通知和協議的不同之處?
答案:協議有控制鏈(has-a)的關系,通知沒有。首先我一開始也不太明白,什麼叫控制鏈(專業術語了~)。但是簡單分析下通知和代理的行為模式,我們大致可以有自己的理解簡單來說,通知的話,它可以一對多,一條消息可以發送給多個消息接受者。代理按我們的理解,到不是直接說不能一對多,比如我們知道的明星經濟代理人,很多時候一個經濟人負責好幾個明星的事務。只是對於不同明星間,代理的事物對象都是不一樣的,一一對應,不可能說明天要處理A明星要一個發布會,代理人發出處理發布會的消息後,別稱B的發布會了。但是通知就不一樣,他只關心發出通知,而不關心多少接收到感興趣要處理。因此控制鏈(has-a從英語單詞大致可以看出,單一擁有和可控制的對應關系。
52.關於多態性
答案:多態,子類指針可以賦值給父類。這個題目其實可以出到一切面向對象語言中,因此關於多態,繼承和封裝基本最好都有個自我意識的理解,也並非一定要把書上資料上寫的能背出來。最重要的是轉化成自我理解。
53.對於單例的理解
答案:基本能用熟悉的語言寫出一個單例,以及可以運用到的場景或是你編程中碰到過運用的此種模式的框架類等。進一步點,考慮下如何在多線程訪問單例時的安全性。
54. 是否在一個視圖控制器中嵌入兩個tableview控制器?
答案:一個視圖控制只提供了一個View視圖,理論上一個tableViewController也不能放吧,只能說可以嵌入一個tableview視圖。當然,題目本身也有歧義,如果不是我們定性思維認為的UIViewController,而是宏觀的表示視圖控制者,那我們倒是可以把其看成一個視圖控制者,它可以控制多個視圖控制器,比如TabbarController那樣的感覺。
55. 一個tableView是否可以關聯兩個不同的數據源?你會怎麼處理?
答案:首先我們從代碼來看,數據源如何關聯上的,其實是在數據源關聯的代理方法裡實現的。因此我們並不關心如何去關聯他,他怎麼關聯上,方法只是讓我返回根據自己的需要去設置如相關的數據源。因此,我覺得可以設置多個數據源啊,但是有個問題是,你這是想干嘛呢?想讓列表如何顯示,不同的數據源分區塊顯示?
56.Object-c的類可以多重繼承麼?可以實現多個接口麼?重寫一個類的方式用繼承好還是分類好?為什麼?
答案:Objective-c只支持單繼承,如果要實現多繼承的話,可以通過類別和協議的方式來實現,cocoa 中所有的類都是NSObject 的子類,多繼承在這裡是用protocol 委托代理來實現的。
57. id聲明的對象有什麼特性?
答案:id是個很重要的類型,是個可以指向任何類型的指針或者可以理解為指向任何未知類型的指針。
58.自動釋放池跟GC(垃圾回收)有什麼區別?iPhone上有GC麼?[poolrelease] 和[pooldrain]有什麼區別?
iPhone上沒有GC。iPhone開發的時候沒有垃圾回收機制。
在垃圾回收環境中,release是一個空操作。因此,NSAutoreleasePool提供了drain方法,在引用計數環境中,該方法的作用等同於調用release,但在垃圾回收環境中,它會觸發垃圾回收(如果自上次垃圾回收以來分配的內存大於當前的阈值)。因此,在通常情況下,您應該使用drain而不是release來銷毀自動釋放池。
59. 線程與進程的區別和聯系?
答案: 進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的並發性。
程和線程的主要差別在於它們是不同的操作系統資源管理方式。進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變量的並發操作,只能用線程,不能用進程。
60. 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支持對一、對多的關系。
61.obj-c有多重繼承麼?如果沒有什麼替代方法?
cocoa 中所有的類都是NSObject的子類,多繼承在這裡是用protocol 委托代理來實現的。你不用去考慮繁瑣的多繼承,虛基類的概念。
62.obj-c有私有方法麼?私有變量呢?
objective-c - 類裡面的方法只有兩種, 靜態方法和實例方法. 這似乎就不是完整的面向對象了,按照OO的原則就是一個對象只暴露有用的東西. 如果沒有了私有方法的話, 對於一些小范圍的代碼重用就不那麼順手了. 在類裡面聲名一個私有方法
@interface Controller : NSObject { NSString *something; }
+ (void)thisIsAStaticMethod;
- (void)thisIsAnInstanceMethod;
@end
@interface Controller (private) -
(void)thisIsAPrivateMethod;
@end
@private可以用來修飾私有變量
在Objective‐C中,所有實例變量默認都是私有的,所有實例方法默認都是公有的
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就會將該對象的一個引用放入到最新的自動釋放池。它仍然是個正當的對象,因此自動釋放池定義的作用域內的其它對象可以向它發送消息。當程序執行到作用域結束的位置時,自動釋放池就會被釋放,池中的所有對象也就被釋放。