基礎(chǔ)的OC

基礎(chǔ)篇

Objective-C的類可以多重繼承么?可以采用多個(gè)協(xié)議么?

不可以多重繼承,可以采用多個(gè)協(xié)議.

objc使用什么機(jī)制管理對(duì)象內(nèi)存?

MRC 手動(dòng)引用計(jì)數(shù)

ARC 自動(dòng)引用計(jì)數(shù),現(xiàn)在通常使用自動(dòng)引用計(jì)數(shù)

import 跟#include 又什么區(qū)別,@class呢, #import<> 跟 #import””又什么區(qū)別?

import是Objective-C導(dǎo)入頭文件的關(guān)鍵字,#include是C/C++導(dǎo)入頭文件的關(guān)鍵字,使用#import頭文件會(huì)自動(dòng)只導(dǎo)入一次,不會(huì)重復(fù)導(dǎo)入,相當(dāng)于#include和#pragma once;@class告訴編譯器某個(gè)類的聲明,當(dāng)執(zhí)行時(shí),才去查看類的實(shí)現(xiàn)文件,可以解決頭文件的相互包含;#import<>用來包含系統(tǒng)的頭文件,#import””用來包含用戶頭文件。

描述一下iOS SDK中如何實(shí)現(xiàn)MVC的開發(fā)模式

MVC是模型、試圖、控制開發(fā)模式,對(duì)于iOS SDK,所有的View都是視圖層的,它應(yīng)該獨(dú)立于模型層,由視圖控制層來控制。所有的用戶數(shù)據(jù)都是模型層,它應(yīng)該獨(dú)立于視圖。所有的ViewController都是控制層,由它負(fù)責(zé)控制視圖,訪問模型數(shù)據(jù)。

淺復(fù)制和深復(fù)制的區(qū)別?

淺層復(fù)制:只復(fù)制指向?qū)ο蟮闹羔?,而不?fù)制引用對(duì)象本身。

深層復(fù)制:復(fù)制引用對(duì)象本身。

意思就是說我有個(gè)A對(duì)象,復(fù)制一份后得到A_copy對(duì)象后,對(duì)于淺復(fù)制來說,A和A_copy指向的是同一個(gè)內(nèi)存資源,復(fù)制的只不過是是一個(gè)指針,對(duì)象本身資源

還是只有一份,那如果我們對(duì)A_copy執(zhí)行了修改操作,那么發(fā)現(xiàn)A引用的對(duì)象同樣被修改,這其實(shí)違背了我們復(fù)制拷貝的一個(gè)思想。深復(fù)制就好理解了,內(nèi)存中存在了

兩份獨(dú)立對(duì)象本身。

category是什么? 擴(kuò)展一個(gè)類的方式用繼承好還是類目好? 為什么?

category是類目.用類目好,因?yàn)槔^承要滿足A is a B的關(guān)系,而類目只需要滿足A has a B的關(guān)系,局限性更小,你不用定義子類就能擴(kuò)展一個(gè)類的功能,還能將類的定義分開放在不同的源文件里,用category去重寫類的方法,僅對(duì)本category有效,不會(huì)影響到其他類與原有類的關(guān)系。

延展是什么? 作用是什么?

延展(extension):在自己類的實(shí)現(xiàn)文件中添加類目來聲明私有方法。

解釋一下懶漢模式?

懶漢模式,只在用到的時(shí)候才去初始化。

也可以理解成延時(shí)加載。

我覺得最好也最簡(jiǎn)單的一個(gè)列子就是tableView中圖片的加載顯示了。

一個(gè)延時(shí)載,避免內(nèi)存過高,一個(gè)異步加載,避免線程堵塞。

進(jìn)階篇

@property中有哪些屬性關(guān)鍵字?

屬性可以擁有的特質(zhì)分為四類:

原子性—- nonatomic 特質(zhì)

在默認(rèn)情況下,由編譯器合成的方法會(huì)通過鎖定機(jī)制確保其原子性(atomicity)。如果屬性具備 nonatomic 特質(zhì),則不使用同步鎖。請(qǐng)注意,盡管沒有名為“atomic”的特質(zhì)(如果某屬性不具備 nonatomic 特質(zhì),那它就是“原子的” ( atomic) ),但是仍然可以在屬性特質(zhì)中寫明這一點(diǎn),編譯器不會(huì)報(bào)錯(cuò)。若是自己定義存取方法,那么就應(yīng)該遵從與屬性特質(zhì)相符的原子性。

讀/寫權(quán)限—-readwrite(讀寫)、readonly (只讀)

內(nèi)存管理語義—-assign、strong、 weak、copy

方法名—-getter=?、setter=

你經(jīng)常使用一些第三方庫(kù)有哪些?

AFNetworking

SDWebImage

FMDB

JSONKit

MJRefresh

MJExtension

Masonry

友盟,shareSDK等三方庫(kù)。

你經(jīng)常用的設(shè)計(jì)模式有哪些?

MVC

代理模式

觀察者模式

單例模式

工廠模式

本地存儲(chǔ)有哪些方式?

屬性列表(NSUserDefault 或 plist)

對(duì)象歸檔 (NSKeyedArchiver)

SQLite

CoreData

weak屬性需要在dealloc中置nil么?

不需要,在ARC環(huán)境無論是強(qiáng)指針還是弱指針都無需在deallco設(shè)置為nil,ARC會(huì)自動(dòng)幫我們處理。

@synthesize和@dynamic分別有什么作用?

@property有兩個(gè)對(duì)應(yīng)的詞,一個(gè)是@synthesize,一個(gè)是@dynamic。如果@synthesize和@dynamic都沒寫,那么默認(rèn)的就是@syntheszie var = _var;

@synthesize的語義是如果你沒有手動(dòng)實(shí)現(xiàn)setter方法和getter方法,那么編譯器會(huì)自動(dòng)為你加上這兩個(gè)方法。

@dynamic告訴編譯器,屬性的setter與getter方法由用戶自己實(shí)現(xiàn),不自動(dòng)生成。

用@property聲明的NSString(或NSArray,NSDictionary)經(jīng)常使用copy關(guān)鍵字,為什么?如果改用strong關(guān)鍵字,可能造成什么問題?

因?yàn)楦割愔羔樋梢灾赶蜃宇悓?duì)象,使用copy的目的是為了讓本對(duì)象的屬性不受外界影響,使用copy無論給我傳入是一個(gè)可變對(duì)象還是不可對(duì)象,我本身持有的就是一個(gè)不可變的副本.

如果我們使用是strong,那么這個(gè)屬性就有可能指向一個(gè)可變對(duì)象,如果這個(gè)可變對(duì)象在外部被修改了,那么會(huì)影響該屬性.

什么時(shí)候會(huì)報(bào)unrecognized selector的異常?

當(dāng)該對(duì)象上某個(gè)方法,而該對(duì)象上沒有實(shí)現(xiàn)這個(gè)方法的時(shí)候

使用block時(shí)什么情況會(huì)發(fā)生引用循環(huán),如何解決?

只要是一個(gè)對(duì)象對(duì)該block進(jìn)行了強(qiáng)引用,在block內(nèi)部有直接使用到該對(duì)象。

解決方案:__weak id weakSelf = self;

使用系統(tǒng)的某些block api(如UIView的block版本寫動(dòng)畫時(shí)),是否也考慮引用循環(huán)問題?

一般不用考慮,因?yàn)楣俜轿臋n中沒有告訴我們要注意發(fā)生強(qiáng)引用,所以推測(cè)系統(tǒng)控件一般沒有對(duì)這些block進(jìn)行強(qiáng)引用,所以我們可以不用考慮循環(huán)強(qiáng)引用的問題

GCD的隊(duì)列(dispatch_queue_t)分哪兩種類型?

串行隊(duì)列和并行隊(duì)列

如何用GCD同步若干個(gè)異步調(diào)用?(如根據(jù)若干個(gè)url異步加載多張圖片,然后在都下載完成后合成一張整圖)

總體上說: 使用 dispatch group,然后 wait forever 等待完成, 或者采取 group notify 來通知回調(diào)。

1

2

3

4

5

6

7

8

dispatch_queue_tqueue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

dispatch_group_tgroup= dispatch_group_create();

dispatch_group_async(group,queue, ^{/*加載圖片1 */ });

dispatch_group_async(group,queue, ^{/*加載圖片2 */ });

dispatch_group_async(group,queue, ^{/*加載圖片3 */ });

dispatch_group_notify(group, dispatch_get_main_queue(), ^{

// 合并圖片

})

以下代碼運(yùn)行結(jié)果如何?

只能輸出1,然后線程主線程死鎖

1

2

3

4

5

6

7

8

9

- (void)viewDidLoad

{

[super viewDidLoad];

NSLog(@"1");

dispatch_sync(dispatch_get_main_queue(), ^{

NSLog(@"2");

});

NSLog(@"3");

}

若一個(gè)類有實(shí)例變量NSString *_foo,調(diào)用setValue:forKey:時(shí),可以以foo還是_foo作為key?

都可以

IBOutlet連出來的視圖屬性為什么可以被設(shè)置成weak?

因?yàn)橐晥D已經(jīng)對(duì)它有一個(gè)強(qiáng)引用了

你單例怎么理解怎么用的?

Singleton Pattern單例設(shè)計(jì)模式,通過單例模式可以保證系統(tǒng)中一個(gè)類只有一個(gè)實(shí)例而且該實(shí)例易于外界訪問,從而方便對(duì)實(shí)例個(gè)數(shù)的控制并節(jié)約系統(tǒng)資源。如果希望在系統(tǒng)中某個(gè)類的對(duì)象只能存在一個(gè),單例模式是最好的解決方案。類只能有一個(gè)實(shí)例,而且必須從一個(gè)為人熟知的訪問點(diǎn)對(duì)其進(jìn)行訪問,比如工廠方法。這個(gè)唯一的實(shí)例只能通過子類化進(jìn)行擴(kuò)展,而且擴(kuò)展的對(duì)象不會(huì)破壞客戶端代碼。例如,UIApplication的sharedApplication方法,任何時(shí)候都會(huì)返回一個(gè)當(dāng)前應(yīng)用程序的UIApplication實(shí)例。

lldb(gdb)常用的調(diào)試命令?

最常用就是 : po 對(duì)象

什么是謂詞?

謂詞是通過NSPredicate,是通過給定的邏輯條件作為約束條件,完成對(duì)數(shù)據(jù)的篩選。

+(void)load; +(void)initialize; 的區(qū)別?

+(void)load; 在程序運(yùn)行后立即執(zhí)行。

+(void)initialize; 在類的方法第一次被調(diào)時(shí)執(zhí)行.

什么是KVC,什么是KVO?

kvc:鍵 - 值編碼是一種間接訪問對(duì)象的屬性使用字符串來標(biāo)識(shí)屬性,而不是通過調(diào)用存取方法,直接或通過實(shí)例變量訪問的機(jī)制。

kvo:鍵值觀察機(jī)制,他提供了觀察某一屬性變化的方法,極大的簡(jiǎn)化了代碼。

什么時(shí)候用delegate,什么時(shí)候用Notification?

delegate針對(duì)one-to-one關(guān)系,并且reciever可以返回值 給sender,notification 可以針對(duì)one-to-one/many/none,reciever無法返回值給sender.所以,delegate用于sender希望接受到 reciever的某個(gè)功能反饋值,notification用于通知多個(gè)object某個(gè)事件

block和weak區(qū)別?

__block不管是ARC還是MRC模式下都可以使用,可以修飾對(duì)象,還可以修飾基本數(shù)據(jù)類型。

__weak只能在ARC模式下使用,也只能修飾對(duì)象(NSString),不能修飾基本數(shù)據(jù)類型(int)。

block對(duì)象可以在block中被重新賦值,weak不可以。

frame和bounds有什么不同?

frame指的是:該view在父view坐標(biāo)系統(tǒng)中的位置和大小。(參照點(diǎn)是父親的坐標(biāo)系統(tǒng))bounds指的是:該view在本身坐標(biāo)系統(tǒng)中 的位置和大小。(參照點(diǎn)是本身坐標(biāo)系統(tǒng))

UIView和CALayer有什么不同?

兩者最大的區(qū)別是,圖層不會(huì)直接渲染到屏幕上,UIView是iOS系統(tǒng)中界面元素的基礎(chǔ),所有的界面元素都是繼承自它。它本身完全是由CoreAnimation來實(shí)現(xiàn)的。它真正的繪圖部分,是由一個(gè)CALayer類來管理。UIView本身更像是一個(gè)CALayer的管理器。一個(gè)UIView上可以有n個(gè)CALayer,每個(gè)layer顯示一種東西,增強(qiáng)UIView的展現(xiàn)能力。

TCP和UDP的區(qū)別?

TCP:(傳輸控制協(xié)議),提供面向連接的、可靠地點(diǎn)對(duì)點(diǎn)的通信;

UDP:(用戶數(shù)據(jù)報(bào)協(xié)議),提供非連接的不可靠的點(diǎn)對(duì)多點(diǎn)的通信;

實(shí)際運(yùn)用中,看程序注重的是哪一方面,是可靠還是快速;

socket連接與http連接

http連接:短連接。即客戶端向服務(wù)端發(fā)送一次請(qǐng)求,服務(wù)端響應(yīng)之后,鏈接即會(huì)斷掉;

socket連接:長(zhǎng)連接。即客戶端一旦與服務(wù)器建立接連,便不會(huì)主動(dòng)斷掉。

HTTP 的post與get區(qū)別與聯(lián)系,實(shí)踐中如何選擇它們?

get是從服務(wù)器上獲取數(shù)據(jù),post是向服務(wù)器傳送數(shù)據(jù)。

在客戶端,Get方式在通過URL提交數(shù)據(jù),數(shù)據(jù)在URL中可以看到;POST方式,數(shù)據(jù)放置在HTML HEADER內(nèi)提交。

對(duì)于get方式,服務(wù)器端用Request.QueryString獲取變量的值,對(duì)于post方式,服務(wù)器端用Request.Form獲取提交的數(shù)據(jù)。

GET方式提交的數(shù)據(jù)最多只能有1024字節(jié),而POST則沒有此限制。

安全性問題。正如在(1)中提到,使用 Get 的時(shí)候,參數(shù)會(huì)顯示在地址欄上,而 Post 不會(huì)。所以,如果這些數(shù)據(jù)是中文數(shù)據(jù)而且是非敏感數(shù)據(jù),那么使用 get;如果用戶輸入的數(shù)據(jù)不是中文字符而且包含敏感數(shù)據(jù),那么還是使用 post為好。

Http定義了與服務(wù)器交互的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這樣認(rèn)為:一個(gè)URL地址,它用于描述一個(gè)網(wǎng)絡(luò)上的資源,而HTTP中的GET,POST,PUT,DELETE就對(duì)應(yīng)著對(duì)這個(gè)資源的查,改,增,刪4個(gè)操作。GET一般用于獲取/查詢資源信息,而POST一般用于更新資源信息。

檢查內(nèi)存管理問題的方式有哪些

點(diǎn)擊Xcode頂部菜單中的ProductàAnalyze。這種方法主要可以查看內(nèi)存泄露,變量未初始化,變量定義后沒有被使用到

使用Instrument工具檢查。點(diǎn)擊Xcode頂部菜單中的Product Profile,彈出一個(gè)界面,選擇左側(cè)的Memory后,再選右側(cè)的Leaks。

人工檢查

談安卓與蘋果的優(yōu)缺點(diǎn)

蘋果系統(tǒng)優(yōu)點(diǎn)是左右流暢,軟件多,界面華麗,圖標(biāo)統(tǒng)一,很美觀;缺點(diǎn)是系統(tǒng)封閉,不允許用戶過多的個(gè)性化設(shè)置,而且只能在蘋果手機(jī)上用。安卓系統(tǒng)優(yōu)點(diǎn)是開放,可以自己擴(kuò)展的東西很多,支持的硬件也多,各個(gè)價(jià)位的手機(jī)都有;缺點(diǎn)就是軟件太雜亂,兼容性有問題,圖標(biāo)混亂不美觀。iOS的確比android流暢,這僅僅體現(xiàn)在較大軟件切換時(shí),其他差不多流暢,iOS并不能做到完全后臺(tái),如果它完全后臺(tái)估計(jì)也不會(huì)比安卓流暢多少。反之,如果安卓只是注重單個(gè)運(yùn)行,流暢度也會(huì)大大提升,iOS系統(tǒng)更新沒有android那么頻繁,愛體驗(yàn)的人會(huì)選安卓,那些怕煩的會(huì)選iOS。iOS的硬件需求選不及android,以至于android機(jī)會(huì)相對(duì)iOS較熱,較費(fèi)電額。

大神篇

運(yùn)行時(shí)你是怎么理解的?

ObjC Runtime 其實(shí)是一個(gè) Runtime 庫(kù),基本上用 C 和匯編寫的,這個(gè)庫(kù)使得 C 語言有了面向?qū)ο蟮哪芰ΓX中浮現(xiàn)當(dāng)你喬幫主參觀了施樂帕克的 SmallTalk 之后嘴角一抹淺笑)。這個(gè)庫(kù)做的事前就是加載類的信息,進(jìn)行方法的分發(fā)和轉(zhuǎn)發(fā)之類的。OC是一種面向runtime(運(yùn)行時(shí))的語言,也就是說,它會(huì)盡可能地把代碼執(zhí)行的決策從編譯和鏈接的時(shí)候,推遲到運(yùn)行時(shí)。這給程序員寫代碼帶來很大的靈活性,比如說你可以把消息轉(zhuǎn)發(fā)給你想要的對(duì)象,或者隨意交換一個(gè)方法的實(shí)現(xiàn)之類的。這就要求runtime能檢測(cè)一個(gè)對(duì)象是否能對(duì)一個(gè)方法進(jìn)行響應(yīng),然后再把這個(gè)方法分發(fā)到對(duì)應(yīng)的對(duì)象去。

@protocol 和 category 中如何使用 @property

在 protocol 中使用 property 只會(huì)生成 setter 和 getter 方法聲明,我們使用屬性的目的,是希望遵守我協(xié)議的對(duì)象能實(shí)現(xiàn)該屬性

category 使用 @property 也是只會(huì)生成 setter 和 getter 方法的聲明,如果我們真的需要給 category 增加屬性的實(shí)現(xiàn),需要借助于運(yùn)行時(shí)的兩個(gè)函數(shù):

objc_setAssociatedObject

objc_getAssociatedObject

runtime如何通過selector找到對(duì)應(yīng)的IMP地址?

每一個(gè)類對(duì)象中都一個(gè)方法列表,方法列表中記錄著方法的名稱,方法實(shí)現(xiàn),以及參數(shù)類型,其實(shí)selector本質(zhì)就是方法名稱,通過這個(gè)方法名稱就可以在方法列表中找到對(duì)應(yīng)的方法實(shí)現(xiàn).

一個(gè)objc對(duì)象如何進(jìn)行內(nèi)存布局?

所有父類的成員變量和自己的成員變量都會(huì)存放在該對(duì)象所對(duì)應(yīng)的存儲(chǔ)空間中.

每一個(gè)對(duì)象內(nèi)部都有一個(gè)isa指針,指向他的類對(duì)象,類對(duì)象中存放著本對(duì)象的

對(duì)象方法列表(對(duì)象能夠接收的消息列表,保存在它所對(duì)應(yīng)的類對(duì)象中)

成員變量的列表,

屬性列表,

它內(nèi)部也有一個(gè)isa指針指向元對(duì)象(meta class),元對(duì)象內(nèi)部存放的是類方法列表,類對(duì)象內(nèi)部還有一個(gè)superclass的指針,指向他的父類對(duì)象。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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