iOS面試回答之OC篇

0、面向?qū)ο蟮娜筇卣?br> 答:封裝、繼承、多態(tài)
封裝:把具體的對象封裝成抽象的類,隱藏內(nèi)部實(shí)現(xiàn),對象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對外公開接口,提高代碼的安全性,實(shí)現(xiàn)模塊化調(diào)用。為元素搞公有私有訪問就是為了隱藏實(shí)現(xiàn)細(xì)節(jié),只露一個(gè)干凈的接口,讓業(yè)務(wù)邏輯不被實(shí)現(xiàn)細(xì)節(jié)所污染,即所謂的封裝
好處:1.使用者只關(guān)注接口而不必關(guān)注實(shí)現(xiàn),在使用第三方框架的時(shí)候。2.代碼的維護(hù)性好

繼承:描述類與類的關(guān)系,一個(gè)類是另外一個(gè)類的子類,子類可以復(fù)用父類的方法和屬性
子類繼承父類就會擁有父類所有的屬性和方法
如果對于方法不滿意可以重寫父類的方法
缺點(diǎn):1.使程序變得復(fù)雜2.破壞了封裝性3.降低了可維護(hù)性和可擴(kuò)展性

多態(tài):引用的多種形態(tài),Polymorphism,父類指針指向子類對象,子類可以重寫父類的方法。Animal子類有cat,dog,雖然都有Eat方法,但是父類不能用子類的方法,子類的方法可能各有不同。不同對象以自己的方式響應(yīng)相同的消息的能力叫做多態(tài)。

1、Objective-C的類可以多重繼承么?可以采用多個(gè)協(xié)議么?
答:不可以多重繼承,只有Java這個(gè)變態(tài)可以多繼承.oc中所有的類都是NSObject 的子類,可以用代理來代替多繼承的功能
可以遵守多個(gè)協(xié)議,用逗號隔開<NSCoding,NSCoping>。

2、#import和#include的區(qū)別是什么?#import<> 跟 #import""有什么區(qū)別?
答:#include是C/C++中的,OC中要用#import避免頭文件被重復(fù)包含的問題。比如class A,class B都引用了class C,class D若引用class A與class B,就會報(bào)頭文件重復(fù)引用錯誤,如果非要用#import,要加上#define if的預(yù)編譯指令剔除重復(fù)的頭文件。在OC就乖乖用#import
#import<> 導(dǎo)入系統(tǒng)頭文件, #import""自己的頭文件

3、Category是什么?
答:
Category是分類,就是用來增強(qiáng)一個(gè)類的能力。
比如在開發(fā)中frame這樣的結(jié)構(gòu)體不可以直接修改屬性,可以自己寫個(gè)Category,UIView+Extension,在h里定義,在m里實(shí)現(xiàn)一些方法這樣就可以導(dǎo)入頭文件,直接可以修改屬性了。當(dāng)然系統(tǒng)的類和自定義的類都可以寫分類。
所以說Category就是可以在不用知曉一個(gè)類的具體內(nèi)容,不改變原來代碼的情況下,給它添加一些方法??梢愿采w但不能修改或刪除方法
可以將類的實(shí)現(xiàn)分散到多個(gè)不同文件或多個(gè)不同框架中
在分類中可以定義屬性,實(shí)例變量,是公開的啦

4、 Extension是什么?
Extension是擴(kuò)展,擴(kuò)展是分類的一種特殊的形式,是沒有名字的私有的分類。
比如我們在UIViewController里@interface和@end之間寫的東西就是擴(kuò)展啦。
@interface TRCat ()//沒有分類名了
@property (nonatomic,strong)NSString* name;//此處聲明屬性
-(void)fly;//此處聲明方法
@end
其實(shí)簡言之,擴(kuò)展就是用來聲明私有的屬性和方法,如果獨(dú)立聲明的話只有h文件沒有m文件,甚至像上面那樣的不用獨(dú)立的文件都可以!

5、Protocol是什么?
Protocol是協(xié)議,只有.h文件,甚至可以不獨(dú)立文件
使用時(shí) 遵守協(xié)議,在本類中實(shí)現(xiàn)方法就可以
協(xié)議有required和optional的,required是必須實(shí)現(xiàn)的協(xié)議方法。

6、繼承是什么?擴(kuò)展一個(gè)類的方式用繼承好還是分類好?為什么?
繼承是用來描述類與類之間的關(guān)系的。子類繼承于父類,擁有父類的屬性和方法。
擴(kuò)展一個(gè)類用Category好。繼承會破壞程序的封裝性。

7、類實(shí)例(成員)變量的@protected,@private,@public聲明各有什么含義?
答:@protected是受保護(hù)的,只能在本類及其子類中訪問
@private是私有的,只能在本類訪問
@public公開的

8、淺拷貝和深拷貝區(qū)別
答:平常的EVDog* dog1=dog2這樣的都叫淺拷貝
EVDog* dog1=[dog2 copy]這樣的叫深拷貝
所以淺拷貝只拷貝了地址(指針)并沒有產(chǎn)生新對象。而深拷貝產(chǎn)生了新的對象
如果拷貝完后改變原對象的屬性,深拷貝的對象的屬性不變,淺拷貝的對象屬性會變化

9、屬性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用
答:assign用于簡單數(shù)據(jù)類型,如NSInteger,double,bool,
retain和copy用于對象,
readwrite是可讀可寫特性;需要生成getter方法和setter方法時(shí)
readonly是只讀特性 只會生成getter方法 不會生成setter方法 ;不希望屬性在類外改變

assign是賦值特性,setter方法將傳入?yún)?shù)賦值給實(shí)例變量;僅設(shè)置變量時(shí);
retain表示持有特性,setter方法將傳入?yún)?shù)先保留,再賦值,傳入?yún)?shù)的retaincount會+1;
copy表示賦值特性,setter方法將傳入對象復(fù)制一份;需要一份新的變量時(shí)。
nonatomic非原子操作,atomic原子性操作。原子性指的是一個(gè)操作不可以被中途cpu暫停然后調(diào)度, 即不能被中斷, 要不就執(zhí)行完, 要不就不執(zhí)行,就是為了多線程安全的。
一般使用nonatomic。

10、@class的作用
答:告訴編譯器有這么個(gè)類
在.h文件中, 一般只需要知道被引用的類的名稱就可以了。 不需要知道其內(nèi)部的實(shí)體變量和方法,所以在頭文件中一般使用@class來聲明這個(gè)名稱是類的名稱。 而在實(shí)現(xiàn)類里面,因?yàn)闀玫竭@個(gè)引用類的內(nèi)部的實(shí)體變量和方法,所以需要使用#import來包含這個(gè)被引用類的頭文件。
@class還可以解決循環(huán)依賴的問題,例如A.h導(dǎo)入了B.h,而B.h導(dǎo)入了A.h,每一個(gè)頭文件的編譯都要讓對象先編譯成功才行

11、id 聲明的對象有什么特性?
答:id類型的對象可以是任意類型的OC對象,與C中的void*萬能指針相似。具有運(yùn)行時(shí)的特點(diǎn),在程序運(yùn)行時(shí)才確定對象的類型。

12、frame和bounds有什么不同?
答:frame是在父視圖坐標(biāo)系下的位置和大小。bounds是自身坐標(biāo)系下的位置和大小。
frame以父控件的左上角為坐標(biāo)原點(diǎn),bounds以控件本身的左上角為坐標(biāo)原點(diǎn)

13、方法和選擇器有何不同?
答:selector是方法的名字,通過它可以找到方法
方法是相對于對象來說的,包含名字和實(shí)現(xiàn)等。

14、lazy loading是什么
答:懶加載。直到要用的時(shí)候才去初始化。

15、是否可以在一個(gè)視圖控制器中嵌入兩個(gè)tableview控制器?(Can we use two tableview controllers on one viewcontroller?)
答:可以。
如果是視圖的話,一個(gè)視圖下當(dāng)然可以有兩個(gè)tableView
如果是控制器的話,tabBarController下就可以有兩個(gè)呀

16、一個(gè)tableView是否可以關(guān)聯(lián)兩個(gè)不同的數(shù)據(jù)源?你會怎么處理?(Can we use one tableview with two different datasources? How you will achieve this?)
答:不明白。tableView的dataSource就是控制器啊,應(yīng)該不能兩個(gè)吧?沒有意義

17、什么是KVO?什么是KVC
答:KVC:key-value-coding。鍵值編碼。提供一種機(jī)制,直接通過字符串來標(biāo)識對象的屬性??梢杂胿alueForKeyPath/setValue forKeyPath等來訪問(讀取或設(shè)置)對象的屬性,而不是通過setter,getter方法??梢院喕绦虼a

KVO是基于KVC的。Key-value-observer 鍵值觀察者。注冊成為觀察者后,可以動態(tài)地監(jiān)控對象屬性的變化。發(fā)生變化時(shí)可以收到通知。

18、Delegate的作用
答:代理是回調(diào)監(jiān)聽機(jī)制的一種,一個(gè)類做不了的事就交給其他類來做。
比如actionSheet本身是沒辦法處理用戶交互事件的,所以要讓控制器成為其代理來處理。當(dāng)控制器遵守協(xié)議,實(shí)現(xiàn)方法,成為它的代理之后,就可以在特定的時(shí)間通知控制器進(jìn)行處理,所以delegate方法里經(jīng)常有did,should,will這樣的詞。
要注意Delegate的聲明一定要是weak的,以避免循環(huán)引用內(nèi)存泄漏

19、oc中可修改和不可以修改類型(What are mutable and immutable types in Objective C?)
答:可修改不可修改類。OC中的可變不可變類型
比如NSArray和NSMutableArray,NSDictionary和NSMutableDictionary能否動態(tài)添加和修改內(nèi)容。前者在初始化后的內(nèi)存控件就是固定不可變的,后者可以添加等,可以動態(tài)申請新的內(nèi)存空間。

20、runtime是什么?
答:運(yùn)行時(shí)是指在程序運(yùn)行時(shí)才確定數(shù)據(jù)的類型,調(diào)用指定的方法。將數(shù)據(jù)類型的確定由編譯時(shí)推遲到了程序運(yùn)行時(shí)。可以通過字符串來創(chuàng)建對象NSClassFromString,創(chuàng)建方法,創(chuàng)建屬性NSSelectorFromString

21、method和selector的區(qū)別?
答:方法和選擇器的區(qū)別
selector是方法的名字,通過它可以找到方法
方法是相對于對象來說的,包含名字和實(shí)現(xiàn)等。

22、寫一個(gè)委托的interface
答:先寫個(gè)協(xié)議:
1.聲明一個(gè)協(xié)議(只有.h文件)

import <Foundation/Foundation.h>

@protocal 協(xié)議名superMan<父協(xié)議NSObject>
@property NSString* name;
-(void)method;
@end
2.使一個(gè)類遵守協(xié)議
@interface TRMan:NSObject<superMan>
多個(gè)協(xié)議要用,隔開
3.使用協(xié)議
id<協(xié)議名superMan> obj=[[TRMan alloc]init];
@ protocol MyDelegate
@interface MyClass : NSObject
@property(nonatomic,weak)id<TRPassValue> delegate;
@end

協(xié)議也可以沒有獨(dú)立文件,寫在類里

import <UIKit/UIKit.h>

@class MyClass;
@protocol MyClassDelegate <NSObject>
-(void)protocolMethod;
@end
@interface MyClass : NSObject
@property(nonatomic,weak)id<MyClassDelegate> delegate;
@end

23、寫個(gè)單例
利用GCD構(gòu)建
DataCenter.h

import <Foundation/Foundation.h>

@interface DataCenter : NSObject
+(id)sharedDataCenter;
@end

DataCenter.m

import "DataCenter.h"

@implementation DataCenter
+(id)sharedDataCenter{
static DataCenter *sharedDataCenter=nil;
static dispatch_once_t token;
dispatch_once(&token, ^{
sharedDataCenter = [[self alloc]init];
});
return sharedDataCenter;
}
@end

24、const/static/extern的作用

————————————————————————————————————————————————————————

通知NSNotification和協(xié)議protocol的區(qū)別

17.NSOperation queue?
答案:存放NSOperation的集合類。操作和操作隊(duì)列,用于處理ios多線程開發(fā)
操作和操作隊(duì)列,基本可以看成java中的線程和線程池的概念。用于處理ios多線程開發(fā)的問題。
網(wǎng)上部分資料提到一點(diǎn)是,雖然是queue,但是卻并不是帶有隊(duì)列的概念,放入的操作并非是按照嚴(yán)格的先進(jìn)現(xiàn)出。
這邊又有個(gè)疑點(diǎn)是,對于隊(duì)列來說,先進(jìn)先出的概念是Afunc添加進(jìn)隊(duì)列,Bfunc緊跟著也進(jìn)入隊(duì)列,Afunc先執(zhí)行這個(gè)是必然的,
但是Bfunc是等Afunc完全操作完以后,B才開始啟動并且執(zhí)行,因此隊(duì)列的概念離亂上有點(diǎn)違背了多線程處理這個(gè)概念。
但是轉(zhuǎn)念一想其實(shí)可以參考銀行的取票和叫號系統(tǒng)。
因此對于A比B先排隊(duì)取票但是B率先執(zhí)行完操作,我們亦然可以感性認(rèn)為這還是一個(gè)隊(duì)列。
但是后來看到一票關(guān)于這操作隊(duì)列話題的文章,其中有一句提到
“因?yàn)閮蓚€(gè)操作提交的時(shí)間間隔很近,線程池中的線程,誰先啟動是不定的。”
瞬間覺得這個(gè)queue名字有點(diǎn)忽悠人了,還不如pool~
綜合一點(diǎn),我們知道他可以比較大的用處在于可以幫組多線程編程就好了。

  1. 說說響應(yīng)鏈(What is responder chain?)
  2. 什么是推送消息?(What is push notification?)

什么是接口
可以調(diào)用的屬性方法

10、試寫出 @property中帶retain和assign關(guān)鍵字,通過@synthesize自動生成的的合成存取方法(set、get方法)的實(shí)現(xiàn)代碼
@property(nonatomic,retain)EVDog* dog;
@property(nonatomic,assign)EVCat cat;

iOS中有哪些回調(diào)機(jī)制,并作簡單的比較.
target: action:
delegate
通知:notification
觀察者模式:
block:

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

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

  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,579評論 30 472
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,502評論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,623評論 18 399
  • 1.項(xiàng)目經(jīng)驗(yàn) 2.基礎(chǔ)問題 3.指南認(rèn)識 4.解決思路 ios開發(fā)三大塊: 1.Oc基礎(chǔ) 2.CocoaTouch...
    扶光啟玄閱讀 5,186評論 0 13
  • 1 兩周前,我在一個(gè)微信群里,認(rèn)識了一個(gè)新姑娘。她大二,坐標(biāo)帝都。 那天晚上,群里本來靜悄悄的,九點(diǎn)那會,她毫無征...
    許小冰閱讀 520評論 1 4

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