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é)观蜗,只露一個干凈的接口臊恋,讓業(yè)務(wù)邏輯不被實(shí)現(xiàn)細(xì)節(jié)所污染,即所謂的封裝
好處:1.使用者只關(guān)注接口而不必關(guān)注實(shí)現(xiàn)墓捻,在使用第三方框架的時(shí)候抖仅。2.代碼的維護(hù)性好
繼承:描述類與類的關(guān)系,一個類是另外一個類的子類砖第,子類可以復(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的類可以多重繼承么?可以采用多個協(xié)議么忽洛?
答:不可以多重繼承腻惠,只有Java這個變態(tài)可以多繼承.oc中所有的類都是NSObject 的子類,可以用代理來代替多繼承的功能
可以遵守多個協(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)一個類的能力记舆。
比如在開發(fā)中frame這樣的結(jié)構(gòu)體不可以直接修改屬性,可以自己寫個Category呼巴,UIView+Extension,在h里定義泽腮,在m里實(shí)現(xiàn)一些方法這樣就可以導(dǎo)入頭文件,直接可以修改屬性了衣赶。當(dāng)然系統(tǒng)的類和自定義的類都可以寫分類诊赊。
所以說Category就是可以在不用知曉一個類的具體內(nèi)容,不改變原來代碼的情況下,給它添加一些方法府瞄『荔荩可以覆蓋但不能修改或刪除方法
可以將類的實(shí)現(xiàn)分散到多個不同文件或多個不同框架中
在分類中可以定義屬性,實(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ò)展一個類的方式用繼承好還是分類好?為什么闷游?
繼承是用來描述類與類之間的關(guān)系的峻汉。子類繼承于父類贴汪,擁有父類的屬性和方法。
擴(kuò)展一個類用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原子性操作。原子性指的是一個操作不可以被中途cpu暫停然后調(diào)度, 即不能被中斷, 要不就執(zhí)行完, 要不就不執(zhí)行崔泵,就是為了多線程安全的秒赤。
一般使用nonatomic。
10憎瘸、@class的作用
答:告訴編譯器有這么個類
在.h文件中, 一般只需要知道被引用的類的名稱就可以了陈瘦。 不需要知道其內(nèi)部的實(shí)體變量和方法幌甘,所以在頭文件中一般使用@class來聲明這個名稱是類的名稱。 而在實(shí)現(xiàn)類里面,因?yàn)闀玫竭@個引用類的內(nèi)部的實(shí)體變量和方法锅风,所以需要使用#import來包含這個被引用類的頭文件酥诽。
@class還可以解決循環(huán)依賴的問題,例如A.h導(dǎo)入了B.h皱埠,而B.h導(dǎo)入了A.h肮帐,每一個頭文件的編譯都要讓對象先編譯成功才行
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、是否可以在一個視圖控制器中嵌入兩個tableview控制器竭沫?(Can we use two tableview controllers on one viewcontroller?)
答:可以燥翅。
如果是視圖的話,一個視圖下當(dāng)然可以有兩個tableView
如果是控制器的話蜕提,tabBarController下就可以有兩個呀
16森书、一個tableView是否可以關(guān)聯(lián)兩個不同的數(shù)據(jù)源?你會怎么處理谎势?(Can we use one tableview with two different datasources? How you will achieve this?)
答:不明白凛膏。tableView的dataSource就是控制器啊,應(yīng)該不能兩個吧脏榆?沒有意義
17猖毫、什么是KVO?什么是KVC
答:KVC:key-value-coding。鍵值編碼须喂。提供一種機(jī)制吁断,直接通過字符串來標(biāo)識對象的屬性趁蕊。可以用valueForKeyPath/setValue forKeyPath等來訪問(讀取或設(shè)置)對象的屬性仔役,而不是通過setter,getter方法掷伙。可以簡化程序代碼
KVO是基于KVC的又兵。Key-value-observer 鍵值觀察者任柜。注冊成為觀察者后,可以動態(tài)地監(jiān)控對象屬性的變化沛厨。發(fā)生變化時(shí)可以收到通知宙地。
18、Delegate的作用
答:代理是回調(diào)監(jiān)聽機(jī)制的一種俄烁,一個類做不了的事就交給其他類來做绸栅。
比如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邪锌、寫一個委托的interface
答:先寫個協(xié)議:
1.聲明一個協(xié)議(只有.h文件)
import <Foundation/Foundation.h>
@protocal 協(xié)議名superMan<父協(xié)議NSObject>
@property NSString* name;
-(void)method;
@end
2.使一個類遵守協(xié)議
@interface TRMan:NSObject<superMan>
多個協(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、寫個單例
利用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)出唇牧。
這邊又有個疑點(diǎn)是罕扎,對于隊(duì)列來說,先進(jìn)先出的概念是Afunc添加進(jìn)隊(duì)列丐重,Bfunc緊跟著也進(jìn)入隊(duì)列腔召,Afunc先執(zhí)行這個是必然的,
但是Bfunc是等Afunc完全操作完以后扮惦,B才開始啟動并且執(zhí)行臀蛛,因此隊(duì)列的概念離亂上有點(diǎn)違背了多線程處理這個概念。
但是轉(zhuǎn)念一想其實(shí)可以參考銀行的取票和叫號系統(tǒng)崖蜜。
因此對于A比B先排隊(duì)取票但是B率先執(zhí)行完操作浊仆,我們亦然可以感性認(rèn)為這還是一個隊(duì)列。
但是后來看到一票關(guān)于這操作隊(duì)列話題的文章豫领,其中有一句提到
“因?yàn)閮蓚€操作提交的時(shí)間間隔很近抡柿,線程池中的線程,誰先啟動是不定的氏堤∩尘”
瞬間覺得這個queue名字有點(diǎn)忽悠人了,還不如pool~
綜合一點(diǎn)鼠锈,我們知道他可以比較大的用處在于可以幫組多線程編程就好了闪檬。
- 說說響應(yīng)鏈(What is responder chain?)
- 什么是推送消息?(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: