OC語言的一些面試題

1.@class的作用
@class一般用于頭文件中通過前向聲明告唆,就可以聲明了,但是在.m文件中還是需要使用#import進來的。它的作用只是前向聲明漠烧。

2.#import和#include的區(qū)別腔剂?

import是Objective-C導入頭文件的語法媒区,可保證不會重復導入。

include是C/C++導入頭文件的語法掸犬,如果是Objective-C與C/C++混編碼袜漩,對于C/C++類型的文件,還是使用#include來引入湾碎,這種寫法需要添加防重復導入的語法宙攻。

3.什么是單例,如何設計單例介褥?
單例就是全局都只有一個對象存在座掘,而且是在整個App運行過程中都存在。每個App都會有單例柔滔,比如UIApplication溢陪。而我們在做用戶數(shù)據(jù)存儲時,通常都會用單例存儲睛廊,因為應用在所有操作中形真,經(jīng)常要求先登錄。

  • (instancetype)shared {
    static HYBUserManager *sg_userManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    if (sg_userManager == nil) {
    sg_userManager = [[HYBUserManager alloc] init];
    }
    });

    return sg_userManager;
    }

4.self.name=@object和name=@object有什么不同?超全?
self.name =”object”:會調(diào)用對象的setName()方法咆霜;name = “object”:會直接把"object"字符串賦值給當前對象的name屬性。

5.obj在編譯時和運行時分別時什么類型的對象?
NSString *obj = [[NSData alloc] init];
在編譯時嘶朱,我們所聲明的obj是NSString *類型蛾坯,因此是NSString類型對象。在運行時疏遏,由于指針obj所指向的是NSData類型對象的內(nèi)存偿衰,因此實際上是NSData類型的對象挂疆。在編譯時,這一行代碼會轉(zhuǎn)換成類似這樣:

NSString *obj = ((id (*)(id, SEL))objc_msgSend)([NSData class],@selector(alloc));

obj = ((id (*)(id, SEL))objc_msgSend)((id)obj, @selector(init));
由于在編譯時下翎,轉(zhuǎn)換成id缤言,因此可以用NSString *指向NSData對象,而id是具備運行時特性的视事,因此在鏈接時胆萧,通過id的isa指針可以找到其所屬的類,因此最終類型還是通過isa確定其所屬類型俐东。

6.Objective-C的內(nèi)存管理跌穗?
現(xiàn)在內(nèi)存管理幾乎都采用ARC,也就是Automatic Reference Counting虏辫,意思是自動引用計數(shù)蚌吸。由編譯器在編譯時自動為添加retain、release等代碼砌庄。
如果問的MRC羹唠,也就是Manual Reference Counting,意思是手動內(nèi)存管理娄昆。
法則:誰使引用對象的引用計數(shù)+1佩微,不再使用該對象時,誰就應該使該對象的引用計數(shù)-1

7.什么是MVC?
回答時會從項目的耦合度萌焰、團隊開發(fā)如何減少沖突哺眯、如何降低團隊與團隊之間的溝通成本、如何將M扒俯、V奶卓、C之間按照既定的標準建立溝通的橋梁。
Model用于處理數(shù)據(jù)撼玄,通常來說夺姑,Model中會包含多個字段,用于存儲數(shù)據(jù)互纯。但是瑟幕,Model還會有一部分邏輯磕蒲,比如說:
@interface TestModel: HYBBaseModel
@property (nonatomic, assign) NSUInteger type;

// 這個不是接口返回的字段留潦,但是由于type字段是一個數(shù)值,不是view需要顯示的數(shù)據(jù)
// 所以我們最好將邏輯統(tǒng)一放到這里來辣往,外部只管獲取最終顯示需要的值即可兔院。即使哪天接口
// 返回的字段變化或者增加什么新的值,只需要處理這個模型內(nèi)部就好了站削。
@property (nonatomic, copy, readonly) NSString relationship;
@end
對于View坊萝,不應該包含邏輯,應該根據(jù)模型直接獲取數(shù)據(jù)。
對于Controller十偶,大部分交互邏輯都集中到了這里菩鲜,所有View需要的數(shù)據(jù),都是通過Controller提取Model然后交給view去顯示數(shù)據(jù)惦积。

8.Push Notification 是如何工作的接校?
推送通知分為兩種,一個是本地推送,一個是遠程推送
本地推送:不需要聯(lián)網(wǎng)也可以推送,是開發(fā)人員在APP內(nèi)設定特定的時間來提醒用戶干什么
遠程推送:需要聯(lián)網(wǎng),用戶的設備會于蘋果APNS服務器形成一個長連接,用戶設備會發(fā)送uuid和Bundle idenidentifier給蘋果服務器,蘋果服務器會加密生成一個deviceToken給用戶設備,然后設備會將deviceToken發(fā)送給APP的服務器,服務器會將deviceToken存進他們的數(shù)據(jù)庫,這時候如果有人發(fā)送消息給我,服務器端就會去查詢我的deviceToken,然后將deviceToken和要發(fā)送的信息發(fā)送給蘋果服務器,蘋果服務器通過deviceToken找到我的設備并將消息推送到我的設備上,這里還有個情況是如果APP在線,那么APP服務器會于APP產(chǎn)生一個長連接,這時候APPF服務器會直接通過deviceToken將消息推送到設備上。

9.重寫getter/setter方法?

@property (nonatomic, copy) NSString *blogName;
這里一旦連getter方法也重寫狮崩,編譯器不會給我們自動生成成員變量_blogName蛛勉,因此我們需要在類的聲明中添加一個成員變量_blogName:
@interface Demo () {
NSString *_blogName;
}

@end

在自動內(nèi)存管理下(ARC):

  • (void)setBlogName:(NSString *)aName {
    if (_blogName != aName) {
    _blogName = nil;
    _blogName = [aName copy];
    }
    }

  • (NSString *)blogName {
    return _blogName;
    }

對于手動內(nèi)存管理(MRC):

  • (void)setBlogName:(NSString *)aName {
    if (_blogName != aName) {
    [_blogName release];
    _blogName = nil;
    _blogName = [aName copy];
    }
    }

  • (NSString *)blogName {
    return _blogName;
    }

10.objective-c中的可變與不可變詞典?
可變字典就是可以增睦柴、刪诽凌、改操作的字典,對應于NSMutableDictionary類型坦敌。
不可變字典就是不能執(zhí)行增侣诵、刪、改操作的字典恬试,對應于NSDictionary類型窝趣。

11.Category是什么,何時使用训柴?
Category就是所謂的擴展哑舒。

有時我們需要在一個已經(jīng)定義好的類中增加一些方法,而不想去重寫該類幻馁,這時候使用擴展就很好洗鸵。比如,當工程已經(jīng)很大仗嗦,代碼量比較多,或者類中已經(jīng)有很多方法火邓,已經(jīng)有其他代碼調(diào)用了該類創(chuàng)建對象并使用該類的方法時德撬,可以使用類別對該類擴充新的方法铲咨。

12.什么是Delegate?常用場景蜓洪?
Delegate就是所謂的代理,代理是一種設計模式隆檀。在iOS開發(fā)中粹湃,會使用到大量的代理,而代理設計模式是蘋果中的標準設置模式泉坐。

常用場景有反向傳值为鳄。比如:蘋果的藍牙,我們進入到下一個界面去打開或者關閉藍牙济赎,當操作之后需要將狀態(tài)反饋到前一個界面记某,并更新顯示。對于這種狀態(tài)液南,使用代理設計模式是很標準的模式

13.自動生成getter/setter方法?

  • (void)setName:(NSString *)aName;
  • (NSString *)name;

在后面有了property统扳,直接使用@property (nonatomic, copy) NSString *name這樣的方法來聲明畅姊,編譯器會自動生成getter/setter方法并生成一個_name成員變量。

14.id聲明的對象有什么特性若未?
struct objc_object {
Class isa OBJC_ISA_AVAILABILITY;
};

typedef struct objc_object *id;

可其定義可知id類型是一個指向objc_object結(jié)構(gòu)體類型的指針粗合,這個結(jié)構(gòu)體只有一個指向?qū)ο鬅o類的指針isa,因此id可以指向任何類型的對象隙疚,故其具備運行時特性。

15.nil與NULL的區(qū)別行冰?
nil和C語言的NULL相同伶丐,在objc/objc.h中定義。nil表示Objective-C對象的值為空贿堰。在C語言中辙芍,指針的空值用NULL表示羹与。在Objective-C中庶灿,nil對象調(diào)用任何方法表示什么也不執(zhí)行,也不會崩潰腾誉。

16.用NSLog函數(shù)輸出一個浮點類型峻呕,結(jié)果四舍五入,并保留一位小數(shù)
float money = 1.011;
NSLog(@"%.1f", money);

17.Objective-C中有私有方法猪贪、私有變量么讯私?
在類的.m實現(xiàn)文件內(nèi)聲明,就可以作為私有方法桶癣、私有變量娘锁。但是,并不是絕對的私有碎税,如果外部知道有這么個方法馏锡,一樣可以調(diào)用,而且不會報錯杯道。就像蘋果公司沒有公開出來的API党巾,只要我們通過其它方式了解到api就可以調(diào)用。于是蘋果審核時經(jīng)常由于使用了私有api而打回來了齿拂。

18.property屬性的修飾符有什么樣的作用?
getter=getName吗购、setter=setName:設置setter與getter的方法名
readwrite、readonly:設置可供訪問級別
assign:方法直接賦值镀梭,不進行任何retain操作踱启,為了解決原類型與環(huán)循引用問題
retain:其setter方法對參數(shù)進行release舊值再retain新值,所有實現(xiàn)都是這個順序
copy:其setter方法進行copy操作透罢,與retain處理流程一樣冠蒋,先對舊值release,再copy出新的對象统屈,retainCount為1牙躺。這是為了減少對上下文的依賴而引入的機制。
nonatomic:非原子性訪問孽拷,不加同步脓恕, 多線程并發(fā)訪問會提高性能。注意炼幔,如果不加此屬性,則默認是兩個訪問方法都為原子型事務訪問肛著。

19.簡述tableview的重用機制跺讯?
[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
這個方法就是重用機制的核心了。比如局荚,有一個界面可顯示10個cell,那么創(chuàng)建10次cell轮傍,并給cell指定同樣的重用標識(當然茫陆,可以為不同顯示類型的cell指定不同的標識)并且10個cell將全部都加入到visiableCells數(shù)組擎析,reusableTableCells為空.
滾動tableView,當有一個cell完全移出屏幕時桨醋,這個cell就會被加入到reusableTableCells现斋。而新出現(xiàn)的那個cell將加入到visiableCells,而這個cell就是被重用的瞬内。
如果要讓tableview不重用限书,不設置reuseIdentifier就可以了。

20.viewDidLoad能真、loadView和viewDidUnload何時調(diào)用扰柠?
viewDidLoad在view加載完成時調(diào)用,loadView在controller的view為nil時調(diào)用蝙泼。對于viewDidUnload現(xiàn)在已經(jīng)不能直接調(diào)用了劝枣。

21.什么是 Runloop?
是一個與線程相關的機制,可以理解為一個循環(huán),在這個循環(huán)里面等待事件然后處理事件.而這個循環(huán)是基于線程的,在Cocoa中每個線程都有它的runroop,通過他這樣的機制,線程可以在沒有事件要處理的時候休息,有事件運行,減輕CPU壓力茎活。

22.Toll-Free Bridging 是什么琢唾?什么情況下會使用?
Toll-Free Bridging用于在Foundation對象與Core Foundation對象之間交換數(shù)據(jù),俗稱橋接
在ARC環(huán)境下,Foundation對象轉(zhuǎn)成 Core Foundation對象
使用__bridge橋接以后ARC會自動2個對象
使用__bridge_retained橋接需要手動釋放Core Foundation對象
在ARC環(huán)境下, Core Foundation對象轉(zhuǎn)成 Foundation對象
使用__bridge橋接,如果Core Foundation對象被釋放,Foundation對象也同時不能使用了,需要手動管理Core Foundation對象
使用__bridge_transfer橋接,系統(tǒng)會自動管理2個對象.

23.當系統(tǒng)出現(xiàn)內(nèi)存警告時會發(fā)生什么懒熙?

  1. 會將不在當前窗口上的view暫時移除
  2. 釋放掉沙盒里temp里的緩存文件
  3. 如果用戶放任內(nèi)存警告,最終會導致軟件強制被系統(tǒng)關閉

24.什么是 Protocol,Delegate 一般是怎么用的徘钥?
協(xié)議是一個方法簽名的列表肢娘,在其中可以定義若干個方法,遵守該協(xié)議的類可以實現(xiàn)協(xié)議里的方法
delegate用法:成為一個類的代理,可以去實現(xiàn)協(xié)議里的方法

25.autorelease 對象在什么情況下會被釋放?
分兩種情況:手動干預釋放和系統(tǒng)自動釋放
手動干預釋放:指定autoreleasepool,當前作用域大括號結(jié)束就立即釋放
系統(tǒng)自動去釋放:不手動指定autoreleasepool,Autorelease對象會在當前的 runloop 迭代結(jié)束時釋放

kCFRunLoopEntry(1):第一次進入會自動創(chuàng)建一個autorelease
kCFRunLoopBeforeWaiting(32):進入休眠狀態(tài)前會自動銷毀一個autorelease,然后重新創(chuàng)建一個新的autorelease
kCFRunLoopExit(128):退出runloop時會自動銷毀最后一個創(chuàng)建的autorelease

26.為什么 NotificationCenter 要 removeObserver? 如何實現(xiàn)自動 remove?
如果不移除的話,萬一注冊通知的類被銷毀以后又發(fā)了通知,程序會崩潰.因為向野指針發(fā)送了消息
實現(xiàn)自動remove:通過自釋放機制,通過動態(tài)屬性將remove轉(zhuǎn)移給第三者,解除耦合,達到自動實現(xiàn)remove

27.為什么 UIScrollView 的滾動會導致 NSTimer 失效而钞?
定時器里面有個runoop mode,一般定時器是運行在defaultmode上但是如果滑動了這個頁面,主線程runloop會轉(zhuǎn)到UITrackingRunLoopMode中,這時候就不能處理定時器了,造成定時器失效,原因就是runroop mode選錯了,解決辦法有2個,一個是更改mode為NSRunLoopCommonModes(無論runloop運行在哪個mode,都能運行),還有種辦法是切換到主線程來更新UI界面的刷新

28.為什么當 Core Animation 完成時臼节,layer 又會恢復到原先的狀態(tài)珊皿?
因為這些產(chǎn)生的動畫只是假象,并沒有對layer進行改變

29.有用過一些開源組件吧,能簡單說幾個么途凫,大概說說它們的使用場景實現(xiàn)溢吻。
AFN:網(wǎng)絡請求
FMDB:使用數(shù)據(jù)庫
MJExtension: JSON與Model互轉(zhuǎn)
SVProgressHUD:提示HUD
Masonry:自動布局
MJRefresh:下拉和上拉刷新

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市犀盟,隨后出現(xiàn)的幾起案子蝇狼,更是在濱河造成了極大的恐慌,老刑警劉巖贱枣,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纽哥,死亡現(xiàn)場離奇詭異栖秕,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門俏拱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锅必,“玉大人惕艳,你說我怎么就攤上這事《В” “怎么了终娃?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵蒸甜,是天一觀的道長。 經(jīng)常有香客問我窍荧,道長恨憎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任瓤荔,我火速辦了婚禮钥组,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘点把。我一直安慰自己屿附,他們只是感情好,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布衣厘。 她就那樣靜靜地躺著,像睡著了一般错邦。 火紅的嫁衣襯著肌膚如雪型宙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天魂拦,我揣著相機與錄音搁嗓,去河邊找鬼。 笑死荷愕,一個胖子當著我的面吹牛棍矛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荐类,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼茁帽,長吁一口氣:“原來是場噩夢啊……” “哼潘拨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起战秋,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤脂信,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后狰闪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體埋泵,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡罪治,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年觉义,在試婚紗的時候發(fā)現(xiàn)自己被綠了浴井。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡洪囤,死狀恐怖撕氧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情剥啤,我是刑警寧澤奄喂,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布海洼,位于F島的核電站坏逢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏是整。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一龙优、第九天 我趴在偏房一處隱蔽的房頂上張望事秀。 院中可真熱鬧,春花似錦宰衙、人聲如沸睹欲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涛贯。三九已至,卻和暖如春疫蔓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背岔乔。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工滚躯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留掸掏,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓募闲,卻偏偏與公主長得像愿待,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子仍侥,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,139評論 30 470
  • OC的理解與特性 OC作為一門面向?qū)ο蟮恼Z言患蹂,自然具有面向?qū)ο蟮恼Z言特性:封裝砸紊、繼承、多態(tài)批糟。它既具有靜態(tài)語言的特性...
    克魯?shù)吕?/span>閱讀 450評論 0 0
  • 面試題參考1 : 面試題[http://www.cocoachina.com/ios/20150803/12872...
    江河_ios閱讀 1,736評論 0 4
  • 一徽鼎、深復制和淺復制的區(qū)別弹惦? 1悄但、淺復制:只是復制了指向?qū)ο蟮闹羔槪磧蓚€指針指向同一塊內(nèi)存單元助泽!而不復制指向?qū)ο蟮?..
    iOS_Alex閱讀 1,374評論 1 27
  • OC的理解與特性OC作為一門面向?qū)ο蟮恼Z言嚎京,自然具有面向?qū)ο蟮恼Z言特性:封裝、繼承诫睬、多態(tài)帕涌。它既具有靜態(tài)語言的特性(...
    LIANMING_LI閱讀 513評論 0 0