iOS求職面試總結(jié)

出于事業(yè)的發(fā)展,3月中旬離職了,離職后,一直在找工作,這里做一下面試的總結(jié)。

一、問:任何開發(fā)語言寫一種排序,并寫出其時間復(fù)雜度

答:建議看看下面這篇文章,我當(dāng)時寫了個冒泡排序,時間復(fù)雜度為O(n^2)
http://blog.sina.com.cn/s/blog_77795cad01011txt.html

二、問:atomic和nonatomic的區(qū)別,默認(rèn)是哪個?

答:atomic:默認(rèn)是有該屬性的,這個屬性是為了保證程序在多線程情況下,編譯器會自動生成一些互斥加鎖代碼,避免該變量的讀寫不同步問題。
nonatomic:如果該對象無需考慮多線程的情況,請加入這個屬性,這樣會讓編譯器少生成一些互斥加鎖代碼,可以提高效率。
默認(rèn)是atomic的。

三、問:修改下列代碼中的錯誤之處

// .h中
@interface Teacher : NSObject
@property (nonatomic, strong) NSMutableArray *students;
@end

@interface Student : NSObject
@property (nonatomic, strong) Teacher *teacher;
@end
// viewDidLoad中
Teacher *teacher = [[Teacher alloc] init];
    teacher.students = [[NSMutableArray alloc] init];
    for (int i=0; i<10; i++) {
        Student *student = [[Student alloc] init];
        student.teacher = teacher;
        [teacher.students addObject:student];
    }

答:這里面主要考的是互相引用的問題,可以通過兩種方式進(jìn)行修改
第一種:

Teacher *teacher = [[Teacher alloc] init];
    teacher.students = [[NSMutableArray alloc] init];
    for (int i=0; i<10; i++) {
        Student *student = [[Student alloc] init];
        // 弱引用
        __weak Teacher *weakTeacher = teacher;
        student.teacher = weakTeacher;
        [teacher.students addObject:student];
    }

第二種:

// 修改Student對象的teacher屬性為weak引用
@property (nonatomic, weak) Teacher *teacher;

四、問:如下代碼的輸出

NSString *str1 = @"nick";
    NSString *str2 = @"nick";
    if (str1 == str2) {
        NSLog(@"相等");
    } else {
        NSLog(@"不相等");
    }

答:輸出"相等",==比較的是指針指向的地址是否相同,這里相同字符串的地址是相同的

五、問:Application的幾種狀態(tài)

答:1、應(yīng)用程序的狀態(tài)
狀態(tài)如下:
Not running 未運行 程序沒啟動
Inactive 未激活 程序在前臺運行,不過沒有接收到事件。在沒有事件處理情況下程序通常停留在這個狀態(tài)
Active 激活 程序在前臺運行而且接收到了事件。這也是前臺的一個正常的模式
Backgroud 后臺 程序在后臺而且能執(zhí)行代碼,大多數(shù)程序進(jìn)入這個狀態(tài)后會在在這個狀態(tài)上停留一會。時間到之后會進(jìn)入掛起狀態(tài)(Suspended)。有的程序經(jīng)過特殊的請求后可以長期處于Backgroud狀態(tài)
Suspended 掛起 程序在后臺不能執(zhí)行代碼。系統(tǒng)會自動把程序變成這個狀態(tài)而且不會發(fā)出通知。當(dāng)掛起時,程序還是停留在內(nèi)存中的,當(dāng)系統(tǒng)內(nèi)存低時,系統(tǒng)就把掛起的程序清除掉,為前臺程序提供更多的內(nèi)存。
下圖是程序狀態(tài)變化圖:



各個程序運行狀態(tài)時代理的回調(diào):

  • (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions 告訴代理進(jìn)程啟動但還沒進(jìn)入狀態(tài)保存
  • (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 告訴代理啟動基本完成程序準(zhǔn)備開始運行
  • (void)applicationWillResignActive:(UIApplication *)application 當(dāng)應(yīng)用程序?qū)⒁敕腔顒訝顟B(tài)執(zhí)行,在此期間,應(yīng)用程序不接收消息或事件,比如來電話了
  • (void)applicationDidBecomeActive:(UIApplication *)application 當(dāng)應(yīng)用程序入活動狀態(tài)執(zhí)行,這個剛好跟上面那個方法相反
  • (void)applicationDidEnterBackground:(UIApplication *)application 當(dāng)程序被推送到后臺的時候調(diào)用。所以要設(shè)置后臺繼續(xù)運行,則在這個函數(shù)里面設(shè)置即可
  • (void)applicationWillEnterForeground:(UIApplication *)application 當(dāng)程序從后臺將要重新回到前臺時候調(diào)用,這個剛好跟上面的那個方法相反。
  • (void)applicationWillTerminate:(UIApplication *)application 當(dāng)程序?qū)⒁顺鍪潜徽{(diào)用,通常是用來保存數(shù)據(jù)和一些退出前的清理工作。這個需要要設(shè)置UIApplicationExitsOnSuspend的鍵值。
  • (void)applicationDidFinishLaunching:(UIApplication*)application 當(dāng)程序載入后執(zhí)行

六、問:__block__weak的區(qū)別

答:API Reference對__block變量修飾符有如下幾處解釋:

//A powerful feature of blocks is that they can modify variables in the same lexical scope. You signal that a block can modify a variable using the __block storage type modifier.
//At function level are __block variables. These are mutable within the block (and the enclosing scope) and are preserved if any referencing block is copied to the heap.

大概意思?xì)w結(jié)出來就是兩點:
1.__block對象在block中是可以被修改、重新賦值的。
2.__block對象在block中不會被block強引用一次,從而不會出現(xiàn)循環(huán)引用問題。
API Reference對__weak變量修飾符有如下幾處解釋:

__weak specifies a reference that does not keep the referenced object alive. A weak reference is set to nil whenthere are no strong references to the object.

使用了__weak修飾符的對象,作用等同于定義為weak的property。自然不會導(dǎo)致循環(huán)引用問題,因為蘋果文檔已經(jīng)說的很清楚,當(dāng)原對象沒有任何強引用的時候,弱引用指針也會被設(shè)置為nil。
因此,__block__weak修飾符的區(qū)別其實是挺明顯的:

  1. __block不管是ARC還是MRC模式下都可以使用,可以修飾對象,還可以修飾基本數(shù)據(jù)類型。
  2. __weak只能在ARC模式下使用,也只能修飾對象(NSString),不能修飾基本數(shù)據(jù)類型(int)。
  3. __block對象可以在block中被重新賦值,__weak不可以。
    PS:__unsafe_unretained修飾符可以被視為iOS SDK 4.3以前版本的__weak的替代品,不過不會被自動置空為nil。所以盡可能不要使用這個修飾符。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 基礎(chǔ) 1. 為什么說Objective-C是一門動態(tài)的語言? 2. 講一下MVC和MVVM,MVP? 3. 為...
    波妞和醬豆子閱讀 3,528評論 0 46
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,618評論 30 472
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • 一、深復(fù)制和淺復(fù)制的區(qū)別? 1、淺復(fù)制:只是復(fù)制了指向?qū)ο蟮闹羔?,即兩個指針指向同一塊內(nèi)存單元!而不復(fù)制指向?qū)ο蟮?..
    iOS_Alex閱讀 1,530評論 1 27
  • 聽完這堂課,感觸特別深! 對蒙臺梭利教育理念又有了更進(jìn)一步的認(rèn)識和了解,很慶幸自己能夠從孩子一出生就一直全職陪伴在...
    劉懿凡閱讀 427評論 0 0

友情鏈接更多精彩內(nèi)容