1、簡述OC中內(nèi)存管理機制。與retain配對使用的方法是dealloc還是release,為什么?需要與alloc配對使用的方法是dealloc還是release,為什么?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak屬性的作用?
OC使用了一種叫做引用計數(shù)的機制來管理對象,如果對一個對象使用了alloc、[Mutable]copy,retain,那么你必須使用相應(yīng)的realease或者autorelease。也可以理解為自己生成的對象,自己持有。非自己生成的對象,自己也能持有。不在需要自己持有的對象時釋放。非自己持有的對象無法釋放。生成并持有對象,持有對象,釋放對象,廢棄對象。readwrite(默認(rèn)):可讀可寫,表示既有g(shù)etter方法,也有setter方法。readonly:表示只有g(shù)etter方法,沒有setter方法。nonatomic:不考慮線程安全。atomic(默認(rèn)):線程操作安全。strong(默認(rèn)):ARC下和MRC下retain一樣,weak(ARC下):和(MRC下)assign類似,區(qū)別是當(dāng)weak指向的內(nèi)存釋放掉后自動置為nil,防止野指針。unsafe_unretained聲明一個若引用,但不會自動置為nil,可能會出現(xiàn)野指針。線程安全下的setter和getter方法:-(NSString *)value{@synchronized(self){return [[_value retain] autorelease];}}-(void)setValue:(NSString *)aValue{@synchronized(self){[aValue retain];[_value release];_value = aValue;}}
2、類變量的@protected ,@private,@public,@package,聲明各有什么含義?上面的幾個聲明表明的時類成員的作用域,
@private作用范圍只能在自身類(外界既不可訪問,又不能繼承);@protected作用范圍在自身類和子類,如果什么都不加修飾,默認(rèn)是@protected(外界不可訪問,但是可以繼承);@public作用范圍最大,可以在任何地方被訪問(外界即可訪問,又可以繼承);@package作用范圍在某個框架內(nèi)
3、線程是什么?進(jìn)程是什么?二者有什么區(qū)別和聯(lián)系?線程是CPU獨立運行和獨立調(diào)度的基本單位(可以理解為一個進(jìn)程中執(zhí)行的代碼片段),進(jìn)程是資源分配的基本單位(進(jìn)程是一塊包含了某些資源的內(nèi)存區(qū)域)。進(jìn)程是線程的容器,真正完成代碼執(zhí)行的是線程,而進(jìn)程則作為線程的執(zhí)行環(huán)境。一個程序至少包含一個進(jìn)程,一個進(jìn)程至少包含一個線程,一個進(jìn)程中的多個線程共享當(dāng)前進(jìn)程所擁有的資源。
4、談?wù)勀銓Χ嗑€程開發(fā)的理解?ios中有幾種實現(xiàn)多線程的方法?
好處:1、使用線程可以把程序中占據(jù)時間長的任務(wù)放到后臺去處理,如圖片、視頻的下載2、發(fā)揮多核處理器的優(yōu)勢,并發(fā)執(zhí)行讓系統(tǒng)運行的更快、更流暢,用戶體驗更好缺點:1、大量的線程降低代碼的可讀性,2、更多的線程需要更多的內(nèi)存空間3、當(dāng)多個線程對同一個資源出現(xiàn)爭奪的時候要注意線程安全的問題。
iOS有三種多線程編程的技術(shù):1、NSThread(兩種創(chuàng)建方式)[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];NSThread *myThread = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];[myThread start];2、NSOperationQueueNSOperationQueue *oprationQueue = [[NSOperationQueue alloc] init];oprationQueue addOperationWithBlock:^{//這個block語句塊在子線程中執(zhí)行}http://alloc.sinaapp.com/wp/?p=2373、Grand Central Dispatch (GCD)dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{? ? // 耗時的操作? ? dispatch_async(dispatch_get_main_queue(), ^{? ? ? ? // 更新界面? ? });});PS:不顯示的創(chuàng)建線程的方法:用NSObject的類方法? performSelectorInBackground:withObject: 創(chuàng)建一個線程:[Obj performSelectorInBackground:@selector(doSomething)
5、線程同步和異步的區(qū)別?IOS中如何實現(xiàn)多線程的同步?
同步:一個線程要等待上一個線程執(zhí)行完之后才能執(zhí)行當(dāng)前的線程,生活中的例子(上廁所)。異步:同時去做兩件或者多件事。比如邊聽歌邊看報。原子操作(atomic)、加鎖(NSLock、NSRecursive、NSConditionLock)、@synchronized? GCD串行隊列,GCD當(dāng)中的屏障,NSOperationQueue設(shè)置最大并發(fā)數(shù)為1
6、假設(shè)有一個字符串a(chǎn)abcad,請寫一段程序,去掉字符串中不相鄰的重復(fù)字符串,即上述字符串處理之后的輸出結(jié)果為:aabcd.
本題的題意是以第一個出現(xiàn)的字母作為參照,只要之后出現(xiàn)相同的字母并且和第一個字母不相鄰,那么就刪除。為防止刪除某些字符之后,把之前不相鄰的重復(fù)字符串轉(zhuǎn)化為相鄰字符串,所以可以先用空格替換掉需要刪除的字符,最后對數(shù)組里面的空格進(jìn)行處理。
-(void)removeRepeat:(NSString *)aNum{
? ? NSMutableArray *mArr = [[NSMutableArray alloc]initWithCapacity:10];?
? for (int i = 0;i < aNum.length;i++)? ? {? ? ? ? [mArr addObject:[aNum substringWithRange:NSMakeRange(i,1)]];? ? }? ? NSLog(@"- %@", mArr);? ? [self compareNum:mArr];? ? NSLog(@"%@",mArr);}//比較是否相等-(NSMutableArray *)compareNum:(NSMutableArray *)mArr{? ? int count = mArr.count;//重新定義了,count不會減一? ? for (int j = 0; j < count - 1; j++)? ? {? ? ? ? for (int i = j; i < count - 1-1-1; i++)? ? ? ? {? ? ? ? ? ? NSLog(@" %@? %@",[mArr objectAtIndex:j],[mArr objectAtIndex:i + 2]);? ? ? ? ? ? NSString *a = [mArr objectAtIndex:j];? ? ? ? ? ? NSString *b = [mArr objectAtIndex:i+2];? ? ? ? ? ? if ([a isEqualToString:b])? ? ? ? ? ? {? ? ? ? ? ? ? ? [mArr replaceObjectAtIndex:i + 2 withObject:@" "];? ? ? ? ? ? }? ? ? ? }? ? }? ? return mArr;}
7、獲取一臺設(shè)備唯一標(biāo)識的方法有哪些?MAC地址,udid,keychain,open udid,廣告標(biāo)識IDFA-identifierForIdentifier
8、iOS類是否可以多繼承?如果沒有,那可以用其他方法實現(xiàn)嗎?簡述實現(xiàn)過程。不可以,可以通過消息轉(zhuǎn)發(fā)、delegate和protocol和類別來實現(xiàn)類似多繼承。
9、堆和棧的區(qū)別?棧區(qū)(stack)--由編譯器自動分配釋放,存放函數(shù)的參數(shù)值、局部變量的值。堆區(qū)(heap)--一般由程序員分配釋放。全局區(qū)(靜態(tài)區(qū))(static)--全局變量和靜態(tài)變量。程序結(jié)束后由系統(tǒng)釋放。? ? ? 文字常量區(qū)--常量字符串存放在這里。程序結(jié)束后由系統(tǒng)釋放。? ? ? 程序代碼區(qū)—存放函數(shù)體的二進(jìn)制文件。棧:只要棧的剩余空間大于所申請空間,系統(tǒng)將為程序提供內(nèi)存,否則將報異常提示棧溢 出。堆:首先應(yīng)該知道操作系統(tǒng)有一個記錄空閑內(nèi)存地址的鏈表,當(dāng)系統(tǒng)收到程序的申請時,會遍歷該鏈表,尋找第一個空間大于所申請空間的堆結(jié)點,然后將該結(jié)點從空閑結(jié)點鏈表中刪除,并將該結(jié)點的空間分配給程序,另外,對于大多數(shù)系統(tǒng),會在這塊內(nèi)存空間中的首地址處記錄本次分配的大小,這樣,代碼中的delete語句才能正確的釋放本內(nèi)存空間。另外,由于找到的堆結(jié)點的大小不一定正好等于申請的大小,系統(tǒng)會自動的將多余的那部分重新放入空閑鏈表中。
10、iOS本地數(shù)據(jù)存儲都有哪幾種方式?iOS如何實現(xiàn)復(fù)雜對象的存儲?
1、NSKeyedArchiver(歸檔)采用歸檔的形式來保存數(shù)據(jù),該數(shù)據(jù)對象需要遵守NSCoding協(xié)議,并且該對象對應(yīng)的類必須提供encodeWithCoder:和initWithCoder:方法。
2、NSUserDefaults:用來保存應(yīng)用程序設(shè)置和屬性、用戶保存的數(shù)據(jù)。用戶再次打開程序或開機后這些數(shù)據(jù)仍然存在。NSUserDefaults可以存儲的數(shù)據(jù)類型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。
3、Write寫入方式:永久保存在磁盤中。
4、SQLite(FMDB、CoreData)
11、深拷貝和淺拷貝的理解?深拷貝拷貝的是內(nèi)容,淺拷貝拷貝的是指針。深拷貝和淺拷貝最大的區(qū)別就是子類對象的地址是否改變,如果子類對象的地址改變那么就是深拷貝。
12、怎樣實現(xiàn)一個singleton的類。static LOSingleton * shareInstance;+( LOSingleton *)sharedInstance{? ? @synchronized(self){//這個東西其實就是 一個加鎖。如果self 其他線程訪問,則會阻塞。這樣做一般是用來對單例 進(jìn)行一個死鎖的保護(hù)? ? ?
? if (shareInstance == nil) {? ? ? ? ??
shareInstance = [[super allocWithZone:NULL] init];? ??
? }? ?
}return shareInstance;
}
//第二種方式
+ (LOSingleton *) sharedInstance{?
? static? LOSingleton *sharedInstance = nil ;??
static? dispatch_once_t onceToken;? // 鎖??
dispatch_once (& onceToken, ^ {? ? // 最多調(diào)用一次? ??
? sharedInstance = [[self? alloc] init];??
});
return? sharedInstance;}寫一個標(biāo)準(zhǔn)宏MIN,這個宏輸入兩個參數(shù)并返回較小的一個?#define kMIN(X,Y)? ((X)? > (Y)) ? (Y) :(X)iphone os有沒有垃圾回收機制?簡單闡述一下OC內(nèi)存管理。iphone os沒有垃圾回收機制。垃圾回收機制用于在空閑時間以不定時的方式動態(tài)的回收無任何引用的對象占據(jù)的內(nèi)存空間。簡述應(yīng)用程序按Home鍵進(jìn)入后臺時的生命周期,以及從后臺回到前臺時的生命周期?應(yīng)用程序的狀態(tài):Not running 未運行,程序沒啟動Inactive? ? 未激活,程序在前臺運行,不過沒接受到事件,沒有事件處理的狀態(tài)下通常處于這個狀態(tài)。Active? ? ? 激活? 程序在前臺并且接收到了事件Backgound? 后臺? 程序在后臺而且能執(zhí)行代碼,大多數(shù)程序進(jìn)入這個狀態(tài)后會在在這個狀態(tài)上停留一會。Suspended? 掛起? 程序在后臺不能執(zhí)行代碼。ViewController 的 alloc,loadView, viewDidLoad,viewWillAppear,viewDidUnload,dealloc、init分別是在什么時候調(diào)用的?在自定義ViewController的時候這幾個函數(shù)里面應(yīng)該做什么工作?? ? ? ? alloc初始化當(dāng)前的ViewControllerloadView:沒有正在使用nib視圖頁面,子類將會創(chuàng)建自己的自定義視圖層viewDidLoad:試圖被加載后調(diào)用viewWillAppear:試圖即將出現(xiàn)的時候調(diào)用viewDidUnload:當(dāng)系統(tǒng)內(nèi)存吃緊的時候會調(diào)用該方法,釋放掉當(dāng)前未在window中顯示的試圖和對應(yīng)的控制器使用UITableView時候必須要實現(xiàn)的幾種方法?2個。-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section; 這個方法返回每個分區(qū)的行數(shù)-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath)indexPath;這個方法返回我們調(diào)用的每一個單元格UIImage初始化一張圖片有幾種方法?簡述各自的優(yōu)缺點。1、從資源讀取UIImage *image = [UIImage imageNamed:@”1.png”];2、從網(wǎng)絡(luò)讀取NSURL*url=[NSURL URLWithString:@"http://www.sinaimg.cn/qc/photo_auto/chezhan/2012/50/00/15/80046_950.jpg"];3.從手機本地讀取//讀取本地圖片非resourceNSString *aPath3=[NSString stringWithFormat:@"%@/Documents/%@.jpg",NSHomeDirectory(),@"test"];UIImage *imgFromUrl3=[[UIImage alloc]initWithContentsOfFile:aPath3]; 4.從現(xiàn)有的context中獲得圖像//add ImageIO.framework and #importCGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)url, NULL);
CGImageRef img= CGImageSourceCreateImageAtIndex(source,0,NULL);
CGContextRef ctx=UIGraphicsGetCurrentContext();
CGContextSaveGState(ctx);
//transformCTM的2種方式
//CGContextConcatCTM(ctx, CGAffineTransformMakeScale(.2, -0.2));
//CGContextScaleCTM(ctx,1,-1);
//注意坐標(biāo)要反下,用ctx來作為圖片源
CGImageRef capture=CGBitmapContextCreateImage(ctx);
CGContextDrawImage(ctx, CGRectMake(160, 0, 160, 230), [image CGImage]);
CGContextDrawImage(ctx, CGRectMake(160, 230, 160, 230), img);
CGImageRef capture2=CGBitmapContextCreateImage(ctx);
5、用Quartz的CGImageSourceRef來讀取圖片
CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)url, NULL);
CGImageRef img= CGImageSourceCreateImageAtIndex(source,0,NULL);
截取字符串”20?|?http://www.baidu.com”中,”|”字符前面和后面的數(shù)據(jù),分別輸出它們。
NSString?*string?=?@”?20?|?http://www.baidu.com”;
[string?componentsSeparatedByString:@”|”];
用obj-c寫一個冒泡排序
NSMutableArray?*array?=?[NSMutableArray?arrayWithArray:@[@"3",@"1",@"10",@"5",@"2",@"7",@"12",@"4",@"8"]];
NSString??*tmp;
for?(int?i?=?0;?i?<?array.count;?i?++)?{
for?(int?j?=?0;?j?<?array.count??-?1?-?i;?j++)?{
if?([[array?objectAtIndex:j]?integerValue]?>?[[array?objectAtIndex:j?+?1]?integerValue])?{
tmp?=?[array?objectAtIndex:j];
[array?replaceObjectAtIndex:j?withObject:[array?objectAtIndex:j?+?1]];
[array?replaceObjectAtIndex:j?+?1?withObject:tmp];
}
}
}
分析json、xml的區(qū)別?json、xml解析方式的底層是如何處理的?
json底層原理遍歷字符串中的字符,最終根據(jù)各市規(guī)定的特助字符,比如{},[],:號等進(jìn)行區(qū)分,{}是字典,[]表示的時數(shù)組,:號是字典的鍵和值的分水嶺,最總是將json數(shù)據(jù)轉(zhuǎn)化為字典。Xml兩種解析方式,DOM和SAX,DOM需要讀入整個XML文檔(文檔驅(qū)動),SAX是事件驅(qū)動的,并不需要讀入整個文檔,文檔的讀入過程也就是SAX的解析過程。
面向?qū)ο蟮娜筇卣?,并作簡單的介紹
封裝、繼承、多態(tài)。封裝:是把客觀事物封裝成抽象的類,隱藏內(nèi)部的實現(xiàn),對外部提供接口。繼承:可以使用現(xiàn)有類的所有功能,并且在無需重新編寫原來的類的情況下對這些功能進(jìn)行擴展。多態(tài):不同的對象以自己的方式響應(yīng)相同的的消息的能力叫做多態(tài),或者說父類指針指向子類對象<如UITableView的,cellForRow方法,返回值類型是UITbaleViewCell,但是你返回的cell可以是你自定義的cell,在比如多個類里面都有同一個方法>
簡述NotificationCenter、KVC、KVO、Delegate?并說明它們之間的區(qū)別?
Notification:觀察者模式,controller向defaultNotificationCenter添加自己的 notification,其他類注冊這個notification就可以收到通知,這些類可以在收到通知時做自己的操作(多觀察者默認(rèn)隨機順序發(fā)通知給 觀察者們,而且每個觀察者都要等當(dāng)前的某個觀察者的操作做完才能輪到他來操作,可以用NotificationQueue的方式安排觀察者的反應(yīng)順序,也 可以在添加觀察者中設(shè)定反映時間,取消觀察需要在viewDidUnload 跟dealloc中都要注銷)。
KVC鍵值編碼,可以直接通過字符串的名字(key)來間接訪問屬性的機制,而不是通過調(diào)用getter和setter方法訪問。
KVO:觀測指定對象的屬性,當(dāng)指定對象的屬性更改之后會通知相應(yīng)的觀察者。
delegate:一對一,delegate遵循某個協(xié)議并實現(xiàn)協(xié)議聲明的方法。
屬性的聲明使用assign,防止出現(xiàn)循環(huán)引用的問題。
Objective-C有私有方法么?私有變量呢?如多沒有的話,有沒有什么代替的方法?
objective-c?–?類里面的方法只有兩種,?靜態(tài)方法和實例方法.
@private來修飾私有變量
OC中所有的實例變量默認(rèn)都是私有的,所有的實例方法默認(rèn)都是公有的。
#import、#include和@class有什么區(qū)別
#include c語言中引入一個頭文件,但是可能出現(xiàn)交叉編譯
#import在OC中引入自己創(chuàng)建的頭文件#import””或者系統(tǒng)框架#import<>。#import不會出現(xiàn)交叉編譯
@class對一個類進(jìn)行聲明,告訴編譯器有這個類,但是類的定義什么的都不知道
談?wù)勀銓VC的理解?為什么要用MVC?在Cocoa中MVC是怎么實現(xiàn)的?你還熟悉其他的OC設(shè)計模式或別的設(shè)計模式嗎?
MVC是Model-VIew-Controller,就是模型-視圖-控制器,?MVC把軟件系統(tǒng)分為三個部分:Model,View,Controller。在cocoa中,你的程序中的每一個object(對象)都將明顯地僅屬于這三部分中的一個,而完全不屬于另外兩個。MVC可以幫助確保幫助實現(xiàn)程序最大程度的可重用性。各MVC元素彼此獨立運作,通過分開這些元素,可以構(gòu)建可維護(hù),可獨立更新的程序組建。
單例模式,delegate設(shè)計模式,target-action設(shè)計模式
舉出5個以上你所熟悉的ios??sdk庫有哪些和第三方庫有哪些?
UIKit,MapKit,CoreLocation,CFNetWork,MessageUI,ImageIO,CoreData,
AFNetWorking,MKNetWorkKit,ASIHttpRequest,FMDB,ZXing,ZBar,SDWebImage
你做iphone開發(fā)時候,有哪些傳值方式,view和view之間是如何傳值的?
屬性、delegate、KVO、blocks
描述上拉加載、下拉刷新的實現(xiàn)機制?
根據(jù)下拉或者上拉的距離來判斷是否進(jìn)行網(wǎng)絡(luò)請求
什么是沙盒(sandbox)?沙盒包含哪些文件,描述每個文件的使用場景。如何獲取這些文件的路徑?如何獲取應(yīng)用程序包中文件的路徑?
iOS應(yīng)用程序只能在為該改程序創(chuàng)建的文件系統(tǒng)中讀取文件,不可以去其它地方訪問,此區(qū)域被成為沙盒,所以所有的非代碼文件都要保存在此,例如圖像,圖標(biāo),聲音,映像,屬性列表,文本文件等。
默認(rèn)情況下,每個沙盒含有3個文件夾:Documents, Library 和 tmp。
Documents:蘋果建議將程序中建立的或在程序中瀏覽到的文件數(shù)據(jù)保存在該目錄下,iTunes備份和恢復(fù)的時候會包括此目錄Library:存儲程序的默認(rèn)設(shè)置或其它狀態(tài)信息;
Library/Caches:存放緩存文件,iTunes不會備份此目錄,此目錄下文件不會在應(yīng)用退出刪除
tmp:提供一個即時創(chuàng)建臨時文件的地方。
iTunes在與iPhone同步時,備份所有的Documents和Library文件。iPhone在重啟時,會丟棄所有的tmp文件。
介紹一下XMPP?有什么優(yōu)缺點嗎?
XMPP:基于XML的點對點的即時通訊協(xié)議。
XMPP?協(xié)議是公開的,XMPP?協(xié)議具有良好的擴展性,安全性
缺點是只能傳輸文本
談?wù)剬π阅軆?yōu)化的看法,如何做?
從用戶體驗出發(fā):1、程序logging不要太長、2、相同數(shù)據(jù)不做重復(fù)獲取、3、昂貴資源要重用(cell、sqlite、date),4、良好的編程習(xí)慣和程序設(shè)計:選擇正確的集合對象和算法來進(jìn)行編程、選擇適合的數(shù)據(jù)存儲格式(plist、SQLite)、優(yōu)化SQLite查詢語句5、數(shù)據(jù)資源方面的優(yōu)化(緩存和異步加載)
解決方案:
? 能夠發(fā)現(xiàn)問題
? 利用log或工具分析問題原因
? 假設(shè)問題原因
改進(jìn)代碼和設(shè)計
以.mm為拓展名的文件里,可以包含的代碼有哪些?c和obj-c如何混用
obj-c的編譯器處理后綴為m的文件時,可以識別obj-c和c的代碼,?處理mm文件可以識別obj-c,c,c++代碼,但cpp文件必須只能用c/c++代碼,而且cpp文件include的頭文件中,也不能出現(xiàn)obj-?c的代碼,因為cpp只是cpp
2)?在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是問題
3)在cpp中混用obj-?c其實就是使用obj-c編寫的模塊是我們想要的。
如果模塊以類實現(xiàn),那么要按照cpp?class的標(biāo)準(zhǔn)寫類的定義,頭文件中不能出現(xiàn)obj-c的東西,包括#import?cocoa的。實現(xiàn)文件中,即類的實現(xiàn)代碼中可以使用obj-c的東西,可以import,只是后綴是mm。
如果模塊以函數(shù)實現(xiàn),那么頭文件要按?c的格式聲明函數(shù),實現(xiàn)文件中,c++函數(shù)內(nèi)部可以用obj-c,但后綴還是mm或m