簡單的總結一下iOS面試中會遇到的問題


1.線程是什么?進程是什么?二者有什么區別和聯系?  
一個程序至少有一個進程,一個進程至少有一個線程: 
進程:一個程序的一次運行,在執行過程中擁有獨立的內存單元,而多個線程共享一塊內存 
線程:線程是指進程內的一個執行單元。 
聯系:線程是進程的基本組成單位 
區別:(1)調度:線程作為調度和分配的基本單位,進程作為擁有資源的基本單位
 (2)並發性:不僅進程之間可以並發執行,同一個進程的多個線程之間也可並發執行
 (3)擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統資源,但可以訪問隸屬於進程的資源.
 (4)系統開銷:在創建或撤消進程時,由於系統都要為之分配和回收資源,導致系統的開銷明顯大於創建或撤消線程時的開銷。

2.簡述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 [[_value retain] autorelease]; 
}}  
(void) setValue:(NSString*)aValue { 
@synchronized(self) { 
[aValue retain]; 
[_value release]; 
_value = aValue; 
} } 
retain: release舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數為1 
assign: 簡單賦值,不更改索引計數 (默認) 
copy: 其實是建立了一個相同的對象,地址不同(retain:指針拷貝 copy:內容拷貝) 
strong:(ARC下的)和(MRC)retain一樣 (默認) 
weak:(ARC下的)和(MRC)assign一樣, weak當指向的內存釋放掉后自動nil化,防止野指針 
unsafe_unretained 聲明一個弱應用,但是不會自動nil化,也就是說,如果所指向的內存區域被釋放了,這個指針就是一個野指針了。
autoreleasing 用來修飾一個函數的參數,這個參數會在函數返回的時候被自動釋放。

3.類變量的@protected ,@private,@public,@package,聲明各有什么含義? 
@private:作用范圍只能在自身類 
@protected:作用范圍在自身類和繼承自己的子類 (默認) 
@public:作用范圍最大,可以在任何地方被訪問。 
@package:這個類型最常用於框架類的實例變量,同一包內能用,跨包就不能訪問

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.獲取一台設備唯一標識的方法有哪些? 
http://www.cnblogs.com/max5945/archive/2013/06/24/3152292.html

(1)UDID 
(2)UUID 
(3)MAC Address 
(4)OPEN UDID 
(5)廣告標識符 
(6)Vindor標示符 
*ios7以后使用keychain 

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

8.堆和棧的區別? 
堆需要用戶手動釋放內存,而棧則是編譯器自動釋放內存 
問題擴展:要知道OC中NSString的內存存儲方式

9.這段代碼有什么問題嗎:

@implementation Person 
- (void)setAge:(int)newAge { 
self.age = newAge; 

@end

正確寫法 

if(_age){ 
[_age release]; 

_age = [newAge retain];


死循環(擴展:知道如何正確寫setter和getter方法)

10.iOS本地數據存儲都有哪幾種方式? 
NSKeyedArchiver 
NSUserDefaults 
Write寫入方式 
SQLite3 
http://blog.csdn.net/tianyitianyi1/article/details/7713103

(問題擴展:什么情況下使用什么樣的數據存儲) 
1.NSKeyedArchiver:采用歸檔的形式來保存數據,數據對象需要遵守NSCoding協議,對象對應的類必須提供encodeWithCoder:和initWithCoder:方法。缺點:只能一次性歸檔保存以及一次性解壓。所以只能針對小量數據,對數據操作比較笨拙,如果想改動數據的某一小部分,需要解壓或歸檔整個數據。 
2.NSUserDefaults:用來保存應用程序設置和屬性、用戶保存的數據。用戶再次打開程序或開機后這些數據仍然存在。NSUserDefaults可以存儲的數據類型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。缺點:如果要存儲其他類型,需要轉換為前面的類型,才能用NSUserDefaults存儲。 
3.Write寫入方式:永久保存在磁盤中。第一步:獲得文件即將保存的路徑:第二步:生成在該路徑下的文件:第三步:往文件中寫入數據:最后:從文件中讀出數據: 
4. SQLite:采用SQLite數據庫來存儲數據。SQLite作為一中小型數據庫,應用ios中,跟前三種保存方式相比,相對比較復雜一些。

 

11.簡述你對UIView、UIWindow和CALayer的理解

http://blog.csdn.net/kuqideyupian/article/details/7731942 
http://o0o0o0o.iteye.com/blog/1728599

12.寫一個完整的代理,包括聲明,實現

注意手寫的准確性

13.分析json、xml的區別?json、xml解析方式的底層是如何處理的?

http://www.open-open.com/bbs/view/1324367918671 
http://hi.baidu.com/fevelen/item/a25253ab76f766756cd455b6

14.ViewController 的 didReceiveMemoryWarning 是在什么時候被調用的?默認的操作是什么?

http://blog.sina.com.cn/s/blog_68661bd80101nn6p.html

15.面向對象的三大特征,並作簡單的介紹

封裝、繼承、多態 
多態:父類指針指向子類對象。兩種表現形式:重寫(父子類之間)和重載(本類中) 
OC的多態體現是:重寫,沒有重載這種表現形式

舉例說明:

@interface Parent : NSObject //父類 
- (void)simpleCall; 
@end  
@interface Child_A : Parent //子類 Child_A 
@end  
@implementation Child_A 
- (void)simpleCall 

NSLog(@”我是Child_A的simpleCall方法”); 

@end 
@interface Child_B : Parent //子類Child_B 
@end 
- (void)simpleCall 

NSLog(@”我是Child_的simpleCall方法”); 

@end

然后,我們就可以看到多態所展示的特性了: 
Parent * pa=[[Child_A alloc] init];// 父類指針指向子類Child_A對象 
Parent * pb=[[Child_B alloc] init]; //父類指針指向子類Child_B對象 
[pa simpleCall];// 顯然是調用Child_A的方法 
[pb simpleCall];// 顯然是調用Child_B的方法

在OC中常看見的多態體現: 
- (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

static NSString *CellWithIdentifier = @”Cell”; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellWithIdentifier]; 
return cell; 
}

(UITableViewCell *)指向cell子類對象

 

16.如監測系統鍵盤的彈出

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector( ) name:UIKeyboardWillShowNotification object:nil]; 
擴展:ios 彈出鍵盤擋住UITextView的解決方式

17.舉出5個以上你所熟悉的ios sdk庫有哪些和第三方庫有哪些?

AFWorking/WebKit/SQLite/Core Data/Address Book

18.如何將產品進行多語言發布?

http://fengmm521.blog.163.com/blog/static/25091358201291645852889/

19.如何將敏感字變成**

search = @”某某某”; 
replace = @“*”; 
range = [mstr rangeOfString:search]; 
[mstr replaceCharactersInRange:range withString:replace]; 
NSLog(@”%@”,mstr);

20.objc中的減號與加號代表什么?

類方法 
21.單例目的是什么,並寫出一個?

避免重復創建 節省內存空間 
static Model * model; 
+(id)singleton{ 
if(!model){ 
@synchronized(self){ 
model = [[Model alloc]init]; 
}} 
return model; 
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM