1.objective-c常見面試題:
1蝴乔、**OC **語言的基本特點(diǎn)
OC 語言是 C 語言的一個(gè)超集,只是在 C 的基礎(chǔ)之上加上了面向?qū)ο?oop) 的特性;
OC 與 Java 語言相同都是單繼承,這一點(diǎn)與 C++語言不同(多重繼承);OC 不支持命名空間機(jī)制,取而代之的是在類名之前添加前綴,以此來區(qū)分潮孽。
2贝攒、以下命名正確的是
(1)類(Person隅茎、person干发、ObjectAndKeys实胸、personAndOther) (2)對(duì)象 (objectAndKeys郎任、Person秧耗、_person、$dog) (3)實(shí)例變量 (_dog舶治、^age分井、name、Name霉猛、)
3尺锚、數(shù)據(jù)類型和表達(dá)式
(1) inta=5,b=2,c=2,result,result=ab++-c;求result的值和b的值。
答:result 的值為 8,b 的值為3惜浅。根據(jù)運(yùn)算符的優(yōu)先級(jí)(乘法比加法的優(yōu)先 級(jí)高),首先計(jì)算 ab,因?yàn)?b++,“++”在后面瘫辩。因此,先計(jì)算 ab,其結(jié)果為 10,計(jì)算完成后 b 的結(jié)果++,因此b 的結(jié)果為3。最后與c 相減,result 的結(jié)果 為8坛悉。
(2)result= (b > a)? a++ : ((++c> a-b)? ++c : b++),求result,a,b,c 的值,假設(shè) a伐厌、b、c的值分別為1裸影、2挣轨、3。(右結(jié)合性;運(yùn)算符號(hào)優(yōu) 先級(jí)->結(jié)合性->順序)
答:運(yùn)算符號(hào)相同,因此判斷運(yùn)算符號(hào)的結(jié)合性空民。即表達(dá)式為:result = (b > a)? a++ :(++c > a-b)? ++c : b++),然后我們判斷表達(dá)是(b > a)是否為真刃唐。 因此,result 的結(jié)果為1,a、b界轩、c 的值分別為 2画饥、2、3浊猾。
(3)inta = 5, b = 12, c = 3, result = 0, d = 5, e = 2,result= a -= b /= c += d %= e;求result,a抖甘、b、c葫慎、d衔彻、e*。
答:運(yùn)算符號(hào)相同,因此,判斷該運(yùn)算符號(hào)的結(jié)合性偷办。賦值運(yùn)算符號(hào)為右結(jié)合, 因此,表達(dá)式從右開始計(jì)算艰额。d %= 2,分解為d = d % e,d 值為 1;計(jì)算c += d, 同理,c值為4。再計(jì)算b /= c,b值為3;再計(jì)算a -= b,a值為2椒涯。最后將a 值賦值給 result柄沮。因此,result 的結(jié)果為2,a、b废岂、c祖搓、d、e 的結(jié)果分別是 2湖苞、3拯欧、 4、1财骨、2镐作。(復(fù)合賦值運(yùn)算符效率更高)
(4)如果第三題中 d為-5,求result。答:%(模運(yùn)算符號(hào))的符號(hào)取決與第一個(gè)數(shù),因此,result 的值為-1,a隆箩、b滑肉、
c、d摘仅、e 的值分別為-1靶庙、6、2娃属、-1六荒、2。(5)假設(shè) a矾端、b掏击、c 的值分別是4、5秩铆、6砚亭。那么result = a < b < c,求result 是多少?
答:result 值為 1灯变。(6)解釋id類型
答:任意類型對(duì)象。程序運(yùn)行時(shí)決定才對(duì)象的類型捅膘。 (7)解釋nil,發(fā)送消息時(shí),程序是否會(huì)出現(xiàn)異常添祸。
答:不會(huì),在OC 語言中可以 nil 發(fā)送消息,而程序不會(huì)拋出異常,其結(jié)果是什么也不做。
4寻仗、流程控制語句
(1)**switch 語句每一case 都需要添加 break 語句嗎?答:switch 語句中的 break 語句不是必須的,此外,default 語句也不是必須
添加的刃泌。如果在某一個(gè)條件中添加(case 語句之后)break 語句,即當(dāng)條件滿足 時(shí),跳出 switch 語句。(2)do while 語句和 while 語句的區(qū)別,并寫出幾個(gè)死循環(huán)署尤。
答:do while 語句至少執(zhí)行一次循環(huán)體,而while 語句括號(hào)中的表達(dá)式為真, 才執(zhí)行循環(huán)體耙替。
while(1){ }、for(;)(3)switch **語句 **if **語句區(qū)別與聯(lián)系以及它的優(yōu)勢(shì)在哪里
答:均表示條件的判斷,switch 語句表達(dá)式只能處理是整型曹体、字符型和枚舉類 型,而選擇流程語句則沒有這樣的限制俗扇。但 switch 語句比選擇流程控制語句效 率更高。(4)int number = 26,k = 1,求 k 的值
do {k = number % 10;
number /= 10;} while(number);
答:do while 語句的特點(diǎn)是,循環(huán)體至少執(zhí)行一次箕别。程序執(zhí)行到表達(dá)式 k=number%10,已知number 為26,又已知算術(shù)運(yùn)算符比賦值運(yùn)算符好優(yōu)先級(jí)別高,因此先計(jì)算 number%10,其結(jié)果為 6;已知 k 為1,因此,k 的結(jié)果為6狐援。number/=10,number 的值2。while 語句判斷表達(dá)式是否為真,此時(shí),number 為 2究孕。繼續(xù)執(zhí)行循環(huán)體,此時(shí)number啥酱、k 的值分別為 2、6,2%10 的結(jié)果仍為 2,再與 k 相乘,其 k 的結(jié)果為12厨诸。程序執(zhí)行到循環(huán)體第二行 number/10,此時(shí) number 已為 10,因此,number 的結(jié)果為 0镶殷。while 表達(dá)式內(nèi)條件為假,循環(huán)就此結(jié)束。因此,k 的值為 12微酬。
5绘趋、寫出以下方法類型、方法名稱和返回值類型
(1)-(void)initWithName:(NSString)name andAge:(int) age;(2)+(Person)personName:(NSString)name; (3)-(void)setName:(NSString )name setAge:(int)agesetDelegate:(id)delegate;
(4)-(NSString)name;(5)+ (Kingdom *)shareKingdom; (6)+(Kingdom *)defaultKingdom;
6颗管、創(chuàng)建一個(gè)這樣的 Person類,用類目的形式給**Person **添加一組方法(方法任意)陷遮、并且若干私有方法以及在 Person類中添加一個(gè)協(xié)議(手寫代碼)
.h文件#import @”Person.h”
@protocol PersonDelegate @required- (void)thisRequiredMethod;@optional
- (void)thisOptionalMethod; @end
@interface Person : NSObject { @private
NSString *_name;
NSInteger _age; } - (void)test;
- (void)test1:(int)arg1;
- (void)test1:(int)arg1 test2:(int)arg2; @end@interface Person (Create)- (id)initWithName:(NSString *)aName;- (id)initWithName:(NSString *)aName age:(int)age; + (id)personBorn; @end
.m文件
@interface Person () - (void)private1;- (void)private2; @end @implementation
- (void)test {}- (void)test1:(int)arg1 {}- (void)test1:(int)arg1 test2:(int)arg2 {} - (void)private1 {}- (void)private2 {}
- (id)initWithName:(NSString *)aName { self = [superinit];
if (self) {}return self;
}- (id)initWithName:(NSString *)aName age:(int)age {
...... }
- (id)personBorn {Person *person = [[Person alloc] init]; return [person autorelease];
} @end
7、協(xié)議的基本概念和協(xié)議中方法默認(rèn)為什么類型
答:OC 中的協(xié)議是一個(gè)方法列表,且多少有點(diǎn)相關(guān)垦江。它的特點(diǎn)是可以被任何 類使用(實(shí)現(xiàn)),但它并不是類(這里我們需要注意),自身不會(huì)實(shí)現(xiàn)這樣方法,
而是又其他人來實(shí)現(xiàn)帽馋。協(xié)議經(jīng)常用來實(shí)現(xiàn)委托對(duì)象(委托設(shè)計(jì)模式)。如果一個(gè)類采用了一個(gè)協(xié)議,那么它必須實(shí)現(xiàn)協(xié)議中必須需要實(shí)現(xiàn)的方法,在 協(xié)議中的方法默認(rèn)是必須實(shí)現(xiàn)(@required),添加關(guān)鍵字@optional,表明一旦
采用該協(xié)議,這些“可選”的方法是可以選擇不實(shí)現(xiàn)的比吭。
8绽族、**#include 與#import 的區(qū)別、#import 與@class **的區(qū)別
答:#include 和#import 其效果相同,都是查詢類中定義的行為(方法)衩藤。只 是后者不會(huì)引起交叉編譯,確保頭文件只會(huì)被導(dǎo)入一次吧慢。@class 的表明,只定義了類的名稱,而具體類的行為是不知道的,一般用于.h 文件,因此,@class 比#import 編譯效率更高。此外@class 和#import 的主要區(qū)別在于解決引用死鎖 的問題赏表。
9检诗、@public匈仗、@protected、@private它們的含義與作用
( 1) @public:答:對(duì)象的實(shí)例變量的作用域在任意地方都可以被訪問
( 2) @protected:答:對(duì)象的實(shí)例變量作用域在本類和子類都可以被訪問
( 3) @private:答:實(shí)例變量的作用域只能在本類(自身)中訪問
(4)通過指針運(yùn)算符(->)能夠訪問到private方法嗎?**OC **語言中還提供 了哪些方式能直接和間接的訪問對(duì)象的實(shí)例變量?
答:不可以,可以通過合成存取器訪問實(shí)例變量,也可自己定義 setter 和getter 方法訪問實(shí)例變量,KVC(key value coding)——鍵值編碼,間接的方式訪問實(shí) 例變量逢慌。
10悠轩、簡(jiǎn)述類目?jī)?yōu)點(diǎn)和缺點(diǎn),如果覆蓋本類或者父類的方法,會(huì)出現(xiàn)什么問題?
答:(1)優(yōu)點(diǎn):不需要通過增加子類而增加現(xiàn)有類的行為(方法),且類目中的方法與原始類方法基本沒有區(qū)別;通過類目可以將龐大一個(gè)類的方法進(jìn)行劃分,從而便于代碼的日后的維護(hù)、更新以及提高代碼的閱讀性涕癣。
(2)缺點(diǎn):無法向類目添加實(shí)例變量,如果需要添加實(shí)例變量,只能通過 定義子類的方式;類目中的方法與原始類以及父類方法相比具有更高級(jí)別的優(yōu)先 級(jí),如果覆蓋父類的方法,可能導(dǎo)致 super 消息的斷裂。因此,最好不要覆蓋原 始類中的方法前标。
11坠韩、簡(jiǎn)述內(nèi)存管理基本原則
答:(1)如果使用alloc、copy(mutableCopy)或者 retian 一個(gè)對(duì)象時(shí),你就 有義務(wù),向它發(fā)送一條 release 或者autorelease 消息炼列。其他方法創(chuàng)建的對(duì)象,不 需要由你來管理內(nèi)存只搁。
(2)向一個(gè)對(duì)象發(fā)送一條 autorelease 消息,這個(gè)對(duì)象并不會(huì)立即銷毀,而是將這個(gè)對(duì)象放入了自動(dòng)釋放池,待池子釋放時(shí),它會(huì)向池中每一個(gè)對(duì)象發(fā)送 一條 release 消息,以此來釋放對(duì)象。
(3)向一個(gè)對(duì)象發(fā)送 release 消息,并不意味著這個(gè)對(duì)象被銷毀了,而是 當(dāng)這個(gè)對(duì)象的引用計(jì)數(shù)為 0 時(shí),系統(tǒng)才會(huì)調(diào)用 dealloc 方法,釋放該對(duì)象和對(duì)象 本身它所擁有的實(shí)例俭尖。
12氢惋、在 objective c中是否支持垃圾回收機(jī)制? 答:OC是支持垃圾回收機(jī)制的(Garbagecollection簡(jiǎn)稱GC),但是apple的
移動(dòng)終端中,是不支持 GC 的,Mac 桌面系統(tǒng)開發(fā)中是支持的。 13稽犁、什么是**ARC 技術(shù)?與GC **是否相同?
答:ARC 是 AutomaticReference Counting 的簡(jiǎn)稱,我們稱之為自動(dòng)引用計(jì)數(shù),
是在IOS 5之后推出的新技術(shù),它與GC的機(jī)制是不同的焰望。我們?cè)诰帉懘a時(shí), 不需要向?qū)ο蟀l(fā)送 release 或者 autorelease 方法,也不可以調(diào)用 delloc 方法, 編譯器會(huì)在合適的位置自動(dòng)給用戶生成release 消息(autorelease),ARC 的特點(diǎn)是自動(dòng)引用技術(shù)簡(jiǎn)化了內(nèi)存管理的難度。
14已亥、什么是retain count答:每一個(gè)對(duì)象都默認(rèn)有一個(gè) retainCount 的屬性,數(shù)值的多少表示現(xiàn)在有幾
個(gè)實(shí)例正在引用它熊赖。當(dāng)它為 0 時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用 dealloc 方法,將內(nèi)存回收。15虑椎、寫出*@property (nonatomic ,retain) Person person;
**@synthesize person **具體實(shí)現(xiàn),并指出其中含義震鹉。
非原子性事物
- (void)setPerson:(Person *)person {if (_person!= person){ [_person release]; _person = [person retain]; } }
- (Person )person { return _person; } 原子性事物- (void)setPerson:(Person)person {@synchronized(self) { if (_person!= person){
[_person release]; _person = [person retain]; }
} } - (Person *)person {
@synchronized(self) {
return _person; }
}
16、深捆姜、淺復(fù)制的基本概念以及他們的區(qū)別,可以用圖 來加以說明传趾。
17、堆和棧的區(qū)別
答:(1)棧區(qū)(stack)由編譯器自動(dòng)分配釋放 ,存放方法(函數(shù))的參數(shù)值,局部變量的值等泥技。先進(jìn)后出浆兰。
(2)堆區(qū)(heap)一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時(shí)由OS回收。
(3)全局區(qū)(靜態(tài)區(qū))(static),全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域珊豹。程序結(jié)束后有系統(tǒng)釋放镊讼。
(4)文字常量區(qū)—常量字符串就是放在這里的。程序結(jié)束后由系統(tǒng)釋放平夜。 (5)程序代碼區(qū)—存放函數(shù)體的二進(jìn)制代碼蝶棋。
18、用戶自定義了一個(gè)對(duì)象,如何實(shí)現(xiàn)拷貝(可變和不可變拷貝)
答:必須實(shí)現(xiàn) copying 和mutableCopying 協(xié)議,表示返回一個(gè)不可變和可變的對(duì)象忽妒。否則,程序?qū)?huì)出現(xiàn)異常玩裙。-(id)copyWithZone:(NSZone *)zone{
Person *person = [[self Class] allocWithZone:zone];person ->age = self.age;person ->name = self.name;return person;
}- (id)mutableCopyWithZone(NSZone *)zone;
19兼贸、以下代碼有問題嗎?如果有,會(huì)出現(xiàn)什么問題
- (void) setName:(NSString *)name {
self.name = name; }
答:引起重復(fù)調(diào)用(自己調(diào)用自己)。
20吃溅、定義屬性時(shí),什么時(shí)候用 assign溶诞、retain、**copy **以及它們的之間的區(qū)別
答:(1)assign:普通賦值,一般常用于基本數(shù)據(jù)類型,常見委托設(shè)計(jì)模式,以此來防止循環(huán)引用决侈。(我們稱之為弱引用,weak)
(2)retain:保留計(jì)數(shù),獲得到了對(duì)象的所有權(quán)螺垢。引用計(jì)數(shù)在原有基礎(chǔ)上 加1。
(3)copy:一般認(rèn)為,是在內(nèi)存中重新開辟了一個(gè)新的內(nèi)存空間,用來
存儲(chǔ)新的對(duì)象,和原來的對(duì)象是兩個(gè)不同的地址,引用計(jì)數(shù)分別 1赖歌。但是當(dāng) copy 對(duì)象為不可變對(duì)象時(shí),那么 copy 的作用相當(dāng)于 retain枉圃。因?yàn)?這樣可以節(jié)約內(nèi) 存空間。
21庐冯、解釋以下關(guān)鍵字,static孽亲、self、super用實(shí)例說明
答static: 靜態(tài)全局變量,持久性作用展父、存儲(chǔ)區(qū)域在靜態(tài)區(qū)域,它的生命周期 和應(yīng)用進(jìn)行綁定返劲。程序結(jié)束時(shí),由系統(tǒng)自動(dòng)回收。
self:當(dāng)前消息的接收者栖茉。 super:向父類發(fā)送消息篮绿。
22、解釋 self = [super init]方法
答:容錯(cuò)處理,當(dāng)父類初始化失敗,會(huì)返回一個(gè) nil,表示初始化失敗吕漂。由于繼承的關(guān)系,子類是需要擁有父類的實(shí)例和行為的,因此,我們必須先初始化父 類,然后再初始化子類搔耕。
23、當(dāng)我們釋放對(duì)象時(shí),為什么需要調(diào)用[super dealloc]方法?
答:(1)因?yàn)?子類是繼承自父類,那么子類中有一些實(shí)例變量(對(duì)象),是繼承子父類的,因此,我們需要調(diào)用父類方法,將父類所擁有的實(shí)例進(jìn)行釋放痰娱。
(2)先將子類所擁有的實(shí)例進(jìn)行釋放,然后再釋放父類的弃榨。 24嘱吗、objective-c有私方法么?私有變量呢?
答:是有的,我們稱之為延展苗踪。私有變量也是有的(@private)。25关划、以下每行代碼執(zhí)行后,person對(duì)象的retain count分
別是多少?Person *person =[[Person alloc] init]; // 1
[person retain]; [person release]; [personrelease];
// 2 // 1
// 0
26坡贺、在某個(gè)方法中 self.name = _name官辈、name = _name他 們有區(qū)別嗎,為什么?
答:是有區(qū)別的,前者是存在內(nèi)存管理的,它會(huì)對(duì)_name 對(duì)象進(jìn)行保留或者拷 貝操作,而后者是普通賦值。
27遍坟、假設(shè)我們寫了一個(gè)類的合成存取器,@property(nonatomic, copy) NSString name;@synthesizename;*
(1)NSStringaName = [NSString stringWithFormat:@”a”];person.name = aName 此時(shí) name 的引用計(jì)數(shù)是幾,為什么,這么做
有什么好處?答:它的引用技術(shù)是 2,相當(dāng)于 retain 操作拳亿。
(2)NSMutableStringaName = [NSMutableString stringWithFormat:@”a”];同上
答:它的引用技術(shù)是 1,真正意義上的拷貝。(3)返回這一個(gè)字符串的類型,是可變的嗎?如果不是,為什么,我們 又如何做?
答:不可變,因?yàn)楹铣纱嫒∑髦杏玫?copy愿伴。如果,我們需要返回一個(gè)可變 的字符串時(shí),那么必須自己實(shí)現(xiàn) setter 和getter 方法肺魁。
28、自動(dòng)釋放池是什么,如何工作
答:自動(dòng)釋放池是 NSAutorelease 類的一個(gè)實(shí)例,當(dāng)向一個(gè)對(duì)象發(fā)送 autorelease 消息時(shí),該對(duì)象會(huì)自動(dòng)入池,待池銷毀時(shí),將會(huì)向池中所有對(duì)象發(fā)送一條 release 消息,釋放對(duì)象隔节。[pool release]; [pool drain]表示的是池本身
不會(huì)銷毀,而是池子中的臨時(shí)對(duì)象都被發(fā)送release,從而將對(duì)象銷毀鹅经。 29寂呛、為什么delegate(代理)屬性都是assign 而不是retain
的? 答:防止循環(huán)引用,以至對(duì)象無法得到正確的釋放。
30瘾晃、**iOS **開發(fā)中數(shù)據(jù)持久性,有哪幾種贷痪。 答:文件寫入、對(duì)象歸檔蹦误、sqlite3數(shù)據(jù)庫劫拢、coredata
31、對(duì)象歸檔的基本概念,以及它的特點(diǎn)是什么?
答:歸檔為對(duì)象的數(shù)據(jù)持久化提供了一種解決方法,它特點(diǎn)是給歸檔的對(duì)象進(jìn)行加密,增強(qiáng)了數(shù)據(jù)的安全性强胰。此外,自定義類的對(duì)象歸檔必須實(shí)現(xiàn) NSCoding 協(xié)議舱沧。
32、什么是謂詞?答:cocoa 中提供了一個(gè) NSPredicate 的類,該類主要用于指定過濾器的條件,
每一個(gè)對(duì)象通過謂詞進(jìn)行篩選,判斷條件是否匹配哪廓。33狗唉、什么是 KVC 和KVO?以及它們之間的關(guān)系是什么
答:(1)KVC(鍵值編碼)是一種間接訪問對(duì)象實(shí)例變量的機(jī)制,該機(jī)制可以 不通過存取方法就可以訪問對(duì)象的實(shí)例變量初烘。非對(duì)象類型的變量將被自動(dòng)封裝或 者解封成對(duì)象涡真。此外,使用KVC 能夠簡(jiǎn)化代碼。我們需要注意 KVC 有兩個(gè)較為 明顯的缺點(diǎn),一旦使用 KVC 你的編譯器無法檢查出錯(cuò)誤,即不會(huì)對(duì)設(shè)置的鍵肾筐、 鍵路徑進(jìn)行錯(cuò)誤檢查,且執(zhí)行效率要低于(雖然效率已經(jīng)很高,你已經(jīng)感覺不到)合成存取器方法和自定的 setter 和 getter 方法哆料。因?yàn)槭褂?KVC 鍵值編碼,它必 須先解析字符串,然后在設(shè)置或者訪問對(duì)象的實(shí)例變量。
(2)KVO(鍵值觀察)是一種能使得對(duì)象獲取到其他對(duì)象屬性變化的通知
機(jī)制吗铐。(3)實(shí)現(xiàn) KVO 鍵值觀察模式,被觀察的對(duì)象必須使用KVC 鍵值編碼來修
改它的實(shí)例變量,這樣才能被觀察者觀察到东亦。因此,KVC 是KVO 的基礎(chǔ)或者說 KVO 的實(shí)現(xiàn)是建立在 KVC 的基礎(chǔ)之上的。
34唬渗、在 objective c中如何實(shí)現(xiàn)KVO
答:(1)注冊(cè)觀察者(這里我們需要注意,觀察者和被觀察者不會(huì)被保留也不 會(huì)被釋放)
- (void)addObserver:(NSObject *)observerforKeyPath:(NSString *)keyPath
options:(NSKeyValueObservingOptions)options
context:(void )context;
(2)接收變更通知- (void)observeValueForKeyPath:(NSString)keyPath
ofObject:(id)object change:(NSDictionary *)changecontext:(void *)context;
(3)移除對(duì)象的觀察者身份-(void)removeObserver:(NSObject *)observer
forKeyPath:(NSString *)keyPath;
35典阵、當(dāng)我們釋放我們的對(duì)象時(shí),為什么需要調(diào)用[super dealloc]方法,它的位置又是如何的呢?
答:因?yàn)樽宇惖哪承?shí)例是繼承自父類的,因此需要調(diào)用[super dealloc]方法, 來釋放父類擁有的實(shí)例,其實(shí)也就是子類本身的。一般來說我們優(yōu)先釋放子類擁 有的實(shí)例,最后釋放父類所擁有的實(shí)例镊逝。
36壮啊、以下代碼會(huì)出項(xiàng)問題嗎?如果有,我們又該如何修 改?
@property (nonatomic, copy) NSMutableString *name;@synthesize name = _name;
self.name = [NSMutableStringstringWithFormat:@"..xyz"]; [self.name insertString:@"abc"atIndex:0];
答:不可變字符串不可以被修改,可以通過自定義 set 方法,將字符串的拷貝 改為可變的拷貝。
37撑蒜、當(dāng)我們將一個(gè)對(duì)象加入自動(dòng)釋放池時(shí),該對(duì)象何時(shí) 被銷毀
答:我們?cè)?application kit 應(yīng)用程序中,自動(dòng)釋放池中的臨時(shí)對(duì)象被銷毀的時(shí)間時(shí),一個(gè)事件循環(huán)結(jié)束后歹啼。注意自動(dòng)釋放池沒有被釋放,而是被排空了,向池發(fā)送了 drain 消息。
38座菠、當(dāng)我們調(diào)用一個(gè)靜態(tài)方法時(shí),需要對(duì)對(duì)象進(jìn)行release嗎?
答:不需要,靜態(tài)方法(類方法)創(chuàng)建一個(gè)對(duì)象時(shí),對(duì)象已被放入自動(dòng)釋放池狸眼。在池被釋放時(shí),很有可能被銷毀
。
39浴滴、什么叫鍵路徑?
答:在一個(gè)給定的實(shí)體中,同一個(gè)屬性的所有值具有相同的數(shù)據(jù)類型拓萌。 鍵-值編碼技術(shù)用于進(jìn)行這樣的查找—它是一種間接訪問對(duì)象屬性的機(jī)制。 鍵路徑是一個(gè)由用點(diǎn)作分隔符的鍵組成的字符串,用于指定一個(gè)連接在一起的對(duì)象性質(zhì)序列升略。第一個(gè)鍵的性質(zhì)是由先前的性質(zhì)決定的,接下來每個(gè)鍵的值也是相
對(duì)于其前面的性質(zhì)司志。鍵路徑使您可以以獨(dú)立于模型實(shí)現(xiàn)的方式指定相關(guān)對(duì)象的性 質(zhì)甜紫。通過鍵路徑,您可以指定對(duì)象圖中的一個(gè)任意深度的路徑,使其指向相關(guān)對(duì) 象的特定屬性。
40骂远、以下代碼存在內(nèi)存泄露嗎?如果有,如何去修改
self.object = [NSObject alloc] init]; self.object =[NSObject object] retain]; self.object = [NSObject object];
- (void)dealloc {
self.object = nil;
[super dealloc]; }
41囚霸、循環(huán)引用是什么,如何解決這樣的問題
答:對(duì)象 a 創(chuàng)建并引用到了對(duì)象 b;對(duì)象 b 創(chuàng)建并引用到了對(duì)象 c;對(duì)象 c 創(chuàng)建并引用到了對(duì)象 b。這時(shí)候 b 和 c 的引用計(jì)數(shù)分別是 2 和1激才。
當(dāng)a 不再使用b,調(diào)用 release 釋放對(duì)b 的所有權(quán),因?yàn)?c 還引用了b,所以 b 的引用計(jì)數(shù)為 1,b 不會(huì)被釋放拓型。
b 不釋放,c 的引用計(jì)數(shù)就是 1,c 也不會(huì)被釋放。從此,b 和c 永遠(yuǎn)留在內(nèi)存 中瘸恼。
這種情況,必須打斷循環(huán)引用,通過其他規(guī)則來維護(hù)引用關(guān)系劣挫。我們常見的 delegate 往往是 assign 方式的屬性而不是 retain 方式的屬性, 賦值不會(huì)增加引用計(jì)數(shù),就是為了防止 delegation 兩端產(chǎn)生不必要的循環(huán)引用。
42东帅、isMemberOfClass和isKindOfClass聯(lián)系與區(qū)別
答:兩者都能檢測(cè)一個(gè)對(duì)象是否是某個(gè)類的成員, 兩者之間的區(qū)別是:
isKindOfClass 不但可以用來確定一個(gè)對(duì)象是否是一個(gè)類的成員,也可以用來確 定一個(gè)對(duì)象是否是派生自該類的類的成員 ,而 isMemberOfClass 做不到后一點(diǎn)压固。
如 ClassA 派 生 自 NSObject 類 , ClassA*a = [ClassA alloc] init]; [a isKindOfClass:[NSObject class]] 可以檢查出 a是否是 NSObject派生類 的成員,但 isMemberOfClass 做不到靠闭。
2.面試題
1.簡(jiǎn)述OC中內(nèi)存管理機(jī)制
1.1 OC的內(nèi)存管理機(jī)制是自動(dòng)引用計(jì)數(shù)帐我,內(nèi)存管理的原則是誰開辟誰釋放,有retain的地方就要有release
1.2 內(nèi)存管理分為ARC和MRC愧膀,在MRC下我們需要手動(dòng)管理內(nèi)存拦键,需要使用到retain/copy/release/autorelease等方法實(shí)現(xiàn)內(nèi)存管理。ARC下則一般不需要我們手動(dòng)管理檩淋,系統(tǒng)會(huì)在適當(dāng)?shù)奈恢眉由蟽?nèi)存管理關(guān)鍵字芬为。
1.3 retain是引用計(jì)數(shù)+1,在內(nèi)存管理中,要記得內(nèi)存管理原則:誰開辟誰釋放,有retain就要有release. release是引用計(jì)數(shù)-1.alloc匹配的是dealloc,alloc是開辟內(nèi)存空間,dealloc是銷毀所開辟的內(nèi)存,有開辟就要有 銷毀.
2.readwrite蟀悦,readonly,assign日戈,retain,copy涎拉,nonatomic、atomic鼓拧、strong、weak屬性的作用钮糖?
readWrite讀寫特性,可讀可寫.
readonly只讀,只有g(shù)etter,沒有setter.
assign一般用于基本數(shù)據(jù)類型和ID類型.
copy拷貝,一般用于 NSString.分為深拷貝和淺拷貝,深拷貝拷貝的是對(duì)象,淺拷貝拷貝的是指針.nonatomic非原子性,不考慮線程安全,優(yōu)點(diǎn)是效率高.
atomic原子性,有點(diǎn)是線程安全,缺點(diǎn)是效率低.
strong強(qiáng)引用,和MRC下的retain一樣.weak弱引用,類似MRC下的assign.但是要注意的是strong和weak都是修飾對(duì)象類型的屬性的,不能修飾基本數(shù)據(jù)類型.ARC下仍然使用assign修飾基本數(shù)據(jù)類型.
3.關(guān)于iOS多線程問題
仔細(xì)閱讀:http://www.cocoachina.com/ios/20150731/12819.html
4.提升UITableView性能的幾點(diǎn)建議
仔細(xì)閱讀:http://www.cocoachina.com/ios/20150729/12795.html
- 線程同步和異步的區(qū)別?
同步:一個(gè)線程要等待上一個(gè)線程執(zhí)行完之后才能執(zhí)行當(dāng)前的線程,生活中的例子(上廁所)店归。
異步:同時(shí)去做兩件或者多件事阎抒。比如邊聽歌邊看報(bào)。
7.堆和棧的區(qū)別消痛?
棧區(qū)(stack)--由編譯器自動(dòng)分配釋放且叁,存放函數(shù)的參數(shù)值、局部變量的值秩伞。先進(jìn)后出
堆區(qū)(heap)--一般由程序員分配釋放逞带。先進(jìn)先出
全局區(qū)(靜態(tài)區(qū))(static)--全局變量和靜態(tài)變量。程序結(jié)束后由系統(tǒng)釋放纱新。
文字常量區(qū)--常量字符串存放在這里展氓。程序結(jié)束后由系統(tǒng)釋放。
程序代碼區(qū)—存放函數(shù)體的二進(jìn)制文件脸爱。
- iOS類是否可以多繼承遇汞?
不可以,可以通過delegate和protocol和類別來實(shí)現(xiàn)類似多繼承簿废。
9.iOS本地?cái)?shù)據(jù)存儲(chǔ)都有哪幾種方式空入?iOS如何實(shí)現(xiàn)復(fù)雜對(duì)象的存儲(chǔ)?
- Write寫入方式:永久保存在磁盤中捏鱼。但是只支持NSString执庐、NSData酪耕、NSArray导梆、NSDictionary迂烁。 2.NSKeyedArchiver(歸檔)采用歸檔的形式來保存數(shù)據(jù)盟步,該數(shù)據(jù)對(duì)象需要遵守NSCod-ing協(xié)議,并且該對(duì)象對(duì)應(yīng)的類必須提供 encodeWithCoder:和initWithCoder:方法狰域。
3.SQLite(FMDB)注意FMDB不是數(shù)據(jù)庫,而是一個(gè)SQLITE管理框架.
4.CoreData切記coredata不是數(shù)據(jù)庫,他的存儲(chǔ)核心思想是托管對(duì)象,只是咱們經(jīng)常用的存儲(chǔ)文件為SQLite.還可以用XML,二進(jìn)制等方式.
10.iOS的動(dòng)態(tài)性
1.動(dòng)態(tài)類型兆览。如id類型塞关。實(shí)際上靜態(tài)類型因?yàn)槠涔潭ㄐ院涂深A(yù)知性而使用得更加廣泛。靜態(tài)類型是強(qiáng)類型小压,而動(dòng)態(tài)類型屬于弱類型。運(yùn)行時(shí)決定接收者仪搔。
- 動(dòng)態(tài)綁定蜻牢。讓代碼在運(yùn)行時(shí)判斷需要調(diào)用什么方法,而不是在編譯時(shí)髓削。與其他面向?qū)ο笳Z言一樣镀娶,方法調(diào)用和代碼并沒有在編譯時(shí)連接在一起梯码,而是在消息發(fā)送時(shí)才進(jìn)行連接。運(yùn)行時(shí)決定調(diào)用哪個(gè)方法儿奶。
- 動(dòng)態(tài)載入闯捎。讓程序在運(yùn)行時(shí)添加代碼模塊以及其他資源。用戶可以根據(jù)需要加載一些可執(zhí)行代碼和資源瓤鼻,而不是在啟動(dòng)時(shí)就加載所有組件茬祷〔⒒龋可執(zhí)行代碼中可以含有和程序運(yùn)行時(shí)整合的新類滚停。
11.深拷貝和淺拷貝的理解?
深拷貝拷貝的是內(nèi)容陪每,淺拷貝拷貝的是指針。深拷貝和淺拷貝最大的區(qū)別就是子類對(duì)象的地址是否改變挂签,如果子類對(duì)象的地址改變那么就是深拷貝饵婆。
12.什么是安全釋放
在對(duì)象dealloc中release之后再把指針置為nil
13.怎樣實(shí)現(xiàn)一個(gè)singleton戏售。
+(ZMYSingleton)sharedInstance{
staticLOSingletonsharedInstance=nil;
staticdispatch_once_tonceToken; //鎖
dispatch_once(&onceToken,^{
//最多調(diào)用一次
sharedInstance=[[ZMYSingletonalloc]init];
});
return sharedInstance;
}
13.RunLoop是什么灌灾?
一個(gè)RunLoop就是一個(gè)事件處理的循環(huán),用來不停的調(diào) 度工作以及處理輸入時(shí)間些己。使用runloop的目的是讓你的線程在有工作的時(shí)候忙于工作,而沒工作的時(shí)候處于休眠狀態(tài)嘿般。runloop的設(shè)計(jì)是為了減少 cpu無謂的空轉(zhuǎn)炉奴。每個(gè)開辟的線程都有一個(gè)Runloop,主線程的Runloop時(shí)默認(rèn)開啟的,咱們手動(dòng)開辟的子線程Runloop是默認(rèn)不開啟 的,如果需要開啟,需要調(diào)用API[[NSRunloopcurrentRunloop]run]開啟.最常見的需要開啟Runloop的是在 子線程里面調(diào)用計(jì)時(shí)器(NSTimer),如果不開啟runloop循環(huán)方法就不能正常執(zhí)行.
14.寫一個(gè)標(biāo)準(zhǔn)宏MIN,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)赛糟?
definekMIN(X,Y)((X)>(Y))?(Y):(X)
15.簡(jiǎn)述應(yīng)用程序按Home鍵進(jìn)入后臺(tái)時(shí)的生命周期虑灰,以及從后臺(tái)回到前臺(tái)時(shí)的生命周期痹兜?
進(jìn)入后臺(tái)生命周期走:
-(void)applicationWillResignActive:(UIApplication)application;
-(void)applicationDidEnterBackground:(UIApplication)application;
回到前臺(tái)生命周期走:
-(void)applicationWillEnterForeground:(UIApplication)application;
-(void)applicationDidBecomActive:(UIApplication)application;
16.ViewController的loadView,viewDidLoad,viewWillAppear,viewDidUnload,dealloc字旭、init分別是在什么時(shí)候調(diào) 用的崖叫?在自定義ViewController的時(shí)候這幾個(gè)函數(shù)里面應(yīng)該做什么工作?
loadView:沒有正在使用nib視圖頁面屈暗,子類將會(huì)創(chuàng)建自己的自定義視圖層
viewDidLoad:試圖被加載后調(diào)用
viewWillAppear:試圖即將出現(xiàn)的時(shí)候調(diào)用
viewDidUnload:當(dāng)系統(tǒng)內(nèi)存吃緊的時(shí)候會(huì)調(diào)用該方法,釋放掉當(dāng)前未在window中顯示的試圖和對(duì)應(yīng)的控制器
17.描述應(yīng)用程序的啟動(dòng)順序养叛。
1、程序入口main函數(shù)創(chuàng)建UIApplication實(shí)例和UIApplication代理實(shí)例
2爽室、在UIApplication代理實(shí)例中重寫啟動(dòng)方法淆攻,設(shè)置第一ViewController
3瓶珊、在第一ViewController中添加控件,實(shí)現(xiàn)對(duì)應(yīng)的程序界面筐高。
18.為什么寫代理的屬性都是assign而不是retain丑瞧?請(qǐng)舉例說明绊汹。
防止循環(huán)引用,
Teacherteacher=[[Teacheralloc]init];
Studentstudent=[[Studentalloc]init];t
eacher.delegate=student;
student.delegate=teacher;
在teacher中dealloc會(huì)release當(dāng)前的Delegate狐榔,就會(huì)觸發(fā)student對(duì)象release薄腻,繼而也會(huì)導(dǎo)致student執(zhí)行dealloc届案,在student中也會(huì)release自己的delegate楣颠,產(chǎn)生循環(huán)了。
19.UIImage初始化一張圖片有幾種方法弄贿?簡(jiǎn)述各自的優(yōu)缺點(diǎn)差凹。
1、從資源讀取,這個(gè)方法的圖片是從緩存里面獲取 的,先在緩存里面查看是不是有這個(gè)圖片,沒有的話將圖片添加進(jìn)緩存再使用.有的話直接使用緩存里面的.如果這張圖片用的次數(shù)比較多的話,建議使 用這種方式.缺點(diǎn)是效率低下.UIImageimage=[UIImageimageNamed:@”1.png”];
2.從手機(jī)本地讀取,比較第一種方式,這個(gè)事直接加 載圖片的.所以建議在圖片使用率低的圖片時(shí)使用這個(gè)方法. //讀取本地圖片非resourceNSStringaPath3=[NSStringstringWithFormat:@"%@/Documents/%@.jpg",NSHomeDirectory(),@"test"];[UIImageimageWithContentsOfFile:aPath3]
20.這段代碼有什么問題嗎:
@implementationPerson
-(void)setAge:(int)newAge{
self.age=newAge;
}
@end
死循環(huán)
21.用OC寫一個(gè)冒泡排序
NSMutableArray*array = [NSMutableArrayarrayWithArray:@[@"3",@"1",@"10",@"5",@"2",@"7",@"12",@"4",@"8"]];
for (int i =0; i < array.count;i ++) {
for (intj =0; j < array.count-1 - i; j++) {
if([[arrayobjectAtIndex:j]integerValue] > [[arrayobjectAtIndex:j +1]integerValue]) {
[arrayexchangeObjectAtIndex:jwithObjectAtIndex:j +1];
}
}
}
NSLog(@"%@",array);
22.簡(jiǎn)述你對(duì)UIView能庆、UIWindow和CALayer的理解
UIView繼承于UIResponder,UIResponder繼承于NSObject,UIView可以響應(yīng)用戶事件搁胆。
CALayer繼承于NSObject邮绿,所以 CALayer不能響應(yīng)事件船逮。 UIView構(gòu)建界面,UIView側(cè)重于對(duì)內(nèi)容的管理,CALayer側(cè)重于對(duì)內(nèi)容的繪制杂靶。 UIView是用來顯示內(nèi)容的吗垮,可以處理用戶事件凹髓;CALayer是用來繪制內(nèi)容的,對(duì)內(nèi)容進(jìn)行動(dòng)畫處理饵沧,依賴與UIView來進(jìn)行顯示狼牺,不能處理用戶事 件礼患。
23.frame和bounds區(qū)別:
仔細(xì)閱讀:http://blog.csdn.net/mad1989/article/details/8711697
24.寫一個(gè)完整的代理
25.分析json讶泰、xml的區(qū)別?json、xml解析方式的底層是如何處理的狼犯?
XML是標(biāo)準(zhǔn)通用標(biāo)記語言(SGML)的子集,非常適合Web傳輸宋舷。XML提供統(tǒng)一的方法來描述和交換獨(dú)立于應(yīng)用程序或供應(yīng)商的結(jié)構(gòu)化數(shù)據(jù)瓢姻。
JSON(JavaScriptObjectNotation)一種輕量級(jí)的數(shù)據(jù)交換格式幻碱,具有良好的可讀 和便于快速編寫的特性±芩唬可在不同平臺(tái)之間進(jìn)行數(shù)據(jù)交換蹦狂。JSON采用兼容性很高的朋贬、完全獨(dú)立于語言文本格式锦募,同時(shí)也具備類似于C語言的習(xí)慣(包括C, C++,C#,Java,JavaScript,Perl,Python等)體系的行為。這些特性使JSON成為理想 的數(shù)據(jù)交換語言鸥拧。
26.ViewController的didReceiveMemoryWarning是在什么時(shí)候被調(diào)用的富弦?默認(rèn)的操作是什么?
didReceiveMemoryWarning在出現(xiàn)內(nèi)存警告的時(shí)候執(zhí)行該方法腕柜,在該方法里面釋放掉暫時(shí)沒使用的可重用的對(duì)象矫废。這個(gè)方法不能手動(dòng)調(diào)用.
27.面向?qū)ο蟮娜筇卣鞅推耍⒆骱?jiǎn)單的介紹
封裝、繼承潭流、多態(tài)。
封裝:是把客觀事物封裝成抽象的類拆宛,隱藏內(nèi)部的實(shí)現(xiàn)浑厚,對(duì)外部提供接口根盒。
繼承:可以使用現(xiàn)有類的所有功能郑象,并且在無需重新編寫原來的類的情況下對(duì)這些功能進(jìn)行擴(kuò)展。
多態(tài):不同的對(duì)象以自己的方式響應(yīng)相同的的消息的能力叫做 多態(tài)盖矫,或者說父類指針指向子類對(duì)象<如UITableView的辈双,cellForRow方法湃望,返回值類型是UITbaleViewCell痰驱,但是你 返回的cell可以是你自定義的cell,在比如多個(gè)類里面都有同一個(gè)方法>
28.簡(jiǎn)單說一下懶加載
懶加載担映,又稱為延遲加載。通常用法官硝,你有一個(gè)UITextField類型的property氢架,簡(jiǎn)單定義為userNameTextField岖研,但是你不在初始化方法里為其alloc/init缎玫,它 就只是一個(gè)指針解滓,不會(huì)占用內(nèi)存。在訪問器里判斷此property的指針是否為空洼裤,若為空腮鞍,就alloc/init移国,這時(shí)才真正生成這個(gè)對(duì)象除非這個(gè)對(duì) 象被使用,否則它永遠(yuǎn)不會(huì)真正生成使碾,也就不會(huì)占用內(nèi)存票摇。
29.分別描述類目(categories)和延展(extensions)是什么矢门?以及兩者的區(qū)別祟剔?繼承和類目在實(shí)現(xiàn)中有何區(qū)別摩梧?為什么Category只能為對(duì)象添加方法障本,卻不能添加成員變量?
category類目:在不知道源碼的情況下為一個(gè)類擴(kuò)展方法案训,
extension:為一個(gè)類聲明私有方法和變量强霎。 繼承是創(chuàng)建了一個(gè)新的類蓉冈,而類別只是對(duì)類的一個(gè)擴(kuò)展,還是之前的類家夺。 類目的作用就是為已知的類添加方法拉馋。
-
import煌茴、#include和@class有什么區(qū)別
includec語言中引入一個(gè)頭文件,但是可能出現(xiàn)交叉編譯,
OC里面已經(jīng)沒有這個(gè)方式引入頭文件了,統(tǒng)一使用#import
import在OC中引入自己創(chuàng)建的頭文件
import””是引入自己創(chuàng)建類的頭文件
import<>是引入系統(tǒng)類的頭文件
import不會(huì)出現(xiàn)交叉編譯
@class對(duì)一個(gè)類進(jìn)行聲明矩乐,告訴編譯器有這個(gè)類散罕,但是類的定義什么的都不知道.
31.談?wù)勀銓?duì)MVC的理解笨使?為什么要用MVC硫椰?在Cocoa中MVC是怎么實(shí)現(xiàn)的萨蚕?你還熟悉其他的OC設(shè)計(jì)模式或別的設(shè)計(jì)模式嗎岳遥?
MVC是Model-VIew-Controller浩蓉,就 是模型-視圖-控制器,MVC把軟件系統(tǒng)分為三個(gè)部分:Model,View驾窟,Controller绅络。在cocoa中,你的程序中的每一個(gè) object(對(duì)象)都將明顯地僅屬于這三部分中的一個(gè)杉畜,而完全不屬于另外兩個(gè)此叠。model數(shù)據(jù)模型匾荆,view是對(duì)這些數(shù)據(jù)的顯 示牙丽,viewcontroller就是把model拿到view中顯示烤芦,起到model和view之間橋梁的作用析校。MVC可以幫助確保幫助實(shí)現(xiàn)程序最大程 度的可重用性智玻。各MVC元素彼此獨(dú)立運(yùn)作吊奢,通過分開這些元素,可以構(gòu)建可維護(hù)召边,可獨(dú)立更新的程序組建,提高代碼的重用性.
單例模式隧熙,delegate設(shè)計(jì)模式贞盯,target-action設(shè)計(jì)模式
32.字符串替換方法:
[stringstringByReplacingOccurrencesOfString:@"png"withString:@""]
33.對(duì)于語句NSString*testObject=[[NSDataalloc]init]; testObject在編譯時(shí)和運(yùn)行時(shí)分別是什么類型的對(duì)象沪饺?
編譯的時(shí)候是NSString類型随闽,運(yùn)行的時(shí)候是NSData類型
34.什么是沙盒(sandbox)?沙盒包含哪些文件攘烛,描述每個(gè)文件的使用場(chǎng)景坟漱。如何獲取這些文件的路徑芋齿?如何獲取應(yīng)用程序包中文件的路徑觅捆?
iOS應(yīng)用程序只能在為該改程序創(chuàng)建的文件系統(tǒng)中讀取文 件麻敌,不可以去其它地方訪問术羔,此區(qū)域被成為沙盒级历,所以所有的非代碼文件都要保存在此,例如圖像玩讳,圖標(biāo)锋边,聲音豆巨,映像往扔,屬性列表萍膛,文本文件等嚷堡。 默認(rèn)情況下,每個(gè)沙盒含有3個(gè)文件夾:Documents,Library和tmp沼琉。 Documents:蘋果建議將程序中建立的或在程序中瀏覽到的文件數(shù)據(jù)保存在該目錄下打瘪,iTunes備份和恢復(fù)的時(shí)候會(huì)包括此目錄 Library:存儲(chǔ)程序的默認(rèn)設(shè)置或其它狀態(tài)信息傻昙;
Library/Caches:存放緩存文件妆档,iTunes不會(huì)備份此目錄,此目錄下文件不會(huì)在應(yīng)用退出刪除
tmp:提供一個(gè)即時(shí)創(chuàng)建臨時(shí)文件的地方进泼。
iTunes在與iPhone同步時(shí),備份所有的Documents和Library文件逼纸。
iPhone在重啟時(shí)杰刽,會(huì)丟棄所有的tmp文件贺嫂。
- isKindOfClass第喳、isMemberOfClass作用分別是什么曲饱?
-(BOOL)isKindOfClass:classObj判斷是否是這個(gè)類或者是這個(gè)類子類的實(shí)例
-(BOOL)isMemberOfClass:classObj判斷是否是這個(gè)類的實(shí)例
36.http://blog.csdn.net/huifeidexin_1/article/details/7566226 - UITableView –UIScrollView –UIView – UIResponder - NSObject
答:Grand CentralDispatch簡(jiǎn)稱GCD解決多核并行運(yùn)算的一種方案
看代碼就行:
// Grand CentralDispatch簡(jiǎn)稱GCD技術(shù)
// Do any additional setup afterloading the view.
//dispatch_queue_tnewDispath =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//dispatch_async(newDispath,^{
//[selfdownloadImage];
// });
//#defineDISPATCH_QUEUE_PRIORITY_HIGH2
//#defineDISPATCH_QUEUE_PRIORITY_DEFAULT 0
//#defineDISPATCH_QUEUE_PRIORITY_LOW(-2)
//#defineDISPATCH_QUEUE_PRIORITY_BACKGROUNDINT16_MIN
/*dispatch queue分為下面三種:
- Serial:又稱為private dispatch queues扩淀,同時(shí)只執(zhí)行一個(gè)任務(wù)驻谆。Serial queue通常用于同步訪問特定的資源或數(shù)據(jù)氛谜。當(dāng)你創(chuàng)建多 個(gè)Serial queue時(shí)值漫,雖然它們各自是同步執(zhí)行的杨何,但Serial queue與Serial queue之間是并發(fā)執(zhí)行的沥邻。
- Concurrent: 又稱為global dispatch queue埃跷,可以并發(fā)地執(zhí)行多個(gè)任務(wù)邮利,但是執(zhí)行完成的順序是隨機(jī)的延届。
- Maindispatchqueue它是全局可用的serial queue方庭,它是在應(yīng)用程序主線程上執(zhí)行任務(wù)的
*/
// 一般GCD 可以如下操作
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
// 耗時(shí)的操作
dispatch_async(dispatch_get_main_queue(),^{
// 更新界面
});
});
[selfexampleDispatch];
/*
*系統(tǒng)給每一個(gè)應(yīng)用程序提供了三個(gè)concurrent dispatch queues头朱。
*這三個(gè)并發(fā)調(diào)度隊(duì)列是全局的项钮,它們只有優(yōu)先級(jí)的不同寄纵。
*因?yàn)槭侨值牟彼眨覀儾恍枰?chuàng)建。我們只需要通過使用函數(shù)dispath_get_global_queue去得到隊(duì)列
*/
dispatch_queue_tglobalQ =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
NSLog(@"global:%p",globalQ);
dispatch_queue_tmainQ =dispatch_get_main_queue();
NSLog(@"mainQ:%p",mainQ);
/*
*雖然dispatch queue是引用計(jì)數(shù)的對(duì)象恃鞋,但是以上兩個(gè)都是全局的隊(duì)列畅哑,不用retain或release水由。
*/
/*
*dispatch_group_async可以實(shí)現(xiàn)監(jiān)聽一組任務(wù)是否完成荠呐,完成后得到通知執(zhí)行其他的操作。
*這個(gè)方法很有用砂客,比如你執(zhí)行三個(gè)下載任務(wù)泥张,當(dāng)三個(gè)任務(wù)都下載完成后你才通知界面說完成的了。
*/
timeInt = 0;
[NSTimerscheduledTimerWithTimeInterval:1
target:self
selector:@selector(checkingTime)
userInfo:nil
repeats:YES];
[selfexampleDispath_group];
/*dispatch_barrier_async的使用
*dispatch_barrier_async是在前面的任務(wù)執(zhí)行結(jié)束后它才執(zhí)行鞠值,而且它后面的任務(wù)等它執(zhí)行完成之后才會(huì)執(zhí)行
*/
[selfexampleDispatch_barrier];
/*dispatch_apply
*執(zhí)行某個(gè)代碼片段N次媚创。
*/
dispatch_apply(5,globalQ, ^(size_t index) {
// 執(zhí)行5次
});
- 該問題涉及編譯器的“內(nèi)存對(duì)齊”問題:
現(xiàn)代計(jì)算機(jī)中內(nèi)存空間都是按照byte(字節(jié))劃分的彤恶,從 理論上講似乎對(duì)任何類型的變量的訪問可以從任何地址開始芒炼,但實(shí)際情況是在訪問特定變量的時(shí)候經(jīng)常在特定的內(nèi)存地址訪問,這就需要各類型數(shù)據(jù)按照一定的規(guī)則 在空間上排列唤锉,而不是順序的一個(gè)接一個(gè)的排放株憾,這就是對(duì)齊。
對(duì)齊的作用和原因:各個(gè)硬件平臺(tái)對(duì)存儲(chǔ)空間的處理上有很大 的不同贝奇。一些平臺(tái)對(duì)某些特定類型的數(shù)據(jù)只能從某些特定地址開始存取毕源。其他平臺(tái)可能沒有這種情況,但是最常見的是如果不按照適合其平臺(tái)的要求對(duì)數(shù)據(jù)存放進(jìn)行 對(duì)齊冻璃,會(huì)在存取效率上帶來損失。比如有些平臺(tái)每次讀都是從偶地址開始拍埠,如果一個(gè)int型(假設(shè)為32位)如果存放在偶地址開始的地方擦耀,那么一個(gè)讀周期就 可以讀出分瘾,而如果存放在奇地址開始的地方,就可能會(huì)需要2個(gè)讀周期上岗,并對(duì)兩次讀出的結(jié)果的高低字節(jié)進(jìn)行拼湊才能得到該int數(shù)據(jù)。顯然在讀取效率上下降很 多。這也是空間和時(shí)間的博弈痴脾。
通常买窟,我們寫程序的時(shí)候,不需要考慮對(duì)齊問題亏推。編譯器會(huì)替我們選擇適合目標(biāo)平臺(tái)的對(duì)齊策略。當(dāng)然芽狗,我們也可以通知給編譯器傳遞預(yù)編譯指令而改變對(duì)指定數(shù)據(jù)的對(duì)齊方法攻晒。
但是芯砸,正因?yàn)槲覀円话悴恍枰P(guān)心這個(gè)問題,所以因?yàn)榫庉嬈鲗?duì)數(shù)據(jù)存放做了對(duì)齊,而我們不了解的話,常常會(huì)對(duì)一些問題感到迷惑。最常見的就是struct數(shù)據(jù)結(jié)構(gòu)的sizeof結(jié)果宅静,出乎意料纤垂。
對(duì)于結(jié)構(gòu)體來說逃糟,按成員中所占字節(jié)最大的是float類型菇肃,占用4個(gè)字節(jié),一共有3個(gè)成員,所以總的占用字節(jié)為:4*3=12.可通過編譯器命令來設(shè)定:
progmapack(2)
40.TCP:TransmissionControlProtocol傳 輸控制協(xié)議TCP是一種面向連接(連接導(dǎo)向)的飞蹂、可靠的、基于字節(jié)流的運(yùn)輸層(Transportlayer)通信協(xié)議惊窖,由IETF的RFC793說 明(specified)嘴秸。UDP是UserDatagramProtocol的簡(jiǎn)稱凭疮,中文名是用戶數(shù)據(jù)包協(xié)議,是OSI參考模型中一種無連接 的傳輸層協(xié)議衰腌,提供面向事務(wù)的簡(jiǎn)單不可靠信息傳送服務(wù),IETFRFC768是UDP的正式規(guī)范欣簇。
面向連接:是指通信雙方在通信時(shí),要事先建立一條通信線路,其有三個(gè)過程:建立連接衫仑、使用連接和釋放連接。電話系統(tǒng)是一個(gè)面向連接的模式,撥號(hào)苏研、通話轧飞、掛機(jī);TCP協(xié)議就是一種面向連接的協(xié)議。
面向無連接:是指通信雙方不需要事先建立一條通信線路切黔,而是把每個(gè)帶有目的地址的包(報(bào)文分組)送到線路上驱显,由系統(tǒng)自主選定路線進(jìn)行傳輸。郵政系統(tǒng)是一個(gè)無連接的模式翠桦,天羅地網(wǎng)式的選擇路線,天女散花式的傳播形式;IP、UDP協(xié)議就是一種無連接協(xié)議渠羞。
- 注意問的是應(yīng)用層協(xié)議屯吊,有些同學(xué)直接答了七層模型蔽介。
在開放系統(tǒng)互連(OSI)模型中的最高層外臂,為應(yīng)用程序提供服務(wù)以保證通信炭菌,但不是進(jìn)行通信的應(yīng)用程序本身第练。
Telnet協(xié)議是TCP/IP協(xié)議族中的一員,是Internet遠(yuǎn)程登陸服務(wù)的標(biāo)準(zhǔn)協(xié)議和主要方式客蹋。它為用戶提供了在本地計(jì)算機(jī)上完成遠(yuǎn)程主機(jī)工作的能力漱办。
FTP文件傳輸協(xié)議是TCP/IP網(wǎng)絡(luò)上兩臺(tái)計(jì)算機(jī)傳送文件的協(xié)議咐刨,F(xiàn)TP是在TCP/IP網(wǎng)絡(luò)和INTERNET上最早使用的協(xié)議之一畜挥,它屬于網(wǎng)絡(luò)協(xié)議組的應(yīng)用層。
超文本傳輸協(xié)議(HTTP-Hypertexttransferprotocol)是分布式话告,協(xié)作式吓著,超媒體系統(tǒng)應(yīng)用之間的通信協(xié)議纺裁。是萬維網(wǎng)(worldwideweb)交換信息的基礎(chǔ)漱受。
SMTP(SimpleMailTransferProtocol)即簡(jiǎn)單郵件傳輸協(xié)議,它是一組用于由源地址到目的地址傳送郵件的規(guī)則派敷,由它來控制信件的中轉(zhuǎn)方式差导,它幫助每臺(tái)計(jì)算機(jī)在發(fā)送或中轉(zhuǎn)信件時(shí)找到下一個(gè)目的地貌笨。
時(shí)間協(xié)議(TIMEprotocol)是一個(gè)在RFC868內(nèi)定義的網(wǎng)絡(luò)協(xié)議遭商。它用作提供機(jī)器可讀的日期時(shí)間資訊祠汇。
DNS是域名系統(tǒng) (Domain Name System) 的縮寫菜拓,是因特網(wǎng)的一項(xiàng)核心服務(wù),它作為可以將域名和IP地址相互映射的一個(gè)分布式數(shù)據(jù)庫践叠。
SNMP(Simple Network ManagementProtocol,簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議)的前身是簡(jiǎn)單網(wǎng)關(guān)監(jiān)控協(xié)議(SGMP),用來對(duì)通信線路進(jìn)行管理。
TFTP(Trivial File Transfer Protocol,簡(jiǎn)單文件傳輸協(xié)議)是TCP/IP協(xié)議族中的一個(gè)用來在客戶機(jī)與服務(wù)器之間進(jìn)行簡(jiǎn)單文件傳輸?shù)膮f(xié)議荞雏,提供不復(fù)雜、開銷不大的文件傳輸服務(wù)。端口號(hào)為69。
42.static關(guān)鍵字的作用
靜態(tài)全局變量
優(yōu)點(diǎn):
1、節(jié)省內(nèi)存匆背。靜態(tài)變量只存儲(chǔ)一處充包,但供所有對(duì)象使用副签。
2、它的值是可以更新的基矮。
3淆储、可提高時(shí)間效率。只要某個(gè)對(duì)象對(duì)靜態(tài)變量更新一次家浇,所有的對(duì)象都能訪問更新后的值本砰。
43.iOS系統(tǒng)框架分為幾層,分別是什么
程序開發(fā)提供了各種有用的框架钢悲,并且大部分與用戶界面有關(guān)点额,本質(zhì)上來說它負(fù)責(zé)用戶在iOS設(shè)備上的觸摸交互操作舔株。