你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS面試題整理帶答案

iOS面試題整理帶答案

編輯:IOS開發綜合
1、簡述OC中內存管理機制。與retain配對使用的方法是dealloc還是release,為什麼?需要與alloc配對使用的方法是dealloc還是release,為什麼?readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak屬性的作用?

管理機制:使用了一種叫做引用計數的機制來管理內存中的對象。

OC中每個對象都對應著他們自己的引用計數,引用計數可以理解為一個整數計數器,當使用alloc方法創建對象的時候,持有計數會自動設置為1。當你向一個對象發送retain消息 時,持有計數數值會增加1。相反,當你像一個對象發送release消息時,持有計數數值會減小1。當對象的持有計數變為0的時候,對象會釋放自己所占用的內存。

retain(引用計數加1)->release(引用計數減1)

alloc(申請內存空間)->dealloc(釋放內存空間)

readwrite: 表示既有getter,也有setter (默認)

readonly: 表示只有getter,沒有setter

nonatomic:不考慮線程安全

atomic:線程操作安全(默認)

線程安全情況下的setter和getter:

-(NSString*)value

{

@synchronized(self){

return[[_valueretain]autorelease];

}

}

-(void)setValue:(NSString*)aValue

{

@synchronized(self){

[aValueretain];

[_valuerelease];

_value=aValue;

}

}

retain: release舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數為1

assign: 簡單賦值,不更改索引計數(默認)

copy: 其實是建立了一個相同的對象,地址不同(retain:指針拷貝 copy:內容拷貝)

strong:(ARC下的)和(MRC)retain一樣(默認)

weak:(ARC下的)和(MRC)assign一樣, weak當指向的內存釋放掉後自動nil化,防止野指針

unsafe_unretained 聲明一個弱應用,但是不會自動nil化,也就是說,如果所指向的內存區域被釋放了,這個指針就是一個野指針了。?autoreleasing 用來修飾一個函數的參數,這個參數會在函數返回的時候被自動釋放。

2、類變量的@protected ,@private,@public,@package,聲明各有什麼含義?

@private:作用范圍只能在自身類

@protected:作用范圍在自身類和繼承自己的子類(默認)

@public:作用范圍最大,可以在任何地方被訪問。

@package:這個類型最常用於框架類的實例變量,同一包內能用,跨包就不能訪問

3、線程是什麼?進程是什麼?二者有什麼區別和聯系?

一個程序至少有一個進程,一個進程至少有一個線程:

進程:一個程序的一次運行,在執行過程中擁有獨立的內存單元,而多個線程共享一塊內存

線程:線程是指進程內的一個執行單元。

聯系:線程是進程的基本組成單位

區別:(1)調度:線程作為調度和分配的基本單位,進程作為擁有資源的基本單位?(2)並發性:不僅進程之間可以並發執行,同一個進程的多個線程之間也可並發執行?(3)擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統資源,但可以訪問隸屬於進程的資源.?(4)系統開銷:在創建或撤消進程時,由於系統都要為之分配和回收資源,導致系統的開銷明顯大於創建或撤消線程時的開銷。

舉例說明:操作系統有多個軟件在運行(QQ、office、音樂等),這些都是一個個進程,而每個進程裡又有好多線程(比如QQ,你可以同時聊天,發送文件等)

4、談談你對多線程開發的理解?ios中有幾種實現多線程的方法?

好處:

(1)使用線程可以把占據時間長的程序中的任務放到後台去處理

(2)用戶界面可以更加吸引人,這樣比如用戶點擊了一個按鈕去觸發某些事件的處理,可以彈出一個進度條來顯示處理的進度

(3)程序的運行速度可能加快

(4)在一些等待的任務實現上如用戶輸入、文件讀寫和網絡收發數據等,線程就比較有用了。

缺點:

(1)如果有大量的線程,會影響性能,因為操作系統需要在它們之間切換。

(2)更多的線程需要更多的內存空間。

(3)線程的中止需要考慮其對程序運行的影響。

(4)通常塊模型數據是在多個線程間共享的,需要防止線程死鎖情況的發生。

實現多線程的方法:

NSObject類方法

NSThread

NSOperation

GCD

5、線程同步和異步的區別?IOS中如何實現多線程的同步?

異步:舉個簡單的例子 就是游戲,游戲會有圖像和背景音樂

同步:是指一個線程要等待上一個線程執行完之後才開始執行當前的線程,上廁所

NSOperationQueue:maxcurrentcount

NSConditionLock

GCD->http://blog.csdn.net/onlyou930/article/details/8225906

6、假設有一個字符串aabcad,請寫一段程序,去掉字符串中不相鄰的重復字符串,即上述字符串處理之後的輸出結果為:aabcd

NSMutableString*str=[[NSMutableStringalloc]initWithFormat;@“aabcad”];

for(inti=0,i {

unsignedchara=[strcharacterAtIndex:i];

for(intj=i+1,j {

unsignedcharb=[strcharacterAtIndex:j];

if(a==b)

{

if(j==i+1)

{

}

else

{

[strdeleteCharactersInRange:NSMakeRange(j,1)];

}

}

}

}

NSLog(@“%@”,str);

7、獲取一台設備唯一標識的方法有哪些?

(1)UDID

UDID的全稱是Unique Device Identifier,顧名思義,它就是蘋果IOS設備的唯一識別碼,它由40個字符的字母和數字組成。

(2)UUID

UUID是Universally Unique Identifier的縮寫,中文意思是通用唯一識別碼.

(3)MAC Address

(4)OPEN UDID

(5)廣告標識符

(6)Vindor標示符

Vendor是CFBundleIdentifier(反轉DNS格式)的前兩部分。來自同一個運營商的應用運行在同一個設備上,此屬性的值是相同的;不同的運營商應用運行在同一個設備上值不同。

經測試,只要設備上有一個tencent的app,重新安裝後的identifierForVendor值不變,如果tencent的app全部刪除,重新安裝後的identifierForVendor值改變。

*ios7以後使用keychain

8、iOS類是否可以多繼承?如果沒有,那可以用其他方法實現嗎?簡述實現過程。

不可以多繼承,用protocol實現

9、堆和棧的區別?

堆需要用戶手動釋放內存,而棧則是編譯器自動釋放內存

問題擴展:要知道OC中NSString的內存存儲方式

10、iOS本地數據存儲都有哪幾種方式?

NSKeyedArchiver

NSUserDefaults

Write寫入方式(plist文件、txt文件等)

SQLite3

CoreData

(問題擴展:什麼情況下使用什麼樣的數據存儲)

(1)NSKeyedArchiver:采用歸檔的形式來保存數據,數據對象需要遵守NSCoding協議,對象對應的類必須提供encodeWithCoder:和initWithCoder:方法。缺點:只能一次性歸檔保存以及一次性解壓。所以只能針對小量數據,對數據操作比較笨拙,如果想改動數據的某一小部分,需要解壓或歸檔整個數據。

(2)NSUserDefaults:用來保存應用程序設置和屬性、用戶保存的數據。用戶再次打開程序或開機後這些數據仍然存在。NSUserDefaults可以存儲的數據類型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。缺點:如果要存儲其他類型,需要轉換為前面的類型,才能用NSUserDefaults存儲。

(3)Write寫入方式:永久保存在磁盤中。第一步:獲得文件即將保存的路徑:第二步:生成在該路徑下的文件:第三步:往文件中寫入數據:最後:從文件中讀出數據:

(4)SQLite:采用SQLite數據庫來存儲數據。SQLite作為一中小型數據庫,應用ios中,跟前三種保存方式相比,相對比較復雜一些。

(5)CoreData:系統自帶的數據庫存儲。

11、寫出方法獲取iOS內存使用情況。

(問題擴展:如何利用Xcode觀察內存使用情況)

//獲取當前設備可用內存及所占內存的頭文件

#import

#import

//獲取當前設備可用內存(單位:MB)

-(double)availableMemory

{

vm_statistics_data_tvmStats;

mach_msg_type_number_tinfoCount=HOST_VM_INFO_COUNT;

kern_return_tkernReturn=host_statistics(mach_host_self(),

HOST_VM_INFO,

(host_info_t)&vmStats,

&infoCount);

if(kernReturn!=KERN_SUCCESS)

{

returnNSNotFound;

}

return((vm_page_size*vmStats.free_count)/1024.0)/1024.0;

}

//獲取當前任務所占用的內存(單位:MB)

-(double)usedMemory

{

task_basic_info_data_ttaskInfo;

mach_msg_type_number_tinfoCount=TASK_BASIC_INFO_COUNT;

kern_return_tkernReturn=task_info(mach_task_self(),

TASK_BASIC_INFO,

(task_info_t)&taskInfo,

&infoCount);

if(kernReturn!=KERN_SUCCESS)

{

returnNSNotFound;

}

return(taskInfo.resident_size/1024.0/1024.0);

}

12、深拷貝和淺拷貝的理解?

對實例進行深拷貝時當前類需要實現NSCopying協議。

淺拷貝是復制出來一個跟原對象相同地址的對象

深拷貝時復制一個跟源對象不同地址的對象 改變源對象對新對象沒有影響

13.怎樣實現一個singleton的類。

問題擴展:單例的好處是什麼?——節省內存

+(AccountManager*)sharedManager

{

staticAccountManager*staticInstance=nil;

staticdispatch_once_tpredicate;

dispatch_once(&predicate,^{

staticInstance=[[selfalloc]init];

});

returnstaticInstance;

}

14、什麼是安全釋放?

置nil 再釋放

15、RunLoop是什麼?

Run loops 是線程相關的的基礎框架的一部分。

一個 run loop 就是一個事件處理 的循環,用來不停的調度工作以及處理輸入事件。

使用 run loop的目的是讓你的線程在有工作的時候忙於工作,而沒工作的時候處於休眠狀態。

Runloop還可以在loop在循環中的同時響應其他輸入源,比如界面控件的按鈕,手勢等。

16、什麼是序列化和反序列化,可以用來做什麼?如何在OC中實現復雜對象的存儲?

序列化是把對象轉化成字節序列的過程 反序列化是把字節序列恢復成對象

將對象寫到文件或者數據庫裡,並且能讀取出來

遵循NSCoding協議 實現復雜對象的存儲 實現該協議後可以對其進行打包或解包,轉化成NSData

17、寫一個標准宏MIN,這個宏輸入兩個參數並返回較小的一個?

#define MIN(X,Y) ((X)>(Y)?(Y):(X))

擴展:在定義宏的時候需要注意哪些問題?

宏全部大寫 寫在#import 下 @interface上 結尾無分號

18、iphone os有沒有垃圾回收機制?簡單闡述一下OC內存管理。

iphone os沒有垃圾回收機制 oc的內存管理是誰創建誰釋放 程序中遇到retain 該對象引用計數+1 遇release該對象引用計數-1 retainCount為0時 內存釋放

19、簡述應用程序按Home鍵進入後台時的生命周期,以及從後台回到前台時的生命周期?

//進入後台時

-(void)applicationWillResignActive:(UIApplication*)application;

-(void)applicationDidEnterBackground:(UIApplication*)application;

//進入前台時

-(void)applicationDidEnterForeground:(UIApplication*)application;

-(void)applicationWillResignActive:(UIApplication*)application;

//各個程序運行狀態時代理的回調:

//當進程啟動但還沒進入狀態保存

-(BOOL)application:(UIApplication*)applicationwillFinishLaunchingWithOptions:(NSDictionary*)launchOptions

當進程啟動基本完成程序准備開始運行

-(BOOL)application:(UIApplication*)applicationdidFinishLaunchingWithOptions:(NSDictionary*)launchOptions

//當應用程序將要入非活動狀態執行,在此期間,應用程序不接收消息或事件,比如來電話了

-(void)applicationWillResignActive:(UIApplication*)application

當應用程序入活動狀態執行,這個剛好跟上面那個方法相反

-(void)applicationDidBecomeActive:(UIApplication*)application

//當程序被推送到後台的時候調用。所以要設置後台繼續運行,則在這個函數裡面設置即可

-(void)applicationDidEnterBackground:(UIApplication*)application

//當程序從後台將要重新回到前台時候調用,這個剛好跟上面的那個方法相反

-(void)applicationWillEnterForeground:(UIApplication*)application

//當程序將要退出是被調用,通常是用來保存數據和一些退出前的清理工作。這個需要要設置UIApplicationExitsOnSuspend的鍵值。

-(void)applicationWillTerminate:(UIApplication*)application

//當程序載入後執行

-(void)applicationDidFinishLaunching:(UIApplication*)application

20、ViewController 的 alloc,loadView, viewDidLoad,viewWillAppear,viewDidUnload,dealloc、init分別是在什麼時候調用的?在自定義ViewController的時候這幾個函數裡面應該做什麼工作?

alloc//申請內存時調用

loadView//加載視圖時調用

ViewDidLoad//視圖已經加載後調用

ViewWillAppear//視圖將要出現時調用

ViewDidUnload//視圖已經加載但沒有加載出來調用

dealloc//銷毀該視圖時調用

init//視圖初始化時調用

21、描述應用程序的啟動順序。

(1)程序入口main函數創建UIApplication實例和UIApplication代理實例。

(2)在UIApplication代理實例中重寫啟動方法,設置第一ViewController。

(3)在第一ViewController中添加控件,實現應用程序界面。

22、為什麼很多內置類如UITableViewControl的delegate屬性都是assign而不是retain?請舉例說明。

防止循環引用

23、使用UITableView時候必須要實現的幾種方法?

- (NSInteger)tableView:(UITableView*)tableViewNumberOfRowsInSection:(NSInteger)section;?這個方法返回每個分段的行數,不同分段返回不同的行數可以用switch來做,如果是單個列表就直接返回單個你想要的函數即可。?-(UITableViewCell*)tableView:(UITableView*)tableViewCellForRowAtIndexPath:(NSIndexPath)indexPath;?這個方法是返回我們調用的每一個單元格。通過我們索引的路徑的section和row來確定

24、寫一個便利構造器。

//id代表任意類型指針,這裡代表Student*,類方法

+(id)studentWithName:(NSString*)newNameandAge:(int)newAge?

{?

Student*stu=[[Studentalloc]initName:newNameandAge:newAge];?

return[stuautorelease];

//自動釋放?

}

25、UIImage初始化一張圖片有幾種方法?簡述各自的優缺點。

3種

imageNamed:系統會先檢查系統緩存中是否有該名字的Image,如果有的話,則直接返回,如果沒有,則先加載圖像到緩存,然後再返回。

initWithContentsOfFile:系統不會檢查系統緩存,而直接從文件系統中加載並返回。

imageWithCGImage:scale:orientation當scale=1

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved