面試題(一)

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 [[_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 用來修飾一個函數的參數,這個參數會在函數返回的時候被自動釋放。

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 = [[NSMutableString alloc]initWithFormat;@“aabcad”];
for (int i = 0 ,i < str.length - 1 ;i++){
unsigned char a = [str characterAtIndex:i];
for (int j = i + 1 ,j < str.length ,j++){
unsigned char b = [str characterAtIndex:j];
if (a == b ){
if (j == i + 1){
}else{
[str deleteCharactersInRange:NSMakeRange(j, 1)];
}
}
}
}
NSLog(@“%@”,str);

7.獲取一臺設備唯一標識的方法有哪些?
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

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

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

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.寫出方法獲取iOS內存使用情況。
http://blog.sina.com.cn/s/blog_698415f20100yjlo.html

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

import

import

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鍵進入後臺時的生命週期,以及從後臺回到前臺時的生命週期?
http://blog.csdn.net/totogo2010/article/details/8048652

自己可以寫個demo來測試一下
進入後臺時
-(void)applicationWillResignActive:(UIApplication *)application;
-(void)applicationDidEnterBackground:(UIApplication *)application;
進入前臺時
-(void)applicationDidEnterForeground:(UIApplication *)application;
-(void)applicationWillResignActive:(UIApplication *)application;

20.ViewController 的 alloc,loadView, viewDidLoad,viewWillAppear,viewDidUnload,dealloc、init分別是在什麼時候調用的?在自定義ViewController的時候這幾個函數裏面應該做什麼工作?
http://www.xuebuyuan.com/672935.html

自己寫代碼測試加深理解
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 *)newName andAge:(int)newAge
{
 Student *stu=[[Student alloc]initName:newName andAge:newAge];
 return [stu autorelease];//自動釋放
}

25.UIImage初始化一張圖片有幾種方法?簡述各自的優缺點。
http://blog.sina.com.cn/s/blog_a843a8850101flo3.html

3種
imageNamed:系統會先檢查系統緩存中是否有該名字的Image,如果有的話,則直接返回,如果沒有,則先加載圖像到緩存,然後再返回。
initWithContentsOfFile:系統不會檢查系統緩存,而直接從文件系統中加載並返回。
imageWithCGImage:scale:orientation當scale=1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章