標籤:
轉:http://blog.sina.com.cn/s/blog_b0c5954101014upb.html
1.截取字串”20|http://www.621life.com“ 中 ‘|’字元前面及後面的資料,分別輸出它們
NSRange range = [responseString rangeOfString:@"|"];int location = range.location;NSString *str1 = [responseString substringToIndex:location];NSString *str2 = [responseString substringFromIndex:location+1];
2.擷取項目根路徑,並在其下建立一個名稱為userData的目錄。
// 路徑 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths firstObject]; NSFileManager *fileManager = [[NSFileManager alloc]init]; NSString *userDataPath = [NSString stringWithFormat:@"%@/userData",documentsDirectory]; if (![fileManager fileExistsAtPath:userDataPath]) { [fileManager createDirectoryAtPath:userDataPath withIntermediateDirectories:false attributes:nil error:nil]; }
3.在一個對象的方法裡面:self.name = “object”;和name =”object”有什麼不同嗎?
self.name = “object”會調用對象的setName()方法,
name = “object”會直接把object賦值給當前對象的name 屬性。
並且 self.name 這樣retainCount會加1,而name就不會。
4.定義屬性時,什麼情況使用copy,assign,和retain
assign用於單一資料型別,如NSInteger,double,bool,retain 和copy使用者物件;
copy用於當 a指向一個對象,b也想指向同樣的對象的時候,如果用assign,a如果釋放,再調用b會crash,如果用copy 的方式,a和b各自有自己的記憶體,就可以解決這個問題。
retain 會使計數器加一,也可以解決assign的問題。
另外:tomic和nonatomic用來決定編譯器產生的getter和setter是否為原子操作。在多線程環境下,原子操作是必要的,否則有可能引起錯誤的結果。
5.關鍵字const有什麼含意?修飾類呢?static的作用,用於類呢?還有extern c的作用
前兩個的作用是一樣,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的指標時。
6. 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 類型。
7.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,非原子性訪問,不加同步,多線程並發訪問會提高效能。注意,如果不加此屬性,則預設是兩個存取方法
都為原子型事務訪問。鎖被加到所屬對象執行個體級(我是這麼理解的...)。
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].
iOS 筆試題