關(guān)鍵詞/關(guān)鍵類

關(guān)鍵詞/關(guān)鍵類

1.#import跟#include有什么區(qū)別,@class呢冠跷,#import<>跟#import<>有什么區(qū)別伦意?

#include c語言中引入一個(gè)頭文件咒唆,但是可能出現(xiàn)交叉編譯

#import在OC中引入自己創(chuàng)建的頭文件#import””或者系統(tǒng)框架#import<>。

#import不會(huì)出現(xiàn)交叉編譯,@class對一個(gè)類進(jìn)行聲明茶鹃,告訴編譯器有這個(gè)類涣雕,但是類的定義什么的都不知道

2描述一下KVO和KVC?

Key-Value Observing (簡寫為KVO):當(dāng)指定的對象的屬性被修改了闭翩,允許對象接受到通知的機(jī)制挣郭。每次指定的被觀察對象的屬性被修改的時(shí)候,KVO都會(huì)自動(dòng)的去通知相應(yīng)的觀察者疗韵。

KVC是KeyValue Coding的簡稱兑障,它是一種可以直接通過字符串的名字(key)來訪問類屬性的機(jī)制。而不是通過調(diào)用Setter蕉汪、Getter方法訪問流译。

3.類目和繼承地區(qū)別

1.類別是對方法的擴(kuò)展,不能添加成員變量者疤。繼承可以在原來父類的成員變量的基礎(chǔ)上福澡,添加新的成員變量

2.類別只能添加新的方法,不能修改和刪除原來的方法驹马。繼承可以增加革砸、修改和刪除方法。

3.類別不提倡對原有的方法進(jìn)行重載糯累。繼承可以通過使用super對原來方法進(jìn)行重載算利。

4.類別可以被繼承寇蚊,如果一個(gè)父類中定義了類別笔时,那么其子類中也會(huì)繼承此類別。

5.什么是懶加載?在使用懶加載時(shí)的注意事項(xiàng)是什么仗岸?

答:所謂的懶加載指的是延遲創(chuàng)建對象允耿,只有當(dāng)需要的時(shí)候才創(chuàng)建對象。在真正開發(fā)的過程中其實(shí)懶加載就是重寫getter方法扒怖。在getter方法的內(nèi)部较锡,實(shí)現(xiàn)對象的創(chuàng)建,如果對象為nil才創(chuàng)建盗痒,如果不為nil蚂蕴,直接返回對象低散。在真正使用懶加載時(shí)需要注意的是當(dāng)?shù)谝淮问褂脤ο髸r(shí),需要調(diào)用self.因?yàn)橹挥羞@樣才能調(diào)用對應(yīng)的getter方法骡楼,對象才會(huì)被創(chuàng)建熔号。

6.簡述你對UIView、UIWindow鸟整、CALayer的理解引镊。

答:CALayer是圖層類,本身可以顯示的篮条,但是不能響應(yīng)事件弟头。

UIView是iOS系統(tǒng)中界面元素的基礎(chǔ),所有的界面元素都繼承自它涉茧。事件的處理由它來執(zhí)行赴恨,但是顯示其實(shí)是由其對應(yīng)的layer層來操作的,UIView內(nèi)嵌了一個(gè)layer伴栓,layer顯示內(nèi)容伦连,UIView本身增加了事件處理的功能。

UIWindow繼承自UIView挣饥,主要的作用是作為窗口呈現(xiàn)其他的視圖除师。而且一個(gè)應(yīng)用程序一般情況下只有一個(gè)窗口。

7. id聲明的對象有什么特性扔枫?

答:id是任意對象類型的汛聚,不能表示基本類型。id類型是通用指針類型短荐,因?yàn)橥ㄟ^指針倚舀,也就是內(nèi)存地址來引用對象,所以可以將任意對象賦值給id類型的對象忍宋。返回id類型值的方法是返回指向內(nèi)存中某對象的指針痕貌。然后可以將該值賦給任何對象變量(強(qiáng)制類型轉(zhuǎn)換即可)。因?yàn)闊o論在哪里糠排,對象總是攜帶它的isa成員舵稠。所以即使將它存儲(chǔ)在id類型的通用對象變量中,也總是可以確定它的真實(shí)類型入宦,id是多態(tài)的一種體現(xiàn)

7.@synthesize和@dynamic有什么區(qū)別哺徊?

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

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

(3)@dynamic告訴編譯器:屬性的setter與getter方法由用戶自己實(shí)現(xiàn)巢钓,不自動(dòng)生成。(當(dāng)然對于readonly的屬性只需提供getter即可)疗垛。假如一個(gè)屬性被聲明為@dynamic var症汹,然后你沒有提供@setter方法和@getter方法,編譯的時(shí)候沒問題继谚,但是當(dāng)程序運(yùn)行到instance.var = someVar烈菌,由于缺setter方法會(huì)導(dǎo)致程序崩潰阵幸;或者當(dāng)運(yùn)行到someVar = instance.var時(shí)花履,由于缺getter方法同樣會(huì)導(dǎo)致崩潰。編譯時(shí)沒問題挚赊,運(yùn)行時(shí)才執(zhí)行相應(yīng)的方法诡壁,這就是所謂的動(dòng)態(tài)綁定。@dynamic可用于在分類中添加屬性(需要用到objc_getAssociatedObject和objc_setAssociatedObject函數(shù))荠割。

3.在Category中本身不允許為已有的類添加新的屬性或者成員變量妹卿,你有沒有其他的方法可以在category中添加屬性或者是成員變量?

答:一種方法就是使用runtime.h中的objc_getAssociatedObject和objc_setAssociatedObject來訪問和生成關(guān)聯(lián)對象蔑鹦。例如為NSObject添加一個(gè)類目夺克,分類中添加一個(gè)屬性。代碼如下所示:

NSObject+Test.h文件

#import

@interface NSObject (Test)

@property (nonatomic, strong) NSString *test;

@end

NSObject+Test.m文件

#import “NSObject+Test.h"

#import

static const void *instanceNameKey = &instanceNameKey;

@implementation NSObject (Test)

@dynamic test;

- (NSString *)test

{

return objc_getAssociatedObject(self, instanceNameKey);

}

- (void)setTest:(NSString *)test

{

objc_setAssociatedObject(self, instanceNameKey, test, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

@end

15.在oc中引入頭文件使用的關(guān)鍵字是哪一個(gè)嚎朽?能在c語言文件中使用嗎铺纽?

答:#import關(guān)鍵字可以在OC中使用,不能在C文件中使用哟忍,#include可以在C和OC中使用狡门。

16.#import與#include相比,好處是什么锅很?

答:#import確定一個(gè)文件只能被導(dǎo)入一次其馏,避免的重復(fù)導(dǎo)入的問題,使用#include一定要注意重復(fù)導(dǎo)入的問題爆安。所以在OC中都使用#import來引用頭文件叛复。

17.#import<>和#import””的區(qū)別是什么?

答:#import<>用于對系統(tǒng)文件的引用扔仓,編譯器會(huì)在系統(tǒng)文件目錄中去查找文件

#import””用于對自定義的文件的引用褐奥,編譯器首先回去用戶目錄下查找,然后去安裝目錄当辐,最后去系統(tǒng)目錄中查找文件抖僵。

18.@class的作用是什么?

答:@class的作用是告訴編譯器有@class后面的內(nèi)容是一個(gè)類名缘揪。只是告訴編譯器存在這么一個(gè)類耍群,類具體包含哪些方法义桂,屬性和變量的并沒有告訴編譯器。一般在類的頭文件中使用@class來引入其他類蹈垢。

55.簡述你對UIView慷吊、UIWindow、CALayer的理解曹抬。

答:CALayer是圖層類溉瓶,本身可以顯示的,但是不能響應(yīng)事件谤民。

UIView是iOS系統(tǒng)中界面元素的基礎(chǔ)堰酿,所有的界面元素都繼承自它。事件的處理由它來執(zhí)行张足,但是顯示其實(shí)是由其對應(yīng)的layer層來操作的触创,UIView內(nèi)嵌了一個(gè)layer,layer顯示內(nèi)容为牍,UIView本身增加了事件處理的功能哼绑。

UIWindow繼承自UIView,主要的作用是作為窗口呈現(xiàn)其他的視圖碉咆。而且一個(gè)應(yīng)用程序一般情況下只有一個(gè)窗口抖韩。

2.Sizeof和strlen的區(qū)別和聯(lián)系?

sizeof(...)是運(yùn)算符疫铜,在頭文件中typedef為unsigned int茂浮,其值在編譯時(shí)即計(jì)算好了,參數(shù)可以是數(shù)組块攒、指針励稳、類型、對象囱井、函數(shù)等驹尼。

它的功能是:獲得保證能容納實(shí)現(xiàn)所建立的最大對象的字節(jié)大小。

由于在編譯時(shí)計(jì)算庞呕,因此sizeof不能用來返回動(dòng)態(tài)分配的內(nèi)存空間的大小新翎。實(shí)際上,用sizeof來返回類型以及靜態(tài)分配的對象住练、結(jié)構(gòu)或數(shù)組所占的空間地啰,返回值跟對象、結(jié)構(gòu)讲逛、數(shù)組所存儲(chǔ)的內(nèi)容沒有關(guān)系亏吝。

strlen(...)是函數(shù),要在運(yùn)行時(shí)才能計(jì)算盏混。參數(shù)必須是字符型指針(char*)蔚鸥。當(dāng)數(shù)組名作為參數(shù)傳入時(shí)惜论,實(shí)際上數(shù)組就退化成指針了。

它的功能是:返回字符串的長度止喷。該字符串可能是自己定義的馆类,也可能是內(nèi)存中隨機(jī)的,該函數(shù)實(shí)際完成的功能是從代表該字符串的第一個(gè)地址開始遍歷弹谁,直到遇到結(jié)束符NULL乾巧。返回的長度大小不包括NULL。

區(qū)別和聯(lián)系:

1.sizeof操作符的結(jié)果類型是size_t预愤,它在頭文件中typedef為unsigned int類型沟于。

該類型保證能容納實(shí)現(xiàn)所建立的最大對象的字節(jié)大小。

2.sizeof是運(yùn)算符鳖粟,strlen是函數(shù)社裆。

3.sizeof可以用類型做參數(shù),strlen只能用char*做參數(shù)向图,且必須是以''\0''結(jié)尾的赊级。

sizeof還可以用函數(shù)做參數(shù)的圆,比如:

short f();

printf("%d\n", sizeof(f()));

輸出的結(jié)果是sizeof(short),即2茅诱。

4.數(shù)組做sizeof的參數(shù)不退化金句,傳遞給strlen就退化為指針了檩赢。

5.大部分編譯程序 在編譯的時(shí)候就把sizeof計(jì)算過了 是類型或是變量的長度這就是sizeof(x)可以用來定義數(shù)組維數(shù)的原因

char str[20]="0123456789";

int a=strlen(str); //a=10;

int b=sizeof(str); //而b=20;

6.strlen的結(jié)果要在運(yùn)行的時(shí)候才能計(jì)算出來,時(shí)用來計(jì)算字符串的長度违寞,不是類型占內(nèi)存的大小贞瞒。

7.sizeof后如果是類型必須加括弧,如果是變量名可以不加括弧趁曼。這是因?yàn)閟izeof是個(gè)操作符不是個(gè)函數(shù)军浆。

8.當(dāng)適用了于一個(gè)結(jié)構(gòu)類型時(shí)或變量,sizeof返回實(shí)際的大小挡闰,

當(dāng)適用一靜態(tài)地空間數(shù)組乒融,sizeof歸還全部數(shù)組的尺寸。

sizeof操作符不能返回動(dòng)態(tài)地被分派了的數(shù)組或外部的數(shù)組的尺寸

3.do while和while do的區(qū)別摄悯?

while語句是先測試條件再執(zhí)行語句,條件不符后終止

do while語句是先執(zhí)行語句再測試條件,條件不符后終止,所以do while循環(huán)至少執(zhí)行一次

15赞季、const意味著”只讀”,關(guān)鍵字const什么含義?下面的聲明都是什么意思?

const int a;

int const a;

const int *a;

int * const a;

int const * a const;

前兩個(gè)的作?用是?一樣,a是?一個(gè)常整型數(shù)。第三個(gè)意味著a是?一個(gè)指向常整型數(shù)的指針(也就是,整型數(shù)是不可修改的,但指針可以)奢驯。第四個(gè)意思a是?一個(gè)指向整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是可以修改的,但指針是不可修改的)申钩。最后?一個(gè)意味著a是?一個(gè)指向常整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是不可修改的,同時(shí)

指針也是不可修改的)。

欲阻?止?一個(gè)變量被改變,可以使?用const關(guān)鍵字瘪阁。在定義該const變量時(shí),通常需要對它進(jìn)?行初

始化,因?yàn)橐院缶蜎]有機(jī)會(huì)再去改變它了;

(2)對指針來說,可以指定指針本?身為const,也可以指定指針?biāo)傅臄?shù)據(jù)為const,或?二者同時(shí)指

定為const;

(3)在?一個(gè)函數(shù)聲明中,const可以修飾形參,表明它是?一個(gè)輸?入?yún)?shù),在函數(shù)內(nèi)部不

能改變其值;

(4)對于類的成員函數(shù),若指定其為const類型,則表明其是?一個(gè)常函數(shù),不能修改類的成員變量;

(5)對于類的成員函數(shù),有時(shí)候必須指定其返回值為const類型,以使得其返回值不 為“左值”撒遣。

4.關(guān)鍵字volatile有什么含義断盛?

一個(gè)定義為volatile的變量是說這變量可能會(huì)被意想不到地改變,這樣愉舔,編譯器就不會(huì)去假設(shè)這個(gè)變量的值了钢猛。精確地說就是,優(yōu)化器在用到

這個(gè)變量時(shí)必須每次都小心地重新讀取這個(gè)變量的值轩缤,而不是使用保存在寄存器里的備份命迈。下面是volatile變量的幾個(gè)例子:

? 并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器)

? 一個(gè)中斷服務(wù)子程序中會(huì)訪問到的非自動(dòng)變量(Non-automatic variables)

? 多線程應(yīng)用中被幾個(gè)任務(wù)共享的變量

? 一個(gè)參數(shù)既可以是const還可以是volatile嗎?解釋為什么火的。

? 一個(gè)指針可以是volatile嗎壶愤?解釋為什么。

下面是答案:

? 是的馏鹤。一個(gè)例子是只讀的狀態(tài)寄存器征椒。它是volatile因?yàn)樗赡鼙灰庀氩坏降馗淖儭K莄onst因?yàn)槌绦虿粦?yīng)該試圖去修改它湃累。

? 是的勃救。盡管這并不很常見。一個(gè)例子是當(dāng)一個(gè)中服務(wù)子程序修該一個(gè)指向一個(gè)buffer的指針時(shí)治力。

6蒙秒、nil,NSNULL,NULL區(qū)別

nil定義一個(gè)實(shí)例為空,指向oc中對象的空指針.是對objective c id對象賦空值,對于objective c集合類對象 比如數(shù)組對象宵统,字典對象晕讲,當(dāng)我們不需要再使用他們的時(shí)候,對他們r(jià)elease的同時(shí)最好也把他們賦值為nil马澈,這樣確保安全性瓢省,如果不賦值nil,可能導(dǎo)致程序崩潰

NSNull類定義了一個(gè)單例對象用于表示集合對象的空值

集合對象無法包含nil作為其具體值痊班,如NSArray勤婚、NSSet和NSDictionary。相應(yīng)地辩块,nil值用一個(gè)特定的對象NSNull來表示蛔六。NSNull提供了一個(gè)單一實(shí)例用于表示對象屬性中的的nil值。默認(rèn)的實(shí)現(xiàn)方法中废亭,dictionaryWithValuesForKeys:和setValuesForKeysWithDictionary:自動(dòng)地將NSNull和nil相互轉(zhuǎn)換国章,因此您的對象不需要進(jìn)行NSNull的測試操作。

NULL可以用在C語言的各種指針上,在Objective-C里豆村,nil對象被設(shè)計(jì)來跟NULL空指針關(guān)聯(lián)的液兽。他們的區(qū)別就是nil是一個(gè)對象,而NULL只是一個(gè)值。而且我們對于nil調(diào)用方法四啰,不會(huì)產(chǎn)生crash或者拋出異常宁玫。

8、NSDictionary和NSMutableDictionary的區(qū)別柑晒,是有序還是無序(追問:可以排序嗎欧瘪?如何排序,最好代碼實(shí)現(xiàn))

NSDictionary是不可變的對象匙赞,NSMutableDictionary是可變對象佛掖,可以進(jìn)行添加和刪除操作。

是無序的

排序的話可以這樣做:

1.獲取所有的key

NSArray *myKeys = [myDictionary allKeys];

2.對key進(jìn)行排序

NSArray *sortedKeys = [myKeys sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

3.按照key獲取對象

id firstObject = [myDictionary objectForKey: [sortedKeys objectAtIndex:0]];

keysSortedByValueUsingSelector/keysSortedByValueUsingComparator通過使用指定SEL或NSComarator來對allKeys進(jìn)行排序涌庭,然后通過objectsForKeys取出排序后的鍵-值對芥被。

5、內(nèi)存中的棧和堆的區(qū)別是什么坐榆?哪些數(shù)據(jù)在棧上哪些數(shù)據(jù)在堆上拴魄?

(1)管理方式:對于棧來講,是由編譯器自動(dòng)管理,無需我們手工控制;對于堆來說,釋放工作由程序員控制,容易產(chǎn)生memory leak。

(2)申請大小:能從棧獲得的空間較小,堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域席镀。堆的大小受限于計(jì)算機(jī)系統(tǒng)中 有效的虛擬內(nèi)存匹中。由此可見,堆獲得的空間比較靈活,也比較大。

(3)碎片問題:對于堆來講,頻繁的new/delete勢必會(huì)造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低愉昆。 對于棧來講,則不會(huì)存在這個(gè)問題,因?yàn)闂J窍冗M(jìn)后出的隊(duì)列,他們是如此的一一對應(yīng),以至于永遠(yuǎn)都不可能有一個(gè)內(nèi)存塊 從棧中間彈出

(4)分配方式:堆都是動(dòng)態(tài)分配的,沒有靜態(tài)分配的堆职员。棧有2種分配方式:靜態(tài)分配和動(dòng)態(tài)分配。靜態(tài)分配是編譯器完成 的,比如局部變量的分配跛溉。動(dòng)態(tài)分配由alloca函數(shù)進(jìn)行分配,但是棧的動(dòng)態(tài)分配和堆是不同的,他的動(dòng)態(tài)分配是由編譯器 進(jìn)行釋放,無需我們手工實(shí)現(xiàn)。

(5)分配效率:棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)會(huì)在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧 都有專門的指令執(zhí)行,這就決定了棧的效率比較高扮授。堆則是C/C++函數(shù)庫提供的,它的機(jī)制是很復(fù)雜的芳室。

在函數(shù)體中定義的變量通常是在棧上,用malloc, calloc, realloc等分配內(nèi)存的函數(shù)分配得到的就是在堆上刹勃。

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

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

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

意思就是說我有個(gè)A對象,復(fù)制一份后得到A_copy對象后,對于淺復(fù)制來說,A和A_copy指向的是同一 個(gè)內(nèi)存資源,復(fù)制的只不過是是一個(gè)指針,對象本身資源 還是只有一份,那如果我們對A_copy執(zhí)行了修改操作,那么發(fā)現(xiàn)A引用的對象同樣被修改,這其實(shí)違背 了我們復(fù)制拷貝的一個(gè)思想荔仁。深復(fù)制就好理解了,內(nèi)存中存在了

兩份獨(dú)立對象本身伍宦。

用網(wǎng)上一哥們通俗的話將就是:

淺復(fù)制好比你和你的影子,你完蛋,你的影子也完蛋

深復(fù)制好比你和你的克隆人,你完蛋,你的克隆人還活著。

深淺拷貝前提是:是實(shí)現(xiàn)NSCopying或者NSMutableCopying協(xié)議乏梁。

淺拷貝只是復(fù)制對象本身次洼,對象的屬性和包含的對象不做復(fù)制。

深拷貝則對對象本身復(fù)制遇骑,同時(shí)對對象的屬性也進(jìn)行復(fù)制卖毁。

深淺拷貝的本質(zhì)區(qū)別是對象或者對象屬性的內(nèi)存地址是否一樣,一樣則為淺拷貝落萎,不一樣則為深拷貝亥啦。

Foundation框架支持復(fù)制的類炭剪,默認(rèn)是淺拷貝。其中對Foundation中不可變的對象進(jìn)行copy時(shí)作用相當(dāng)于retain翔脱。

而如果是mutablecopy時(shí)奴拦,無論對象是否可變,副本是可變的届吁,并且實(shí)現(xiàn)了真正意義上的copy错妖。如果對可變對象進(jìn)行copy,

副本對象是不可變的瓷产,同樣是真正意義上的copy站玄。

12readwrite,readonly,assign,retain,copy,nonatomic屬性的作?

@property是?一個(gè)屬性訪問聲明,擴(kuò)號(hào)內(nèi)?支持以下?幾個(gè)屬性: 1,getter=getterName,setter=setterName,設(shè)置setter與getter的?方法名2,readwrite,readonly,設(shè)置可供訪問級(jí)別2,assign,setter?方法直接賦值,不進(jìn)?行任何retain操作,為了解決原類型與環(huán)循引?用問題3,retain,setter?方法對參數(shù)進(jìn)?行release舊值再retain新值,所有實(shí)現(xiàn)都是這個(gè)順序(CC上有相關(guān)資料) 4,copy,setter?方法進(jìn)?行Copy操作,與retain處理流程?一樣,先舊值release,再Copy出新的對象, retainCount為1。這是為了減少對上下?文的依賴?而引?入的機(jī)制濒旦。copy是在你不希望a和b共享?一塊內(nèi)存時(shí)會(huì)使?用到株旷。a和b各?自有?自?己的內(nèi)存。5,nonatomic,?非原?子性訪問,不加同步,多線程并發(fā)訪問會(huì)提?高性能尔邓。注意,如果不加此屬性,則 默認(rèn)是兩個(gè)訪問?方法都為原?子型事務(wù)訪問晾剖。鎖被加到所屬對象實(shí)例級(jí)(我是這么理解的...)。atomic和nonatomic?用來決定編譯器?生成的getter和setter是否為原?子操作梯嗽。在多線程環(huán)境下,原?子操作 是必要的,否則有可能引起錯(cuò) 誤的結(jié)果齿尽。

property中屬性retain,copy,assgin的含義分別是什么?有什么區(qū)別灯节?將其轉(zhuǎn)換成get/set方法怎么做循头?有什么注意事項(xiàng)?

assign: 簡單賦值炎疆,不更改索引計(jì)數(shù)(Reference Counting)卡骂。

copy: 建立一個(gè)索引計(jì)數(shù)為1的對象,然后釋放舊對象

retain:釋放舊的對象形入,將舊對象的值賦予輸入對象全跨,再提高輸入對象的索引計(jì)數(shù)為1

使用assign:對基礎(chǔ)數(shù)據(jù)類型 (NSInteger,CGFloat)和C數(shù)據(jù)類型(int, float, double, char,等等)

使用copy: 對NSString

使用retain: 對其他NSObject和其子類

retain表示持有特性亿遂,setter方法將傳入?yún)?shù)先保留浓若,再賦值,傳入?yún)?shù)的retaincount會(huì)+1;

- (void)setInstance:(id)instance{

if (_instance != instance) {

[_instance release];

_instance = [instance retain];

}

}

copy表示賦值特性蛇数,setter方法將傳入對象復(fù)制一份挪钓;需要完全一份新的變量時(shí)。

- (void)setInstance:(id)instance{

if (_instance != instance) {

[_instance release];

_instance = [instance copy];

}

}

assign是賦值特性苞慢,setter方法將傳入?yún)?shù)賦值給實(shí)例變量诵原;僅設(shè)置變量時(shí);

- (void)setInstance:(id)instance{

if (_instance != instance) {

_instance = instance;

}

}

7、setValue和setObject區(qū)別

在使用NSMutableDictionary的時(shí)候經(jīng)常會(huì)使用setValue forKey與setObject forKey绍赛,他們經(jīng)常是可以交互使用的蔓纠,代碼中經(jīng)常每一種的使用都有。

他們2者的區(qū)別就是:

1吗蚌、setObject:forkey:中value是不能夠?yàn)閚il的腿倚,不然會(huì)報(bào)錯(cuò)。

setValue:forKey:中value能夠?yàn)閚il蚯妇,但是當(dāng)value為nil的時(shí)候敷燎,會(huì)自動(dòng)調(diào)用removeObject:forKey方法

2、setValue:forKey:中key的參數(shù)只能夠是NSString類型箩言,而setObject:forKey:的可以是任何類型

3硬贯、setObject:forKey:方法NSMutabledictionary特有的,而

setValue:forKey:方法是KVC(鍵-值編碼)的主要方法。

陨收、類別和擴(kuò)展

8饭豹、聲明并實(shí)現(xiàn)一個(gè)cotegory為UIView添加addNewView方法

.h

@interface UIView (AddNewView)

- (void)addNewView:(UIView *)view;

@end

.m

#import "UIView+AddNewView.h"

@implementation UIView (AddNewView)

- (void)addNewView:(UIView *)view

{

[self addSubview:view];

}

@end

9)類別和類擴(kuò)展的區(qū)別

category和extensions的不同在于后者可以添加屬性。另外后者添加的?方法是必須要實(shí)現(xiàn)的务漩。extensions可以認(rèn)為是?一個(gè)私有的Category拄衰。

9.原子(atomic)跟非原子(non-atomic)屬性有什么區(qū)別?

①. atomic提供多線程安全。是防止在寫未完成的時(shí)候被另外一個(gè)線程讀取饵骨,造成數(shù)據(jù)錯(cuò)誤

②. non-atomic:在自己管理內(nèi)存的環(huán)境中翘悉,解析的訪問器保留并自動(dòng)釋放返回的值,如果指定了nonatomic居触,那么訪問器只是簡單地返回這個(gè)值妖混。

12.類別的作用?繼承和類別在實(shí)現(xiàn)中有何區(qū)別?

category可以在不獲悉,不改變原來代碼的情況下往里面添加新的方法轮洋,只能添加源葫,不能刪除修改。

并且如果類別和原來類中的方法產(chǎn)生名稱沖突砖瞧,則類別將覆蓋原來的方法,因?yàn)轭悇e具有更高的優(yōu)先級(jí)嚷狞。

類別主要有3個(gè)作用:

(1)將類的實(shí)現(xiàn)分散到多個(gè)不同文件或多個(gè)不同框架中块促。

(2)創(chuàng)建對私有方法的前向引用。

(3)向?qū)ο筇砑臃钦絽f(xié)議床未。

繼承可以增加竭翠,修改或者刪除方法,并且可以增加屬性薇搁。

14.什么是KVO和KVC?

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

很多情況下可以簡化程序代碼传货。apple文檔其實(shí)給了一個(gè)很好的例子屎鳍。

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

具體用看到嗯哼用到過的一個(gè)地方是對于按鈕點(diǎn)擊變化狀態(tài)的的監(jiān)控。

比如我自定義的一個(gè)button

[self addObserver:self forKeyPath:@"highlighted" options:0 context:nil];

#pragma mark KVO

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

if ([keyPath isEqualToString:@"highlighted"] ) {

[self setNeedsDisplay];

}

}

對于系統(tǒng)是根據(jù)keypath去取的到相應(yīng)的值發(fā)生改變粮宛,理論上來說是和kvc機(jī)制的道理是一樣的窥淆。

對于kvc機(jī)制如何通過key尋找到value:

“當(dāng)通過KVC調(diào)用對象時(shí),比如:[self valueForKey:@”someKey”]時(shí)巍杈,程序會(huì)自動(dòng)試圖通過幾種不同的方式解析這個(gè)調(diào)用忧饭。首先查找對象是否帶有someKey這個(gè)方法,如果沒找到筷畦,會(huì)繼續(xù)查找對象是否帶有someKey這個(gè)實(shí)例變量(iVar)词裤,如果還沒有找到,程序會(huì)繼續(xù)試圖調(diào)用-(id) valueForUndefinedKey:這個(gè)方法汁咏。如果這個(gè)方法還是沒有被實(shí)現(xiàn)的話亚斋,程序會(huì)拋出一個(gè)NSUndefinedKeyException異常錯(cuò)誤。(cocoachina.com注:Key-Value Coding查找方法的時(shí)候攘滩,不僅僅會(huì)查找someKey這個(gè)方法帅刊,還會(huì)查找getsomeKey這個(gè)方法,前面加一個(gè)get漂问,或者_(dá)someKey以及_getsomeKey這幾種形式赖瞒。同時(shí),查找實(shí)例變量的時(shí)候也會(huì)不僅僅查找someKey這個(gè)變量蚤假,也會(huì)查找_someKey這個(gè)變量是否存在栏饮。)設(shè)計(jì)valueForUndefinedKey:方法的主要目的是當(dāng)你使用-(id)valueForKey方法從對象中請求值時(shí),對象能夠在錯(cuò)誤發(fā)生前磷仰,有最后的機(jī)會(huì)響應(yīng)這個(gè)請求袍嬉。這樣做有很多好處,下面的兩個(gè)例子說明了這樣做的好處灶平∷磐ǎ“來至cocoa,這個(gè)說法應(yīng)該挺有道理逢享。因?yàn)槲覀冎纀utton卻是存在一個(gè)highlighted實(shí)例變量.因此為何上面我們只是add一個(gè)相關(guān)的keypath就行了罐监,可以按照kvc查找的邏輯理解,就說的過去了瞒爬。

15.我們說的OC是動(dòng)態(tài)運(yùn)行時(shí)語言是什么意思?

多態(tài)弓柱。 主要是將數(shù)據(jù)類型的確定由編譯時(shí)沟堡,推遲到了運(yùn)行時(shí)。

這個(gè)問題其實(shí)淺涉及到兩個(gè)概念矢空,運(yùn)行時(shí)和多態(tài)航罗。

簡單來說,運(yùn)行時(shí)機(jī)制使我們直到運(yùn)行時(shí)才去決定一個(gè)對象的類別妇多,以及調(diào)用該類別對象指定方法伤哺。

多態(tài):不同對象以自己的方式響應(yīng)相同的消息的能力叫做多態(tài)。意思就是假設(shè)生物類(life)都用有一個(gè)相同的方法-eat;

那人類屬于生物者祖,豬也屬于生物立莉,都繼承了life后,實(shí)現(xiàn)各自的eat七问,但是調(diào)用是我們只需調(diào)用各自的eat方法蜓耻。

也就是不同的對象以自己的方式響應(yīng)了相同的消息(響應(yīng)了eat這個(gè)選擇器)。因此也可以說械巡,運(yùn)行時(shí)機(jī)制是多態(tài)的基礎(chǔ)刹淌。

18.類變量的@protected ,@private,@public,@package,聲明各有什么含義讥耗?(OC第二講 ?實(shí)例變量可見度與方法)

上面的幾個(gè)聲明表明的時(shí)類成員的作用域有勾,@private作用范圍只能在自身類(外界既不可訪問,又不能繼承)古程;@protected作用范圍在自身類和子類蔼卡,如果什么都不加修飾,默認(rèn)是@protected(外界不可訪問挣磨,但是可以繼承)雇逞;@public作用范圍最大,可以在任何地方被訪問(外界即可訪問茁裙,又可以繼承)塘砸;@package作用范圍在某個(gè)框架內(nèi)

線程是什么?進(jìn)程是什么晤锥?二者有什么區(qū)別和聯(lián)系掉蔬? (UI第二十二講 多線程編程)

線程是CPU獨(dú)立運(yùn)行和獨(dú)立調(diào)度的基本單位(可以理解為一個(gè)進(jìn)程中執(zhí)行的代碼片段),進(jìn)程是資源分配的基本單位(進(jìn)程是一塊包含了某些資源的內(nèi)存區(qū)域)矾瘾。進(jìn)程是線程的容器眉踱,真正完成代碼執(zhí)行的是線程,而進(jìn)程則作為線程的執(zhí)行環(huán)境霜威。一個(gè)程序至少包含一個(gè)進(jìn)程,一個(gè)進(jìn)程至少包含一個(gè)線程册烈,一個(gè)進(jìn)程中的多個(gè)線程共享當(dāng)前進(jìn)程所擁有的資源戈泼。

32. What is lazy loading?

在使用的時(shí)候才去初始化婿禽,比如UITableViewCell的imageView屬性,懶加載對象的創(chuàng)建是在getter方法里面進(jìn)行創(chuàng)建的大猛。

34. isKindOfClass扭倾、isMemberOfClass作用分別是什么?

-(BOOL) isKindOfClass: classObj判斷是否是這個(gè)類或者是這個(gè)類子類的實(shí)例

-(BOOL) isMemberOfClass: classObj判斷是否是這個(gè)類的實(shí)例

OC里怎么實(shí)現(xiàn)多繼承

OC沒有多繼承挽绩。用協(xié)議實(shí)現(xiàn)多繼承,把協(xié)議中的方法在實(shí)現(xiàn)的類 中重寫C++有多繼承,多繼承其實(shí)用好了很方便膛壹。C++多繼承很容易出現(xiàn) 二一性比如:

類A { int a;}

類B:類A,類C:類A

類D : B, C那么int a到底是繼承自誰的單繼承

60.使用圓角效果時(shí)為什么會(huì)出現(xiàn)卡頓效果,如何解決這個(gè)問題?

不要在滾動(dòng)視圖使用cornerRadius或者mask,添加self.layer.shouldRasterize = YES; ?self.layer.rasterizationScale = [UIScreen mainScreen].scale;

采取預(yù)先生成圓角圖片唉堪,并緩存起來這個(gè)方法才是比較好的手段模聋。預(yù)處理圓角圖片可以在后臺(tái)處理,處理完畢后緩存起來唠亚,再在主線程顯示链方,這就避免了不必要的離屏渲染了。

在網(wǎng)絡(luò)請求中如何提高性能

在網(wǎng)絡(luò)請求中如何保證安全性

iOS在數(shù)據(jù)傳輸過程中有數(shù)據(jù)泄露的可能灶搜,客戶端在進(jìn)行網(wǎng)絡(luò)請求時(shí)一般都采用加密的方式來保證數(shù)據(jù)的安全性祟蚀,在iOS9以后,蘋果為了保護(hù)數(shù)據(jù)的安全性割卖,使用了Https協(xié)議前酿。

86.#define和const定義的變量,有什么區(qū)別什么情況下會(huì)出現(xiàn)內(nèi)存的循環(huán)引用block中的weak self鹏溯,是任何時(shí)候都需要加的么罢维?

答案:

1.宏:只是在預(yù)處理器里進(jìn)行文本替換,沒有類型剿涮,不做任何類型檢查言津,編譯器可以對相同的字符串進(jìn)行優(yōu)化。只保存一份到.rodata段取试。甚至有相同后綴的字符串也可以優(yōu)化悬槽,你可以用GCC編譯測試,"Hello world"與"world"兩個(gè)字符串瞬浓,只存儲(chǔ)前面一個(gè)初婆。取的時(shí)候只需要給前面和中間的地址,如果是整形猿棉、浮點(diǎn)型會(huì)有多份拷貝磅叛,但這些數(shù)寫在指令中。占的只是代碼段而已萨赁,大量用宏會(huì)導(dǎo)致二進(jìn)制文件變大.常量:共享一塊內(nèi)存空間弊琴,就算項(xiàng)目中N處用到,也不會(huì)分配N塊內(nèi)存空間杖爽,可以根據(jù)const修飾的位置設(shè)定能否修改敲董,在編譯階段會(huì)執(zhí)行類型檢查

2.(1)計(jì)時(shí)器NSTimer

一方面紫皇,NSTimer經(jīng)常會(huì)被作為某個(gè)類的成員變量,而NSTimer初始化時(shí)要指定self為target腋寨,容易造成循環(huán)引用聪铺。 另一方面,若timer一直處于validate的狀態(tài)萄窜,則其引用計(jì)數(shù)將始終大于0.

(2)block

block在copy時(shí)都會(huì)對block內(nèi)部用到的對象進(jìn)行強(qiáng)引用(ARC)或者retainCount增1(非ARC)铃剔。在ARC與非ARC環(huán)境下對block使用不當(dāng)都會(huì)引起循環(huán)引用問題,一般表現(xiàn)為查刻,某個(gè)類將block作為自己的屬性變量键兜,然后該類在block的方法體里面又使用了該類本身,簡單說就是self.someBlock = ^(Type var){[self dosomething];或者self.otherVar = XXX;或者_(dá)otherVar = ...};block的這種循環(huán)引用會(huì)被編譯器捕捉到并及時(shí)提醒赖阻。

(3)委托delegate

在委托問題上出現(xiàn)循環(huán)引用問題已經(jīng)是老生常談了蝶押,本文也不再細(xì)講,規(guī)避該問題的殺手锏也是簡單到哭火欧,一字訣:聲明delegate時(shí)請用assign(MRC)或者weak(ARC)棋电,千萬別手賤玩一下retain或者strong,畢竟這基本逃不掉循環(huán)引用了苇侵!

3.使用方將self或成員變量加入block之前要先將self變?yōu)開_weak

Configuration中赶盔,debug和release的區(qū)別是什么?

Release是發(fā)行版本,比Debug版本有一些優(yōu)化榆浓,文件比Debug文件小Debug是調(diào)試版本于未,Debug和Release調(diào)用兩個(gè)不同的底層庫。

一陡鹃、"Debug是調(diào)試版本烘浦,包括的程序信息更多"

二、只有DEBUG版的程序才能設(shè)置斷點(diǎn)萍鲸、單步執(zhí)行闷叉、使用TRACE/ASSERT等調(diào)試輸出語句。

三脊阴、REALEASE不包含任何調(diào)試信息握侧,所以體積小、運(yùn)行速度快嘿期。

品擎、Initilize和load的區(qū)別

http://www.cnblogs.com/ider/archive/2012/09/29/objective_c_load_vs_initialize.html

1.怎么修改只讀(readonly)屬性的變量

使用KVC可以修改,kvc就是鍵值編碼(key-value)备徐,可以通過指定的key獲得想要的值value萄传。而不是通過調(diào)用Setter、Getter方法訪問蜜猾。

什么情況使?用weak關(guān)鍵字,相?比assign有什么不同?在ARC中,防?止在有可能出現(xiàn)循環(huán)引?用的時(shí)候使?用weak關(guān)鍵字,?比如:block盲再。assign可以修飾基本數(shù)據(jù)類型和C數(shù)據(jù)類型,也就是簡單的賦值,?而weak只能修飾OC對象類型西设。

1)在ARC中,在有可能出現(xiàn)循環(huán)引?用的時(shí)候,往往要通過讓其中?一端使?用weak來解決,?比如:delegate代理屬性

2)自身已經(jīng)對它進(jìn)?行?一次強(qiáng)引?用,沒有必要再強(qiáng)引?用?一次,此時(shí)也會(huì)使?用weak,?自定義IBOutlet控件屬性?一般也使?用weak;當(dāng)然,也可以使?用strong。在下文也有論述:《IBOutlet連出來的視圖屬性為什么可以被設(shè)置成weak?》不同點(diǎn):

1)weak此特質(zhì)表明該屬性定義了?一種“?非擁有關(guān)系”(nonowning relationship)答朋。為這種屬性設(shè)置新值時(shí),設(shè)置?方法既不保留新值,也不釋放舊值。此特質(zhì)同assign類似,然?而在屬性所指的對象遭到摧毀時(shí),屬性值也會(huì)清空(nil out)棠笑。?而assign的“設(shè)置?方法”只會(huì)執(zhí)?行針對“純量類型”(scalar type,例如CGFloat或NSlnteger等)的簡單賦值操作梦碗。

2) assign可以用非OC對象,而weak必須用于OC對象

3、copy和mutablecopy的區(qū)別copy返回?一個(gè)不可變對象,mutableCopy是創(chuàng)建?一個(gè)新的可變對象,并初始化源

對象的值,引?用計(jì)數(shù)為1蓖救。

1. mutableCopy創(chuàng)建?一個(gè)新的可變對象,并初始化為原對象的值,新對象的引用計(jì)數(shù)為1;

2. copy返回?一個(gè)不可變對象洪规。分兩種情況:(1)若原對象是不可變對象,那么返回原對象,并將其引用計(jì)數(shù)加1 ;(2)若原對象是可變對象,那么創(chuàng)建?一個(gè)新的不可變對象,并初始化為原對象的值,新對象的引用計(jì)數(shù)為1。

@synthesize和@dynamic的區(qū)別?

@synthesize就是?自動(dòng)?生成屬性的setter和getter?方法循捺。

@dynamic就是要告訴編譯器,?自?己實(shí)現(xiàn)?方法斩例。

object-c為了讓java的開發(fā)者習(xí)慣使?用.的操作,所以可以將接??口類中的變量使?用@property來聲明屬性。但是在.h中聲明的屬性,必須在.m中使?用@synthesize或者@dynamic來實(shí)現(xiàn)(傳?言,在最近出的ios6中這步已經(jīng)省了),否則屬性不可?用从橘。熟悉object-c語法的都知道@synthesize實(shí)際的意義就是?自動(dòng)?生成屬性的setter和getter?方法念赶。

@dynamic就是要告訴編譯器,代碼中?用@dynamic修飾的屬性,其getter和setter?方法會(huì)在程序運(yùn)?行的時(shí)候或者?用其他?方式動(dòng)態(tài)綁定,以便讓編譯器通過編譯。其主要的作?用就是?用在NSManagerObject對象的屬性聲明上,由于此類對象的屬性?一般是從Core Data的屬性中?生成的,core data框架會(huì)在程序運(yùn)?行的時(shí)候?yàn)榇祟悓傩?生成getter和setter?方法,但是如果不是NSManagerObject的?子類,就必須?手動(dòng)實(shí)現(xiàn)setter和getter?方法,否則將出現(xiàn)野指針;

5恰力、__block和__weak修飾符的區(qū)別

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

2.__weak只能在ARC模式下使用停局,也只能修飾對象(NSString),不能修飾基本數(shù)據(jù)類型(int)香府。

3.__block對象可以在block中被重新賦值董栽,__weak不可以。

PS:__unsafe_unretained修飾符可以被視為iOS SDK 4.3以前版本的__weak的替代品企孩,不過不會(huì)被自動(dòng)置空為nil锭碳。所以盡可能不要使用這個(gè)修飾符。

6.在什么情況下會(huì)用到weak這個(gè)關(guān)鍵字柠硕,作用是什么工禾?

適用于OC對象,作用和非ARC中的assign作用相同蝗柔,修飾的成員變量為弱指針類型

IBOutlet的屬性一般可以設(shè)為weak是因?yàn)樗呀?jīng)被view引用了闻葵,除非view被釋放,否則IBOutlet的屬性也不會(huì)被釋放癣丧,另外IBOutlet屬性的生命周期和view應(yīng)該是一致的槽畔,所以IBOutlet屬性一般設(shè)為weak。

4胁编、隊(duì)列和棧的區(qū)別是什么厢钧?

1.隊(duì)列先進(jìn)先出鳞尔,棧先進(jìn)后出。

2.對插入和刪除操作的"限定"早直。 棧是限定只能在表的一端進(jìn)行插入和刪除操作的線性表寥假。 隊(duì)列是限定只能在表的一端進(jìn)行插入和在另一端進(jìn)行刪除操作的線性表。 從"數(shù)據(jù)結(jié)構(gòu)"的角度看霞扬,它們都是線性結(jié)構(gòu)糕韧,即數(shù)據(jù)元素之間的關(guān)系相同。但它們是完全不同的數(shù)據(jù)類型喻圃。除了它們各自的基本操作集不同外萤彩,主要區(qū)別是對插入和刪除操作的"限定"。 棧和隊(duì)列是在程序設(shè)計(jì)中被廣泛使用的兩種線性數(shù)據(jù)結(jié)構(gòu)斧拍,它們的特點(diǎn)在于基本操作的特殊性雀扶,棧必須按"后進(jìn)先出"的規(guī)則進(jìn)行操作,而隊(duì)列必須按"先進(jìn)先出"的規(guī)則進(jìn)行操作肆汹。和線性表相比愚墓,它們的插入和刪除操作受更多的約束和限定,故又稱為限定性的線性表結(jié)構(gòu)县踢。

3.遍歷數(shù)據(jù)速度不同转绷。棧只能從頭部取數(shù)據(jù) 也就最先放入的需要遍歷整個(gè)棧最后才能取出來,而且在遍歷數(shù)據(jù)的時(shí)候還得為數(shù)據(jù)開辟臨時(shí)空間硼啤,保持?jǐn)?shù)據(jù)在遍歷前的一致性隊(duì)列怎不同议经,他基于地址指針進(jìn)行遍歷,而且可以從頭或尾部開始遍歷谴返,但不能同時(shí)遍歷煞肾,無需開辟臨時(shí)空間,因?yàn)樵诒闅v的過程中不影像數(shù)據(jù)結(jié)構(gòu)嗓袱,速度要快的多籍救。

8、NSDictionary和NSMutableDictionary的區(qū)別渠抹,是有序還是無序(追問:可以排序嗎蝙昙?如何排序,最好代碼實(shí)現(xiàn))

NSDictionary是不可變的對象梧却,NSMutableDictionary是可變對象奇颠,可以進(jìn)行添加和刪除操作。

是無序的

排序的話可以這樣做:

1.獲取所有的key

NSArray *myKeys = [myDictionary allKeys];

2.對key進(jìn)行排序

NSArray *sortedKeys = [myKeys sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

3.按照key獲取對象

id firstObject = [myDictionary objectForKey: [sortedKeys objectAtIndex:0]];

keysSortedByValueUsingSelector/keysSortedByValueUsingComparator通過使用指定SEL或NSComarator來對allKeys進(jìn)行排序放航,然后通過objectsForKeys取出排序后的鍵-值對烈拒。

9、推送通知和本地通知的區(qū)別

本地推送和遠(yuǎn)程推送的區(qū)別是本地推送一般是用來實(shí)現(xiàn)鬧鐘或者生日提醒的功能.遠(yuǎn)程推送是為了實(shí)現(xiàn)服務(wù)器想要把及時(shí)的消息在某個(gè)特定的時(shí)間發(fā)送給用戶的手段.

本地推送不需要申請推送證書,遠(yuǎn)程推送需要先申請證書然后再去實(shí)現(xiàn)證書.

13.AVPlayer ?AVAudioPlayer ?MediaPlayer的不同

AVAudioPlayer:使用簡單方便,但只能播放本地音頻荆几,不支持流媒體播放

AVPlayer: iOS4.0以后吓妆,可以使用AVPlayer播放本地音頻和支持流媒體播放,但是提供接口較少吨铸,處理音頻不夠靈活

MediaPlayer :是用來處理網(wǎng)絡(luò)上的視頻文件的播放的系統(tǒng)類.

24XML行拢、JSON解析;

(1)區(qū)別:

(1)可讀性方面:基本相同诞吱,xml的可讀性比較好

(2)可擴(kuò)展性方面:都具有很好的擴(kuò)展性

(3)編碼難度方面:相對而言:JSON的編碼比較容易

(4)解碼難度:json的解碼難度基本為零剂陡,xml需要考慮子節(jié)點(diǎn)和父節(jié)點(diǎn)

(5)數(shù)據(jù)體積方面:json相對于xml來講,數(shù)據(jù)體積小狐胎,傳遞的速度跟快些

(6)數(shù)據(jù)交互方面:json與JavaScript的交互更加方面,更容易解析處理歌馍,更好的數(shù)據(jù)交互

(7)數(shù)據(jù)描述方面:xml對數(shù)據(jù)描述性比較好

(8)傳輸速度方面:json的速度遠(yuǎn)遠(yuǎn)快于xml

(2)

1)JSON底層原理:

遍歷字符串中的字符握巢,最終根據(jù)格式規(guī)定的特殊字符,比如{}號(hào)松却,[]號(hào), :號(hào)等進(jìn)行區(qū)分暴浦,{}號(hào)是一個(gè)字典的開始,[]號(hào)是一個(gè)數(shù)組的開始, :號(hào)是字典的鍵和值的分水嶺晓锻,最終乃是將json數(shù)據(jù)轉(zhuǎn)化為字典歌焦,字典中值可能是字典,數(shù)

組砚哆,或字符串而已独撇。

2)XML底層原理:XML解析常用的解析方法有兩種:DOM解析和SAX解析。DOM采用建立樹形結(jié)構(gòu)的方式訪問XML文檔躁锁,而

SAX采用的事件模型纷铣。

DOM解析把XML文檔轉(zhuǎn)化為一個(gè)包含其內(nèi)容的樹,并可以對樹進(jìn)行遍歷战转。使用DOM解析器的時(shí)候需要處理整個(gè)XML文檔搜立,所以對性能和內(nèi)存的要求比較高。SAX在解析XML文檔的時(shí)候可以觸發(fā)一系列的事件槐秧,當(dāng)發(fā)現(xiàn)給定的tag的時(shí)候啄踊,它可以激活一個(gè)回調(diào)方法,告訴該方法制定的標(biāo)簽已經(jīng)找到刁标。SAX對內(nèi)存的要求通常會(huì)比較低颠通,因?yàn)樗岄_發(fā)人員自己來決定所要處理的tag。特別是當(dāng)開發(fā)人員只需要處理文檔中所包含的部分?jǐn)?shù)據(jù)時(shí)命雀,SAX這種擴(kuò)展能力得到了更好的體現(xiàn)蒜哀。

3)SAX與DOM的區(qū)別:

1、SAX處理的優(yōu)點(diǎn)非常類似于流媒體的優(yōu)點(diǎn)。分析能夠立即開始撵儿,而不是等待所有的數(shù)據(jù)被處理乘客。而且由于應(yīng)用程序只是在讀取數(shù)據(jù)時(shí)檢查數(shù)據(jù),因此不需要將數(shù)據(jù)存儲(chǔ)在內(nèi)存中淀歇。這對于大型文檔來說是個(gè)巨大的優(yōu)點(diǎn)量淌。事實(shí)上,應(yīng)用程序甚至不必解析整個(gè)文檔盆均;它可以在某個(gè)條件得到滿足時(shí)停止解析救恨。一般來說,SAX還比它的替代者DOM快許多纳决。另一方面碰逸,由于應(yīng)用程序沒有以任何方式存儲(chǔ)數(shù)據(jù),使用SAX來更改數(shù)據(jù)或在數(shù)據(jù)流中往后移是不可能的阔加。

2饵史、DOM以及廣義的基于樹的處理具有幾個(gè)優(yōu)點(diǎn)。首先胜榔,由于樹在內(nèi)存中是持久的胳喷,因此可以修改它以便應(yīng)用程序能對數(shù)據(jù)和結(jié)構(gòu)作出更改。它還可以在任何時(shí)候在樹中上下導(dǎo)航夭织,而不是像SAX那樣是一次性的處理吭露。DOM使用起來也要簡單得多。另一方面尊惰,在內(nèi)存中構(gòu)造這樣的樹涉及大量的開銷讲竿。大型文件完全占用系統(tǒng)內(nèi)存容量的情況并不鮮見。此外择浊,創(chuàng)建一棵DOM樹可能是一個(gè)緩慢的過程戴卜。

11.方法(method)和選擇器有何不同?

NSDictionary是不可變的對象琢岩,NSMutableDictionary是可變對象投剥,可以進(jìn)行添加和刪除操作。

是無序的

排序的話可以這樣做:

1.獲取所有的key

NSArray *myKeys = [myDictionary allKeys];

2.對key進(jìn)行排序

NSArray *sortedKeys = [myKeys sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

3.按照key獲取對象

id firstObject = [myDictionary objectForKey: [sortedKeys objectAtIndex:0]];

keysSortedByValueUsingSelector/keysSortedByValueUsingComparator通過使用指定SEL或NSComarator來對allKeys進(jìn)行排序担孔,然后通過objectsForKeys取出排序后的鍵-值對江锨。

1.bounds和frame的區(qū)別?bound的大小改變frame改變嗎?

bounds相當(dāng)于是一個(gè)視圖的坐標(biāo)糕篇,一個(gè)視圖的frame是相對于父視圖的bounds啄育,改變bounds并不會(huì)影響本視圖的frame,但是會(huì)對子視圖的布局造成影響

24.說說響應(yīng)鏈

當(dāng)事件發(fā)生的時(shí)候拌消,響應(yīng)鏈?zhǔn)紫缺话l(fā)送給第一個(gè)響應(yīng)者(往往是事件發(fā)生的視圖挑豌,也就是用戶觸摸屏幕的地方)。事件將沿著響應(yīng)者鏈一直向下傳遞,直到被接受并作出處理氓英。一般來說侯勉,第一響應(yīng)這是個(gè)視圖對象或者其子類,當(dāng)其被觸摸后事件就交由它處理铝阐,如果他不處理址貌,時(shí)間就會(huì)被傳遞給視圖控制器對象UIViewController(如果存在),然后是它的父視圖對象(superview)徘键,以此類推直到頂層視圖练对。接下來會(huì)沿著頂層視圖(topview)到窗口(UIwindow對象)再到程序的(UIApplication對象),如果整個(gè)過程都沒有響應(yīng)這個(gè)事件吹害,則該事件被丟棄螟凭,一般情況下,在響應(yīng)鏈中只要有對象處理事件它呀,事件就會(huì)被傳遞典型的響應(yīng)路線圖如:First Responser -> The Window ->The Applicationn -> App Delegate

4赂摆、drawInRect

在運(yùn)行到drawInRect:withFont: lineBreakMode:alignment:,出現(xiàn)提示iOS7棄用這個(gè)方法钟些,使用drawInRect:withAttributes:的方法的提示。但是這個(gè)方法在說明的時(shí)候绊谭,寫的很簡單政恍,第二個(gè)參數(shù)是一個(gè)字典,根本就搞不明白是什么東西达传。我在查了不少資料后篙耗,才翻到字典里面能存放的東西:NSAttributedString,里面竟然可以使用21組鍵值對宪赶,功能強(qiáng)大了不少宗弯。NSParagraphStyleAttributeName這個(gè)key就能代替iOS6上的那個(gè)棄用方法,不過值必須得是NSMutableParagraphStyle搂妻,不然不能自定義

5蒙保、NSAttributedString屬性字符串

NSAttributedString管理一個(gè)字符串,以及與該字符串中的單個(gè)字符或某些范圍的字符串相關(guān)的屬性欲主。比如這個(gè)字符串“我愛北京天安門”邓厕,“我”跟其他字符的顏色不一樣,而“北京”與其他的字體和大小不一樣扁瓢,等等详恼。NSAttributedString就是用來存儲(chǔ)這些信息的,具體實(shí)現(xiàn)時(shí)引几,NSAttributedString維護(hù)了一個(gè)NSString昧互,用來保存最原始的字符串,另有一個(gè)NSDictionary用來保存各個(gè)子串/字符的屬性。

學(xué)習(xí)鏈接:http://blog.csdn.net/zhangao0086/article/details/7616385

UIScrollview重用機(jī)制

事件處理看過了敞掘,就要考慮scrollView如何重用內(nèi)存的叽掘,下面寫了一個(gè)例子模仿UITableView的重用的思想,這里只是模仿渐逃,至于蘋果公司怎么實(shí)現(xiàn)這種重用的够掠,他們應(yīng)該有更好的方法。

這里的例子是在scrollView上放置4個(gè)2排2列的視圖茄菊,但是內(nèi)存中只占用6個(gè)視圖的內(nèi)存空間疯潭。當(dāng)scrollView滾動(dòng)的時(shí)候,通過不停的重用之前視圖的內(nèi)存空間面殖,從而達(dá)到節(jié)省內(nèi)存的效果竖哩。重用的方法如下:

1.如果scrollView向下面滾動(dòng),一旦一排視圖滾出了可視范圍脊僚,就改變滾動(dòng)出去的那個(gè)view在scrollView中的frame相叁,也就是改變位置到達(dá)末尾,達(dá)到重用的效果辽幌。

2.如果scrollView向上面滾動(dòng)增淹,一旦最末排的視圖view滾出了可視范圍,就改變滾動(dòng)出去的那個(gè)view在scrollView中的frame乌企,移動(dòng)到最前面虑润。

8、描述什么是面向?qū)ο螅?/p>

面向?qū)ο?

把數(shù)據(jù)及對數(shù)據(jù)的操作方法放在一起加酵,作為一個(gè)相互依存的整體——對象拳喻。對同類對象抽象出其共性,形成類猪腕。類中的大多數(shù)數(shù)據(jù)冗澈,只能用本類的方法進(jìn)行處理。類通過一個(gè)簡單的外部接口與外界發(fā)生關(guān)系陋葡,對象與對象之間通過消息進(jìn)行通信亚亲。程序流程由用戶在使用中決定。

1腐缤、UITableView的執(zhí)行流程是怎么樣的朵栖?

第一輪:

1、numberOfSectionsInTableView:假如section=2柴梆,此函數(shù)只執(zhí)行一次陨溅,假如section=0,下面函數(shù)不執(zhí)行绍在,默認(rèn)為1

2门扇、heightForHeaderInSection雹有,執(zhí)行兩次,此函數(shù)執(zhí)行次數(shù)為section數(shù)目

3臼寄、heightForFooterInSection霸奕,函數(shù)屬性同上,執(zhí)行兩次

4吉拳、numberOfRowsInSection质帅,此方法執(zhí)行一次

5、heightForHeaderInSection留攒,此方法執(zhí)行了兩次煤惩,我其實(shí)有點(diǎn)困惑為什么這里還要調(diào)用這個(gè)方法

6、heightForFooterInSection炼邀,此方法執(zhí)行兩次魄揉,

7、numberOfRowsInSection拭宁,執(zhí)行一次

8洛退、heightForRowAtIndexPath,行高杰标,先執(zhí)行section=0兵怯,對應(yīng)的row次數(shù)

第二輪:

1、numberOfSectionsInTableView腔剂,一次

2摇零、heightForHeaderInSection,section次數(shù)

3桶蝎、heightForFooterInSection,section次數(shù)

4谅畅、numberOfRowsInSection登渣,一次

5、heightForHeaderInSection毡泻,執(zhí)行section次數(shù)

6胜茧、heightForFooterInSection,執(zhí)行section次數(shù)

7仇味、numberOfRowsInSection呻顽,執(zhí)行一次

8、heightForRowAtIndexPath丹墨,行高廊遍,先執(zhí)行一次

9、cellForRowAtIndexPath

10贩挣、willDisplayCell

然后8喉前、9没酣、10依次執(zhí)行直到所有的cell被描畫完畢

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市卵迂,隨后出現(xiàn)的幾起案子裕便,更是在濱河造成了極大的恐慌,老刑警劉巖见咒,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件偿衰,死亡現(xiàn)場離奇詭異,居然都是意外死亡改览,警方通過查閱死者的電腦和手機(jī)下翎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恃疯,“玉大人漏设,你說我怎么就攤上這事〗裢” “怎么了郑口?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長盾鳞。 經(jīng)常有香客問我犬性,道長,這世上最難降的妖魔是什么腾仅? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任乒裆,我火速辦了婚禮,結(jié)果婚禮上推励,老公的妹妹穿的比我還像新娘鹤耍。我一直安慰自己,他們只是感情好验辞,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布稿黄。 她就那樣靜靜地躺著,像睡著了一般跌造。 火紅的嫁衣襯著肌膚如雪杆怕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天壳贪,我揣著相機(jī)與錄音陵珍,去河邊找鬼。 笑死违施,一個(gè)胖子當(dāng)著我的面吹牛互纯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播磕蒲,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼伟姐,長吁一口氣:“原來是場噩夢啊……” “哼收苏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起愤兵,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤鹿霸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后秆乳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體懦鼠,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年屹堰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肛冶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扯键,死狀恐怖睦袖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荣刑,我是刑警寧澤馅笙,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站厉亏,受9級(jí)特大地震影響董习,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜爱只,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一皿淋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恬试,春花似錦窝趣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至畦粮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乖阵,已是汗流浹背宣赔。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瞪浸,地道東北人儒将。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像对蒲,于是被迫代替她去往敵國和親钩蚊。 傳聞我的和親對象是個(gè)殘疾皇子贡翘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

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

  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 1,962評論 0 7
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,345評論 0 35
  • ———————————————回答好下面的足夠了---------------------------------...
    恒愛DE問候閱讀 1,712評論 0 4
  • __block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,284評論 0 6
  • 山水沂沭 朋友問我:下次帶我去旅行吧砰逻! 我微笑著:你受不了那罪鸣驱。 他不...
    山水沂沭閱讀 532評論 0 1