標籤:
最近離職了,找工作,光會做項目,對基礎不熟,今天就總結了一點面試題。
廢話不多說,上題吧:
1.objective-c中的數字對象都有哪些,簡述它們與基礎資料型別 (Elementary Data Type)的區別是什麼。
基本類型和C一樣,主要是有int、long、double、float、char、void、bool。對於基礎資料型別 (Elementary Data Type),不需要使用指標,
NSNumber是OC的數字對象,需要考慮記憶體釋放問題。
數字類型有:NSInteger、CGFloat。資料對象有NSNumber。對象和變數的差別。可以拆裝效果。
其他的類型有NSString和NSMutableString,NSString是不可變字串,變數和基本類型一樣不需要手動釋放。他的
retainCount是-1。retainCount:我們都知道,在IOS中,使用引用計數來實現記憶體的管理,當一個對象在任何地方都
沒有被引用到的時候,會被自動釋放。這個時候retanCount是0。而且提供了一個-(NSInteger)retainCount的方法來
實現擷取對象的持有數。NSNumber* number = [NSNumber numberWithInt:1];NSLog(@"%lu",[number retainCount]);
NSArray是一個不可變的數組,一般用於儲存固定的資料。NSMutableArray是一個可變數組。可以直接進行操作。
NSSet是一個不可變集合,NSMutableSet是一個可變集合。集合是一組單值的操作。
NSDictionary是一個索引值對的資料集合。NSMutableDictionary是一組可變的資料索引值對。都需要考慮記憶體釋放問題。
dictionary是按照key來排序的。
2.用NSLog函數輸出一個浮點類型,結果四捨五入,並保留一位小數。
CGFLoat number = 3.1415926;
NSLog("@0.1f",number);
3.截取字串”20|http://www.621life.com“ 中 ‘|’字元前面及後面的資料,分別輸出它們。
NSString* normalString = @"20|http://www.621life.com";
NSArray* array = [normalString componentSeparatedByString:@"|"];
NSLog(@"%@和%@",array[0],array[1]);
4.objective-c中的詞典對象、可變詞典對象是哪個,初始化一個含有兩個索引值對的可變詞典對象,並動態添加和
刪除一條記錄,輸出第一條記錄。
NSDictionary和NSMutableDictionary。
NSMutableDictionary* dictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"val1",@"key1",@"val2",@"key2"];
NSEnumerator* enumerator = [dictionary keyEnumerator];
id key = [enumerator nextObject];
while(key)
{
id object = [dictionary objectForKey:key];
NSLog(@"值:%@,key:%@",,key);
key = [enumerator nextObject];
}
//增加元素:
[dictionary setObject:@"val3" forKey:@"key3"];
//刪除元素:
[dictionary removeObjectForKey:@"key1"];
注意的地方:調用了nectObject之後要重新複製,不然指標指向最末尾處。
5.擷取項目根路徑,並在其下建立一個名稱為userData的目錄。
NSString* rootPath = NSHomeDirectory();
NSString* path = [rootPath stringByAppendingString:@"路徑"];
NSFileManager* filemanager = [NSFileMamager defaultManager];
if(![filemanger fileExistsAtPath:path])
{
//建立
[filemanager createDirectoryAtPath:path];
}
6.在一個對象的方法裡面:self.name = "object";和name ="object"有什麼不同嗎?
self.name="object",這個會讓引用計數增加,隱士調用了set方法,如果你自己重寫了set
方法,一定不要這麼用,這樣子文法會死迴圈。會使retainCount增加。name="object",直接賦值,
引用計數不變。
7.定義屬性時,什麼情況使用copy,assign,和retain。
assign是資料類型時候調用,retain和copy使用者物件,copy主要是當a指向一個對象,b也想同樣指向他的時候出現。
如果用assign,a如果釋放,在調用b,會軟體崩潰。如果copy的話,a和b有自己的記憶體,a釋放的時候,b不會崩潰。
如果用retain的話,會是計數增加,也可以調用。另外,atomic和nonatomic是用來決定編譯器產生的setting和getting
是否是原子操作。在多線程的情況下,原子操作是必須的。否則可能會引起錯誤資訊。
8.ViewController 的viewDidLoad,viewDidUnload,dealloc,viewWillAppear,viewWillDisappear。
(1)viewDidLoad只有view在nib檔案載入的時候才會調用。
(2)viewDidUnLoad是在系統記憶體吃緊的時候才會調用,在該方法中,會將所有的IBOutlet設定成nil,在該方法中釋放
其他的和view有關的對象,其他在運行時建立但是不是系統的對象,在viewDidLoad中建立的對象,快取資料等release
對象後,將對象設定成nil。
(3)dealloc:這個方法是
流程:loadView/nil來載入view到記憶體中,viewDidLoad函數進一步初始化這些view,記憶體不足的時候,調用viewDidUnLoad
來釋放記憶體資料,當使用的時候,又回到第一步。
(4)viewWillAppear這個方法是在視圖即將調用的時候出現。一般這個時候用代理比較多一點。
(5)viewWillDisappear這個是在即將消失的時候調用。
9.寫一個發送同步http請求,並獲得返回結果的方法。
同步方法:
NSMutableURLRequest* request = [[NSMutableRequest alloc] init];
[request setURL:[URL RULWithString:@"http://www.baidu.com"]];
[request setHTTPMethod:@"GET"];
NSData* data = [NSURLConnection sendSynchronousRequest:request returnResponse:nil error:nil];
10.怎樣啟動一個新線程,子線程怎樣重新整理主UI。
判斷一個線程是不是主線程。
if([NSThread isMainThread])
IOS中,只有主線程才能立即重新整理UI,一般我們放在主線程中,
dispatch_sync(dispatch_get_main_queue(),^{
//實現資訊
});
11.簡述objective-c記憶體管理的實現機制,並簡述什麼時候由你負責釋放對象,什麼時候不由你釋放。
OC裡面使用retainCount來管理對象,當發送retain的時候,引用計數會自動增加一個,當retainCount為0的時候
,系統自動條用release,會自動釋放,當一個對象使用如下操作的時候,他就有了使用許可權:alloc、allocWithZone、
copy、copyWithZone、mutableCopy、mutableCopyWithZone。如果沒有建立對象或者複製,而是保留引用,同樣擁有許可權
retain。在IOS4.0之後,會自動使用ARC來使用記憶體的管理機制,編譯器會自動的使用retain、release、autorelease來
實現項目的記憶體管理資訊。
12.類的定義及聲明檔案以什麼為尾碼名?
在IOS裡面,類的聲明是在.h檔案,實現是在.m檔案。
13.怎樣自動產生屬性的擷取方法和設定方法?
在IOS裡面,在現在的話,可以不自動寫set和get方法,在.h檔案裡面定義變數,在.m檔案中直接添加_變數就可以了。
還可以使用@synthesize使用。
14.聲明一個靜態方法和一個執行個體方法。
+符號表示,表示類的方法,-表示,表示執行個體方法。靜態方法長住記憶體,但是執行個體方法不是,所以靜態方法效率高但是站
記憶體,執行個體方法相反,載入速度和實際和記憶體幾乎無差。靜態方法在堆中分配記憶體,執行個體方法在堆棧中分配記憶體。
執行個體方法要先建立對象才能使用,但是靜態方法是類的方法,可以直接被類使用。用的比較平凡才使用靜態方法,
靜態方法修改的是類的狀態,但是執行個體方法修改的是各個對象的資訊。類的執行個體方法是在類消失的時候,對象沒有,
執行個體也沒有,但是靜態方法,只要你還引用這個空間,就一直會存在這個方法。
15.什麼是MVC,你工作時怎樣運用它。
MVC,視圖、模型、控制器。view視圖,資料json物件模型,controller控制器,view和模型一直不通訊。
view和controller之間最經典的形式是IBOutlet,也有用純程式碼實現的情況。
16.#define SQUAKE(a)((a)*(a))
int a=5;
int b;
b = SQUAKE(a++);
此時:b=__30___
答案 30
解析: #define SQUAKE(a)((5)*(6))
17.處理序間通訊的方式有
1.管道:用於具有某種親緣關係進行進程間的通訊,允許一個進程和另一個和他有共同祖先的進程通訊。
2.具名管道:具名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣
關係進程間的通訊。具名管道在檔案系統中有對應的檔案名稱。具名管道通過命令mkfifo或系統調用mkfifo來建立。
3.訊號Signal:訊號是比較複雜的通訊方式,用於通知接受進程有某種事件發生,除了用於處理序間通訊外,進程
還可以發送訊號給進程本身;linux除了支援Unix早期訊號語義函數sigal外,還支援語義符合Posix.1標準的訊號
函數sigaction(實際上,該函數是基於BSD的,BSD為了實現可靠訊號機制,又能夠統一對外介面,用sigaction
函數重新實現了signal函數)。
4.訊息Message隊列:訊息佇列是訊息的連結資料表,包括Posix訊息佇列system V訊息佇列。有足夠許可權的進程可以
向隊列中添加訊息,被賦予讀許可權的進程則可以讀走隊列中的訊息。訊息佇列克服了訊號承載資訊量少,管道只能
承載無格式位元組流以及緩衝區大小受限等缺。
5.共用記憶體:使得多個進程可以訪問同一塊記憶體空間,是最快的可用IPC形式。是針對其他通訊機制運行效率較低
而設計的。往往與其它通訊機制,如訊號量結合使用,來達到進程間的同步及互斥。
6.記憶體映射(mapped memory):記憶體映射允許任何多個處理序間通訊,每一個使用該機制的進程通過把一個共用的
檔案對應到自己的進程地址空間來實現它。
7.訊號量(semaphore):主要作為進程間以及同一進程不同線程之間的同步手段。
8.套介面(Socket):更為一般的處理序間通訊機制,可用於不同機器之間的處理序間通訊。起初是由Unix系統的BSD分
支開發出來的,但現在一般可以移植到其它類Unix系統上:Linux和System V的變種都支援通訊端。
18.將一個頭指標為head且帶頭結點的單鏈表反向排列,求演算法。
#include
using namespace std;
typedef struct _NODE{
int x;
struct _NODE *pNext;
}NODE;
#define LEN_NODE ( sizeof(NODE) )
NODE *pHead = (NODE *) malloc (LEN_NODE);
void fun( NODE *p )
{
NODE *pCur, //curten node of old list
*pNewCur; //curten node of new list
pCur = pHead->pNext;
pHead->pNext = NULL;
while( pCur )
{
if( pHead->pNext != NULL )
{//link other node
pNewCur = pHead->pNext;
pHead->pNext = pCur;
pCur = pCur->pNext;
pHead->pNext->pNext = pNewCur;
}
else
{//Link first node
pHead->pNext = pCur;
pCur = pCur->pNext;
pHead->pNext->pNext = NULL;
}
}
//test print
pCur = pHead->pNext;
while( pCur )
{
printf("%d\n", pCur->x );
pCur = pCur->pNext;
}
}
void main()
{
NODE *pCur = pHead;
int i = 10;
while( i-- )
{
pCur->pNext = (NODE *) malloc (LEN_NODE);
pCur = pCur->pNext;
pCur->x = i + 1;
}
pCur->pNext = NULL;
pCur = pHead->pNext;
while( pCur )
{
printf("%d\n", pCur->x );
pCur = pCur->pNext;
}
//TEST
fun(pHead);
}
19.C語言中講講static變數和static函數有什麼作用。
static有兩種意思:1表示變數是靜態儲存變數,表示變數存放在靜態儲存區。2表示該變數是內部串連,只在本檔案
內部有效,別的檔案不能應用該函數,不加static的函數預設是全域的。
static全域變數與普通的全域變數有什麼區別:static全域變數只初使化一次,防止在其他檔案單元中被引用;
static局部變數和普通局部變數有什麼區別:static局部變數只被初始化一次,下一次依據上一次結果值;
static函數與普通函數有什麼區別:static函數在記憶體中只有一份,普通函數在每個被調用中維持一份拷貝。
20.什麼時候用delegate,什麼時候用Notifiction?
delegate用於一對一,notifiction可以用於一對多、一對一、一對無。可以通知多個對象。
21.用預先處理#define聲明一個一個常量的時候。
#SECONDS_YEAR (60 * 60 * 365 * 24) UL
22.寫一個委託訊號。
@protocol MyDelegate
- (void)didJobs:(NSArray *)args;
@end
@protocol MyDelegate;
@interface MyClass: NSObject
{
id delegate;
}
這個是我寫的一個代理:
@protocol ProductDelegate<NSObject>
-(void)doSomeThing:(NSInteger)index;
@end
@interface ProductViewController:ViewController
@property(nonatomic,weak) id<ProductDelegate> prodelegate;
@end
//調用這個協議的類 實現介面
//實作類別
[self doSomeThing:1];
23.寫一個NSString類的實現。
24.OC有多重繼承嗎?如果沒有,有代替方法嗎?
OC裡面要實現多重繼承,一般用代理。
25.obj-c有私人方法麼?私人變數呢?
有,類的變數和執行個體變數。
26.關鍵字const有什麼含意?修飾類呢?static的作用,用於類呢?還有extern c的作用。
const表示唯讀意思。
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
分別表示的意思是:前兩個的意思一樣,表示a是一個常量整型,第三個表示這個是一個這項長整型數的指標。
第四個表示指向整數的常指標,第五個表示a表示指向一個常整型數的常指標。
27.為什麼標準標頭檔都有類似以下的結構?
#ifndef __INCvxWorksh
#define __INCvxWorksh
防止被重用唄。
28.#import跟#include的區別,@class呢?
@class表示聲明,只是知道有這麼個東西,至於裡面有什麼,不用完全知道。#import不會出現重複引用的現象。
#include表示引用,可能會出現重複引用。
29.線程與進程的區別和聯絡?
進程和線程都是由作業系統所提供的基本單元,系統利用該基本單元實現系統的並行作業。主要差別是在於不同的
作業系統資源管理方式,進程有獨立的地址空間,但是線程沒有,一個進程崩潰了,在保護模式下,線程會繼續正常運行。
線程只是一個進程中不同的執行路徑。線程有自己的堆棧和局部變數,但是線程沒有獨立的地址空間,所以一個
線程死亡的時候,進程也會死亡。多進程的程式比多線程的程式健壯的多。但是要求同時執行又要共用資源只能
用線程,不能用進程。
30.例舉幾個進程的同步機制,比較優缺點。
1.進程之間通訊的途徑:
2.進程死結的原因:環路、互斥、請求保持、不可剝奪
3.死結的處理:避免策略、檢測和解除死結
31.堆和棧的區別。
堆:對象,靜態變數名,類名,在項目載入的時候就載入。
棧:儲存變數名。
32.什麼是KV,key和value的操作。
在OC裡面,最經典的操作是字典,一個key對應一個value,根據key來尋找對象,鍵路徑是由一個用點來做分隔字元的鍵組成的
字串,用於串連在一起的對象序列,第一個鍵的性質是由先前的性質決定,通過鍵路徑,你可以指定對象圖中的任意一個
深度的路徑,指向相關對象的特定屬性。
33.C和OC如何混用。
尾碼名為.m檔案可以識別OC檔案,混用的方式是將.m檔案改成.mm檔案。但是cpp檔案不能混用OC檔案。
34.自動釋放池是什麼,如何工作。
當你在向一個對象發送autorelease的時候,cocoa就會將該對象的一個引用放到最新的自動釋放池中,他任然是一個
正當的對象,因此自動釋放池定義的範圍的其他對象可以向他發出訊息。
當程式執行到範圍結束的位置的時候,自動釋放池就會自動釋放,裡面所有的對象就會被釋放。
每碰到copy,retain計數就會加1,每次碰到release、autorelease計數就會減1。
35.objc的優缺點?
優點:
動態識別;
指標計算;
彈性資訊傳遞;
不是一個過度複雜的C衍生語言;
OC和C++ 可混編語言;
Posing;
Cateogies。
缺點:
不支援命名空間;
不支援運算子多載;
不支援多重繼承;
效能低,因為很多最佳化方法用不到。
36.sprintf、strcpy、memcpy使用的時候有什麼要注意的嗎?
sprintf:
strcpy:
memcpy:
37.用變數定義a。
1)整形a int a;
2)一個指向整形數的指標 int *a;
3)一個指向指標的指標,指標指向整形數 int** a;
4)一個有10個整形數的數組 int[] a;
38.readwrite,readonly,assign,retain,copy,nonatomic 屬性的作用。
property是一個屬性訪問聲明,括弧內支援如下屬性:
1.getting和setting,設定setting和getting的方法名。
readwrite:可讀寫
readonly:唯讀
assign:資料,
retain:
copy:複製
nonatomic:
39.http和socket通訊的區別?
http :是用戶端用http協議進行請求,發送請求的時候需要封裝http要求標頭,並綁定請求的資料,
http請求是用戶端主動發出請求,服務端才給相應,一次請求完畢之後,會中斷連線,節省資源。
服務端不能主動給用戶端響應。除非採用http長串連,iphone主要是使用NSURLConnection技術。
socket:是用戶端和伺服器之間使用socket繼續套件字繼續串連,並沒有規定串連後斷開,所以
用戶端和伺服器之間保持串連通道,雙方都可以主動發送資料。一般在遊戲或者股票開發的時候
使用,主要是CFSocketRef。
40.TCP和UDP協議?
TCP:傳輸控制通訊協定,他可以提供可靠的、物件導向的網路資料傳遞服務。傳輸控制通訊協定主要包含下面
任務和功能:
1)確保IP資料包的成功傳遞。
2)對程式發送的大塊資料繼續封裝和重組。
3)確保正確排序和順序傳遞分段的資料。
4)通過計算校正和,進行傳輸資料的完整性檢查。
TCP:連線導向的、可靠的資料流傳輸,資料安全、慢。
UDP:非連線導向的、不可靠的資料流傳遞、快。
41.其他的模式?
單例模式、代理模式、原廠模式。
42.什麼是push?
push是用戶端程式留下後門連接埠,用戶端總是監聽正對對這個後門的請求,於是伺服器可以主動的向這個連接埠
推送訊息。
43.靜態連結庫?
為.a檔案,不同的工程裡面匯入檔案就可以使用裡面的類。
44.什麼是沙箱模型?哪些操作是屬於私人的api範疇?
沙箱模型:
在iphone沙箱模型裡面,有四格檔案夾:documents、tmp、app、Library。手動儲存的檔案儲存在documents裡面。
1.Documents:你應該將所有的應用資料檔案寫入到這個檔案夾裡面,這個檔案夾主要是儲存用於資料或者其他應該備份的東西。
2.app:這個是應用程式的程式包目錄,包含應用程式的本身。由於應用程式必須經過簽名,所有你在運行時候不能
對這個檔案夾進行操作。否則程式沒法正常運行。
3.Library:Cache和Preferences兩個檔案夾,Cache檔案夾:用於存放應用程式專用的支援檔案,儲存應用程式
再次啟動的時候需要的資訊。
Preferences:包含應用程式的喜好設定檔案,你不應該直接建立喜好設定檔案,而是應該使用NSUserDefault來取得
和設定應用程式的偏好。
擷取沙箱主目錄:
NSString* homePath = NSHomeDirectory();
4.擷取應用程式程式包中資源檔路徑的方法:
NSString* imagePath = [[NSBundle mainBundle] pathForResource:@"apple" ofType:@"png"];
UIImage* iamge = [[UIImage alloc] initWithContentsOfFile:imagePath];
45.檔案IO寫入:
1.將資料寫到Documents目錄:
- (BOOL)writeApplicationData:(NSData *)data toFile:(NSString *)fileName {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
if (!docDir) {
NSLog(@”Documents directory not found!”); return NO;
}
NSString *filePath = [docDir stringByAppendingPathComponent:fileName];
return [data writeToFile:filePath atomically:YES];
}
2.從Documents目錄讀取資料:
- (NSData *)applicationDataFromFile:(NSString *)fileName {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
NSString *filePath = [docDir stringByAppendingPathComponent:fileName];
NSData *data = [[[NSData alloc] initWithContentsOfFile:filePath] autorelease];
return data;
}
NSSearchPathForDirectoriesInDomains這個主要就是返回一個絕對路徑用來存放我們需要儲存的檔案。
- (NSString *)dataFilePath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return [documentsDirectory stringByAppendingPathComponent:@"shoppingCar.plist"];
}
NSFileManager* fm=[NSFileManager defaultManager];
if(![fm fileExistsAtPath:[self dataFilePath]]){
//下面是對該檔案進行制定路徑的儲存
[fm createDirectoryAtPath:[self dataFilePath] withIntermediateDirectories:YES attributes:nil error:nil];
//取得一個目錄下得所有檔案名稱
NSArray *files = [fm subpathsAtPath: [self dataFilePath] ];
//讀取某個檔案
NSData *data = [fm contentsAtPath:[self dataFilePath]];
//或者
NSData *data = [NSData dataWithContentOfPath:[self dataFilePath]];
}
46.用到哪些資料存放區方式?
core data、sqllite、對象序列化、檔案直接讀寫、NSUserDefault。
檔案直接讀寫>core data>對象序列化>sqllite>NSUserDefault。
47.線程的常見方法有哪些?你怎麼處理的多線程?多線程的問題你瞭解嗎?
線程建立的幾種方式,線程的加鎖、休眠、喚醒、解鎖、退出。
多線程要考慮同步的問題,解決的同步問題是對某一個資源進行加鎖,當一個線程
操作本資源的時候,其他線程不能工作。
系統內建線程池的作用:
凡是需要啟動多個線程的地方都可以使用NSOperationQueue,加入到NSOperationQueue中的對象都需要繼承NSoperation。
NSOperationQueue會在系統內部啟動一個獨立的線程去執行這個被加入到對象的main方法。
常用的地方是用NSOperationQueue下載圖片,檔案。如果是自己建立的一個線程池,無非是啟動多個線程的時候,吧這些線程
對象放入到一個大的數組中,如果需要啟動多個線程的時候,先從數組中找閒置線程來使用。自己管理線程池的
最大難題是不好處理當啟動多個線程的時候,使用者在多個介面的跳轉的時候,對線程方法的回調處理。
48.init和initWithObject的區別?
init建立的對象不帶自動釋放功能。
49.你使用過json解析嗎?他們底層是怎麼樣的?
底層原理是遍曆字串中間的字元,最終根據格式規定的特殊字元,比如:{},[],:。進行區分。{}號是一個字典的開始,
[]是一個資料的開始,:是索引值的分水嶺,最終是將json轉化成字典。字典中可能是字典、資料、字串而已。
50.你串連伺服器是用什麼方式?如果請求中,網路中斷怎麼辦?
NSURLConnection串連後,有一方系統委託方法來處理伺服器的資料,如果網路連接失敗,會調用相對應的方法。
51.xml解析的原理是什嗎?
NSXMLParser,其他解析方式是有自訂的二進位解析,就是按照位元組去解析,電話會談就是這樣紙,還可以用
字串之間用特殊符號用特殊符號串連的資料,將資料用特殊符號可以分割成所用的資料。
52.類別有什麼作用?
1. 可以使本來需要在.h中聲明的方法放到.m檔案中聲明,達到了可以使方法不對外公開。
2. 可以方便的擴充類,甚至系統類別都可以輕易擴充,維護了代碼原本的結構不受影響。
3. 類別可以寫到不同的.h或.m檔案中,可以分散代碼到跟類別的擴充功能想關聯的地方,方便查看。
53.分線程回調主線程的方法是什嗎?
[[self performSelectorOnMainThread:@selector(buttonGo2) withObject:nil] waitUntilDone:YES];
[self performSelector:@selector(buttonGo2) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES];
54.你在開發大型項目的時候,如何進行記憶體泄露檢測的?
XOCDE裡面有一個工具,run-->start with performance tool裡面有一個instruments下有一個leaks工具,啟動這個
工具的時候,運行項目,工具裡可以顯示記憶體泄露的情況,雙擊就可以找到源碼的位置,可以協助進行記憶體泄露問題。
55.view和view之間怎麼傳值?
代理。
56.讓一個物體從介面的一點運行到另一點,有哪些方法?
動畫。
57.你瞭解的加密方式?
MD5、ASE
58.地圖定位?
我沒搞過。
59.開啟URL。
[[UIApplcation shareApplication] openURL:[NSURL URLWithString:]];
60.http網路通訊。
ASIHTTPRequest是一個直接在CFNetwork上做的開源項目:直接提交(HTTP POST)檔案的API,非同步請求,自動管理上傳和下載的隊列
管理機,ASIFormDataRequest用於適合上傳檔案,圖片資料。
61.圖片瀏覽。
從相機中選取圖片,UIImagePickerController。
62.對象序列化。
NSCoding encodeWithCoder initWithCoder
NSKeyedUnarchiver NSKeyedArchiver
63.各種picker
UIDataPicker和UIPickerView。
64.電影播放、音頻播放。
65.線程?
線程的建立和使用規則。
NSThread
三種方式:
-(id)init;
-(id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;
線程鎖:
NSCondition方法:
[thread lock]加鎖 [thread singnal]線程啟動 [thread unlock]解鎖 [thread exit]線程解鎖
sleep(n);
66.各種排序演算法?
67.通訊底層原理。
答:OSI七層模型
7 應用程式層: ftp,smtp,http,telnet,tftp(通過各種協議,最終還是封裝成TCP資料包,發送到網路中!)
6 表現層:
5 會話層:
4 傳輸層: tcp udp
3 網路層: ip,ICMP,IGRP,EIGRP,OSPF,ARP
2 資料連結層: STP,VT
1 物理層:
68.為什麼很多內建類如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模式時,也要注意這點。
69. 以下每行代碼執行後,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
71.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]。
72.sprintf、strcpy、memcpy使用的時候有什麼要注意的嗎?
這些函數區別在於實現功能和操作對象上,strcpy函數操作的對象是字串,完成源字串到目標字串的功能。
snprintf函數操作對象是不限於字串,雖然目標對象是字串,但是來源物件可以是字串、也可以是任意的基本
類型的資料。這個函數是用來實現(字串或者是基礎資料型別 (Elementary Data Type))向字串的轉化功能。如果元對象是字串,並且
指定%s格式符,也可實現字串拷貝。
memcpy是記憶體拷貝,實現將一個記憶體塊的內容複寫到另一個記憶體塊中。
strcpy 無疑是最合適的選擇:效率高且調用方便。
snprintf 要額外指定格式符並且進行格式轉化,麻煩且效率不高。
memcpy 雖然高效,但是需要額外提供拷貝的記憶體長度這一參數,易錯且使用不便;並且如果長度指定過大的話
(最優長度是源字串長度 + 1),還會帶來效能的下降。其實 strcpy 函數一般是在內部調用 memcpy 函數或者
用彙編直接實現的,以達到高效的目的。因此,使用 memcpy 和 strcpy 拷貝字串在效能上應該沒有什麼大的差別。
對於非字串類型的資料複製來說,strcpy和sprintf一般就無能為力了,但是memcpy就可以。memcpy 的長處是用來
實現(通常是內部實現居多)對結構或者數組的拷貝,其目的是或者高效,或者使用方便,甚或兩者兼有。
void *memcpy(void *dest, const void *src, size_t n);
從源src所指的記憶體位址的起始位置開始拷貝n個位元組到目標dest所指的記憶體位址的起始位置中。
原型聲明:char *strcpy(char* dest, const char *src);
說明:src和dest所指記憶體地區不可以重疊且dest必須有足夠的空間來容納src的字串。
返回指向dest的指標。
int sprintf( char *buffer, const char *format, [ argument] … );
73.寫一個NSString類的實現。
+ (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding;
+ (id) stringWithCString: (const char*)nullTerminatedCString
encoding: (NSStringEncoding)encoding
{
NSString *obj;
obj = [self allocWithZone: NSDefaultMallocZone()];
obj = [obj initWithCString: nullTerminatedCString encoding: encoding];
return AUTORELEASE(obj);
}
對面試有需要的,僅工參考,我自己寫的,如果有不對的地方,歡迎指出。
IOS基礎面試題