最近一朋友正準(zhǔn)備跳槽,就從各處搜索整理一些基礎(chǔ),便于朋友復(fù)習(xí)拘领,也便于自己復(fù)習(xí)查看.
1. 回答person的retainCount值,并解釋為什么
Person *per = [[Person alloc] init];
// 此時(shí)person 的retainCount的值是1
self.person = per;
// 在self.person 時(shí),
如果是assign,person的 retainCount的值不變,仍為1
若是:retain person的retainCount的值加1,變?yōu)?
若是:copy person的retainCount值不變,仍為1
2藕帜、 這段代碼有什么問(wèn)題嗎?
@implementation Person
- (void)setAge:(int)newAge {
self.age = newAge;
}
@end
答: 會(huì)死循環(huán),會(huì)重復(fù)調(diào)用自己! self.age 改為_age即可;
并且書寫不規(guī)范:setter方法中的newAge應(yīng)該為age
3烫罩、這段代碼有什么問(wèn)題,如何修改
for (int i = 0; i < someLargeNumber; i++) {
NSString *string = @”Abc”;
string = [string lowercaseString];
string = [string stringByAppendingString:@"xyz"];
NSLog(@“%@”, string);
}
會(huì)出現(xiàn)內(nèi)存泄露修改之后:
for(int i = 0; i<1000;i++){
NSAutoreleasePool * pool1 = [[NSAutoreleasePool alloc] init];
NSString *string = @"Abc";
string = [string lowercaseString];
string = [string stringByAppendingString:@"xyz"];
NSLog(@"%@",string);
// 釋放池
[pool1 drain];
}
延伸:堆棧的區(qū)別:
(1)管理方式: 對(duì)于棧來(lái)講,是由編譯器自動(dòng)管理,無(wú)需我們手工控制; 對(duì)于堆來(lái)說(shuō),釋放工作由程序員控制,容易產(chǎn)生 memory leak。
(2)申請(qǐng)大小: 能從棧獲得的空間較小,堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域洽故。堆的大小受限于計(jì)算機(jī)系統(tǒng)中 有效的虛擬內(nèi)存贝攒。由此可見(jiàn),堆獲得的空間比較靈活,也比較大。
(3)碎片問(wèn)題: 對(duì)于堆來(lái)講,頻繁的new/delete勢(shì)必會(huì)造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低时甚。 對(duì)于棧來(lái)講,則不會(huì)存在這個(gè)問(wèn)題,因?yàn)闂J窍冗M(jìn)后出的隊(duì)列,他們是如此的一一對(duì)應(yīng),以至于永遠(yuǎn)都不可能有一個(gè)內(nèi)存塊從棧中間彈出
(4)分配方式: 堆都是動(dòng)態(tài)分配的,沒(mé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)行釋放,無(wú)需我們手工實(shí)現(xiàn)梨熙。
(5)分配效率: 棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)會(huì)在底層對(duì)棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧 都有專門的指令執(zhí)行,這就決定了棧的效率比較高开镣。堆則是C/C++函數(shù)庫(kù)提供的,它的機(jī)制是很復(fù)雜的。
4咽扇、寫一個(gè)便利構(gòu)造器
+(id)Person {
Person *person=[Person alloc] init];
return [person autorelease]; // 備注:ARC時(shí)不用 autorelease
}
5邪财、截取字符串”20 | http://www.baidu.com”中,”|”字符前面和后面的數(shù)據(jù),分別輸出它們。
NSString * str = @"20 | http://www.baidu.com";
NSArray *array = [str componentsSeparatedByString:@"|"]; // 這是分別輸出的截取后的字符串
for (int i = 0; i < [array count]; ++i) {
NSLog(@"%d=%@", i, [array objectAtIndex:i]);
}
6肌割、用obj-c寫一個(gè)冒泡排序
-(void)mySort:(NSMutableArray *)mutArray {
id tmpObj = nil;
unsigned long flag = mutArray.count - 1; // flag :最大腳標(biāo)
while (flag > 0) {
int k = flag;
flag = 0;
for (int j = 0 ; j < k ; j++) {
int order = NSOrderedAscending; // 或 NSOrderedDescendingif ([[mutArray[j] description] compare:[mutArray[j+1] description]] == -order) {
tmpObj = mutArray[j];
mutArray[j] = mutArray[j+1];
mutArray[j+1] = tmpObj;
flag = j;
}
}
}
}
延伸: C語(yǔ)言的冒泡排序:
(1)冒泡法對(duì)一維數(shù)組中的元素進(jìn)行排序
- (void)sort(int arr[],int arr_len) {
for(int i = 0; i < arr_len-1; i++) { //外層循環(huán)
for(int j = 0; j < arr_len-1-i; j++) { //借助j實(shí)現(xiàn)一趟的次數(shù)
if(arr[j] > arr[j+1]) {
int temp=0;
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
(2)用指針數(shù)組給字符串排序
- (void)sort_a(char * name[],int n) {
char *temp;
for(int i=0; i<n-1; i++) {
for(int j=0; j<n-1-i; j++) {
if(strcmp(name[j], name[j+1])>0) {
tem p= name[j];
name[j]=name[j+1];
name[j+1]=temp;
}
}
}
}
(3)給字符串?dāng)?shù)組排序
- (void) rang(char str[][20],int n) {
for(int i=0; i<n-1; i++) {
for(int j=0; j<n-1-i; j++) {
int result = strcmp(str[j],str[j+1]);
if(result>=0) {
char temp[20];
strcpy(temp, str[j]);
strcpy(str[j], str[j+1]);
strcpy(str[j+1], temp);
}
}
}
}
7卧蜓、簡(jiǎn)述你對(duì)UIView、UIWindow和CALayer的理解
UIView: 屬于UIkit.framework框架,負(fù)責(zé)渲染矩形區(qū)域的內(nèi)容,為矩形區(qū)域添加動(dòng)畫,響應(yīng)區(qū)域的觸摸事件,布局和管理一個(gè)或多個(gè)子視圖
UIWindow: 屬于UIKit.framework框架,是一種特殊的UIView,通常在一個(gè)程序中只會(huì)有一個(gè)UIWindow,但可以手動(dòng)創(chuàng)建多個(gè)UIWindow,同時(shí)加到程序里面把敞。
UIWindow在程序中主要起到三個(gè)作用:
1弥奸、作為容器,包含app所要顯示的所有視圖
2、傳遞觸摸消息到程序中view和其他對(duì)象
3奋早、與UIViewController協(xié)同工作,方便完成設(shè)備方向旋轉(zhuǎn)的支持
CAlayer: 屬于QuartzCore.framework,是用來(lái)繪制內(nèi)容的,對(duì)內(nèi)容進(jìn)行動(dòng)畫處理依賴與UIView來(lái)進(jìn)行顯示,不能處理用戶事件盛霎。UIView和CALayer是相互依賴的,UIView依賴CALayer提供內(nèi)容,CALayer依賴UIView一共容器顯示 繪制內(nèi)容。
PS延伸: UIViewController: 管理視圖的子視圖,每個(gè)視圖控制器都有一個(gè)自帶的視圖,并且負(fù)責(zé)這個(gè)視圖相關(guān)的一切事務(wù)耽装。方便管理視圖中的子視圖,負(fù)責(zé)model與view的通信;檢測(cè)設(shè)備旋轉(zhuǎn)以及內(nèi)存警告;是所有視圖控制類的積累,定義了控制器的基本功能愤炸。
8、寫一個(gè)完整的代理,包括聲明,實(shí)現(xiàn)
// 創(chuàng)建
@protocol BeforeMarriedDelagate <NSObject>
@required
-(void)doCook:(NSString *)foodName;
-(void)doHomework;
@optional
-(void)driveCar;
-(void)makeMoney;
@end
// 聲明
@interface Boy : NSObject< BeforeMarriedDelagate>
-(void)doCook:(NSString *)foodName;
-(void)doHomework; -(void)makeMoney;//實(shí)現(xiàn)
@implementation Boy
-(void)doCook:(NSString *)foodName {
NSLog(@"做飯:%@!",foodName);
}
-(void)doHomework{
NSLog(@"今天洗衣服!");
}
-(void)makeMoney{
NSLog(@"Coding!!");
}
@end
9掉奄、分析json规个、xml的區(qū)別?json、xml解析方式的底層是如何處理的?
答: 區(qū)別:
(1)可讀性方面:基本相同,xml的可讀性比較好
(2)可擴(kuò)展性方面:都具有很好的擴(kuò)展性
(3)編碼難度方面:相對(duì)而言:JSON的編碼比較容易
(4)解碼難度:json的解碼難度基本為零,xml需要考慮子節(jié)點(diǎn)和父節(jié)點(diǎn)
(5)數(shù)據(jù)體積方面:json相對(duì)于xml來(lái)講,數(shù)據(jù)體積小,傳遞的速度跟快些
(6)數(shù)據(jù)交互方面:json與JavaScript的交互更加方面,更容易解析處理,更好的數(shù)據(jù)交互
(7)數(shù)據(jù)描述方面:xml對(duì)數(shù)據(jù)描述性比較好
(8)傳輸速度方面:json的速度遠(yuǎn)遠(yuǎn)快于xml
JSON底層原理:
遍歷字符串中的字符,最終根據(jù)格式規(guī)定的特殊字符,比如{}號(hào),[]號(hào), : 號(hào) 等進(jìn)行區(qū)分,{}號(hào)是一個(gè)字典 的開(kāi)始,[]號(hào)是一個(gè)數(shù)組的開(kāi)始, : 號(hào)是字典的鍵和值的分水嶺,最終乃是將json數(shù)據(jù)轉(zhuǎn)化為字典,字典中值可能是字典,數(shù) 組,或字符串而已姓建。
XML底層原理:
XML解析常用的解析方法有兩種:DOM解析和SAX解析诞仓。
DOM 采用建立樹(shù)形結(jié)構(gòu)的方式訪問(wèn) XML 文檔,而 SAX 采用的事件模型。DOM 解析把 XML 文檔轉(zhuǎn)化為一個(gè)包含其內(nèi)容的樹(shù),并可以對(duì)樹(shù)進(jìn)行遍歷速兔。使用 DOM 解析器的時(shí)候需要處理整個(gè) XML 文檔,所以對(duì)性能和內(nèi)存的要求比較高墅拭。 SAX在解析 XML 文檔的時(shí)候可以觸發(fā)一系列的事件,當(dāng)發(fā)現(xiàn)給定的tag 的時(shí)候,它可以激活一個(gè)回調(diào)方法,告訴該方法制定的標(biāo)簽已經(jīng)找到。SAX 對(duì)內(nèi)存的要求通常會(huì)比較低,因?yàn)樗岄_(kāi)發(fā)人員自己來(lái)決 定所要處理的tag涣狗。特別是當(dāng)開(kāi)發(fā)人員只需要處理文檔中所包含的部分?jǐn)?shù)據(jù)時(shí),SAX 這種擴(kuò)展能力得到了更好的體現(xiàn)谍婉。
延伸:SAX與DOM的區(qū)別:
1、SAX處理的優(yōu)點(diǎn)非常類似于流媒體的優(yōu)點(diǎn)镀钓。分析能夠立即開(kāi)始,而不是等待所有的數(shù)據(jù)被處理穗熬。而且由于應(yīng)用程序只是 在讀取數(shù)據(jù)時(shí)檢查數(shù)據(jù),因此不需要將數(shù)據(jù)存儲(chǔ)在內(nèi)存中。這對(duì)于大型文檔來(lái)說(shuō)是個(gè)巨大的優(yōu)點(diǎn)丁溅。事實(shí)上,應(yīng)用程序甚至不 必解析整個(gè)文檔;它可以在某個(gè)條件得到 滿足時(shí)停止解析死陆。一般來(lái)說(shuō),SAX 還比它的替代者 DOM 快許多。另一方面,由于應(yīng)用程序沒(méi)有以任何方式存儲(chǔ)數(shù)據(jù),使用 SAX 來(lái)更改數(shù)據(jù)或在數(shù)據(jù)流中往后移是不可能的。
2措译、DOM 以及廣義的基于樹(shù)的處理具有幾個(gè)優(yōu)點(diǎn)别凤。首先,由于樹(shù)在內(nèi)存中是持久的,因此可以修改它以便應(yīng)用程序能對(duì)數(shù) 據(jù)和結(jié)構(gòu)作出更改。它還可以在任何時(shí)候在樹(shù)中上下 導(dǎo)航,而不是像 SAX 那樣是一次性的處理领虹。DOM 使用起來(lái)也要簡(jiǎn)單 得多规哪。另一方面,在內(nèi)存中構(gòu)造這樣的樹(shù)涉及大量的開(kāi)銷。大型文件完全占用系統(tǒng)內(nèi)存容量的情況并不鮮見(jiàn)塌衰。此外,創(chuàng)建一 棵 DOM 樹(shù)可能是一個(gè)緩慢的過(guò)程诉稍。
3、選擇 DOM 還是選擇 SAX,這取決于下面幾個(gè)因素:應(yīng)用程序的目的:如果打算對(duì)數(shù)據(jù)作出更改并將它輸出為 XML,那么在大多數(shù)情況下,DOM 是適當(dāng)?shù)倪x擇最疆。并不是說(shuō)使 用 SAX 就不能更改數(shù)據(jù),但是該過(guò)程要復(fù)雜得多,因?yàn)槟仨殞?duì)數(shù)據(jù)的一份拷貝而不是對(duì)數(shù)據(jù)本身作出更改杯巨。數(shù)據(jù)容量: 對(duì)于大型文件,SAX 是更好的選擇。數(shù)據(jù)將如何使用:如果只有數(shù)據(jù)中的少量部分會(huì)被使用,那么使用 SAX 來(lái)將該部分?jǐn)?shù)據(jù)提取到應(yīng)用程序中可能更好努酸。 另一方面,如果您知道自己以后會(huì)回頭引用已處理過(guò)的大量信息,那么 SAX 也許不是恰當(dāng)?shù)倪x擇服爷。對(duì)速度的需要:SAX 實(shí)現(xiàn)通常要比 DOM 實(shí)現(xiàn)更快。SAX 和 DOM 不是相互排斥的,記住這點(diǎn)很重要获诈。您可以使用 DOM 來(lái)創(chuàng)建 SAX 事件流,也可以使用 SAX 來(lái)創(chuàng)建 DOM 樹(shù)仍源。事實(shí)上,用于創(chuàng)建 DOM 樹(shù)的大多數(shù)解析器實(shí)際上都使用 SAX 來(lái)完成這個(gè)任務(wù)!
10、ViewController 的 didReceiveMemoryWarning 是在什么時(shí)候被調(diào)用的?默認(rèn)的操作是什么?
答: 當(dāng)程序接到內(nèi)存警告時(shí)ViewController將會(huì)收到這個(gè)消息:didReceiveMemoryWarning 從iOS3.0開(kāi)始,不需要重載這個(gè)函數(shù),把釋放內(nèi)存的代碼放到viewDidUnload中去舔涎。 這個(gè)函數(shù)的默認(rèn)實(shí)現(xiàn)是:檢查controller是否可以安全地釋放它的view,如果view可以被釋放,那么這個(gè)函數(shù)釋放view并
調(diào)用viewDidUnload笼踩。重載這個(gè)函數(shù)來(lái)釋放controller中使用的其他內(nèi)存。但要記得調(diào)用這個(gè)函數(shù)的super實(shí)現(xiàn)來(lái)允許父類(一般是UIVIewController)釋放view亡嫌。 如果你的ViewController保存著view的子view的引用,那么,在早期的iOS版本中,你應(yīng)該在這個(gè)函數(shù)中來(lái)釋放這些引 用嚎于。而在iOS3.0或更高版本中,你應(yīng)該在viewDidUnload
中釋放這些引用。
11挟冠、面向?qū)ο蟮娜筇卣?并作簡(jiǎn)單的介紹于购。
面向?qū)ο蟮娜齻€(gè)基本特征是:封裝、繼承圃郊、多態(tài)。
1)封裝是面向?qū)ο蟮奶卣髦? 是對(duì)象和類概念的主要特性女蜈。 封裝,也就是把客觀事物封裝成抽象的類,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對(duì)象操作,對(duì)不可信的進(jìn)行信息隱藏持舆。隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外公開(kāi)接口,提高代碼安全性,封轉(zhuǎn)程度越高,獨(dú)立性越強(qiáng),使用越方便。
2)繼承是指這樣一種能力: 它可以使用現(xiàn)有類的所有功能,并在無(wú)需重新編寫原來(lái)的類的情況下對(duì)這些功能進(jìn)行擴(kuò)展伪窖。 通過(guò)繼承創(chuàng)建的新類稱為“子類”或“派生類”逸寓。 被繼承的類稱為“基類”、“父類”或“超類”
3)多態(tài)性: 允許你將父對(duì)象設(shè)置成為和一個(gè)或更多的他的子對(duì)象相等的技術(shù),賦值之后,父對(duì)象就可以根據(jù)當(dāng)前賦值給它的子 對(duì)象的特性以不同的方式運(yùn)作覆山。簡(jiǎn)單的說(shuō),就是一句話:允許將子類類型的指針賦值給父類類型的指針
12竹伸、我們說(shuō)的obc是動(dòng)態(tài)運(yùn)行時(shí)語(yǔ)言是什么意思? 多態(tài)。
主要是將數(shù)據(jù)類型的確定由編譯時(shí),推遲到了運(yùn)行時(shí)。這個(gè)問(wèn)題其實(shí)淺涉及到兩個(gè)概念,運(yùn)行時(shí)和多態(tài)
勋篓。
簡(jiǎn)單來(lái)說(shuō), 運(yùn)行時(shí)機(jī)制使我們直到運(yùn)行時(shí)才去決定一個(gè)對(duì)象的類別,以及調(diào)用該類別對(duì)象指定方法吧享。多態(tài):不同對(duì)象以自己的方式響應(yīng)相同的消息的能力叫做多態(tài)。意思就是假設(shè)生物類(life)都用有一個(gè)相同的方法-eat;那人類屬于生物,豬也屬于生物,都繼承了life后,實(shí)現(xiàn)各自的eat,但是調(diào)用是我們只需調(diào)用各自的eat方法譬嚣。也就是不同的對(duì)象以自己的方式響應(yīng)了相同的消息(響應(yīng)了eat這個(gè)選擇器)。因此也可以說(shuō),運(yùn)行時(shí)機(jī)制是多態(tài)的基礎(chǔ).
13、readwrite,readonly,assign,retain,copy,nonatomic 彭沼、strong阴汇、weak屬性的作用?并區(qū)別 strong(強(qiáng)引用)、 weak(弱引用)?什么情況使用copy,assign,和retain?
readwrite 是可讀可寫特性;需要生成getter方法和setter方法
readonly 是只讀特性 只會(huì)生成getter方法 不會(huì)生成setter方法 ;不希望屬性在類外改變assign 是賦值特性,setter方法將傳入?yún)?shù)賦值給實(shí)例變量;僅設(shè)置變量時(shí);
retain 表示持有特性,setter方法將傳入?yún)?shù)先保留,再賦值,傳入?yún)?shù)的retaincount會(huì)+1;
copy 表示賦值特性,setter方法將傳入對(duì)象復(fù)制一份;需要完全一份新的變量時(shí)尼桶。
nonatomic 非原子操作,決定編譯器生成的setter getter是否是原子操作,atomic表示多線程安全,一般使用 nonatomicassign用于簡(jiǎn)單數(shù)據(jù)類型,如NSInteger,double,bool操灿。
retain 和copy用戶對(duì)象,copy用于當(dāng) a指向一個(gè)對(duì)象,b也想指向同樣的對(duì)象的時(shí)候,如果用assign,a如果釋放,再 調(diào)用b會(huì)crash,如果用copy 的方式,a和b各自有自己的內(nèi)存,就可以解決這個(gè)問(wèn)題。retain 會(huì)使計(jì)數(shù)器加1,也可以解 決assign的問(wèn)題泵督。另外:atomic和nonatomic用來(lái)決定編譯器生成的getter和setter是否為原子操作趾盐。 在多線程環(huán)境 下,原子操作是必要的,否則有可能引起錯(cuò)誤的結(jié)果。
14幌蚊、為什么很多內(nèi)置類如UITableViewController的delegate屬性都是assign而不是retain的?
會(huì)引起循環(huán)引用----若是retain,在alloc一次之后,若release一次,會(huì)導(dǎo)致內(nèi)訓(xùn)泄漏,若release兩次會(huì)導(dǎo)致兩個(gè)對(duì)象的dealloc嵌套執(zhí)行,結(jié)果就是都沒(méi)有執(zhí)行成功,最后崩潰! 所有的引用計(jì)數(shù)系統(tǒng),都存在循環(huán)應(yīng)用的問(wèn)題谤碳。
例如下面的引用關(guā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)閏還引用了b,所以b的引用計(jì)數(shù)為1,b不會(huì)被釋放溢豆。 b不釋放,c的引用計(jì)數(shù)就是1,c也不會(huì)被釋放蜒简。從此,b和c永遠(yuǎn)留在內(nèi)存中。 這種情況,必須打斷循環(huán)引用,通過(guò)其他規(guī)則來(lái)維護(hù)引用關(guān)系漩仙。我們常見(jiàn)的delegate往往是assign方式的屬性而不是 retain方式 的屬性,賦值不會(huì)增加引用計(jì)數(shù),就是為了防止delegation兩端產(chǎn)生不必要的循環(huán)引用搓茬。 如果一個(gè)UITableViewController 對(duì)象a通過(guò)retain獲取了UITableView對(duì)象b的所有權(quán),這個(gè)UITableView對(duì)象b的 delegate又是a,如果這個(gè)delegate是retain方式的,那基本上就沒(méi)有機(jī)會(huì)釋放這兩個(gè)對(duì)象了。自己在設(shè)計(jì)使用 delegate模式時(shí),也要注意這點(diǎn)队他。
15卷仑、ObjC中,與retain配對(duì)使用的方法是dealloc還是release,為什么?需要與alloc配對(duì)使用的方法是dealloc還是release,為什么?
與retain配對(duì)使用的方法是release, 因?yàn)閞etain使retainCount計(jì)數(shù)加1, release使retainCount計(jì)數(shù)減1; 與 retain語(yǔ)義相反的是release。
與alloc配對(duì)使用的是release, 因?yàn)?alloc是使retainCount計(jì)數(shù)加1, 使retainCount計(jì)數(shù)減1麸折。與alloc語(yǔ)義相反的是dealloc,因?yàn)?alloc是創(chuàng)建一個(gè)對(duì)象, dealloc是銷毀一個(gè)對(duì)象锡凝。
16、重寫一個(gè)NSStrng類型的,retain方式聲明name屬性的setter和getter方法
{ NSString * _name; }
@property NSString *name;----加上這些是為了避免錯(cuò)誤
// setter方法:
- (void)setName:(NSString*)name {
{
[_name release];
_name=[name retain];
}
}
// getter方法
- (NSString*)name {
if(_name!=name){ }
return _name;
}
17垢啼、分別描述內(nèi)存管理要點(diǎn)窜锯、autorelease、release芭析、NSAutoreleasePool?并說(shuō)明autorelease是什 么時(shí)候被release的?簡(jiǎn)述什么時(shí)候由你負(fù)責(zé)釋放對(duì)象,什么時(shí)候不由你釋放?[NSAutoreleasePool release] 和[NSAutoreleasePool drain]有什么區(qū)別?
內(nèi)存管理要點(diǎn):
Objective-C 使用引用計(jì)數(shù)機(jī)制(retainCount)來(lái)管理內(nèi)存锚扎。內(nèi)存每被引用一次,該內(nèi)存的引用計(jì)數(shù)+1,每被釋放一次引 用計(jì)數(shù)-1。當(dāng)引用計(jì)數(shù) = 0 的時(shí)候,調(diào)用該對(duì)象的 dealloc 方法,來(lái)徹底從內(nèi)存中刪除該對(duì)象馁启。
alloc,allocWithZone,new(帶初始化)時(shí):該對(duì)象引用計(jì)數(shù) +1;
retain:手動(dòng)為該對(duì)象引用計(jì)數(shù) +1;
copy:對(duì)象引用計(jì)數(shù) +1;
mutableCopy:生成一個(gè)新對(duì)象,新對(duì)象引用計(jì)數(shù)為1;
release:手動(dòng)為該對(duì)象引用計(jì)數(shù) -1;
autorelease:把該對(duì)象放入自動(dòng)釋放池,當(dāng)自動(dòng)釋放池釋放時(shí),其內(nèi)的對(duì)象引用計(jì)數(shù) -1驾孔。
NSAutoreleasePool: NSAutoreleasePool是通過(guò)接收對(duì)象向它發(fā)送的autorelease消息,記錄該對(duì)象的release消息,當(dāng)自動(dòng)釋放池被銷毀 時(shí),會(huì)自動(dòng)向池中的對(duì)象發(fā)送release消息。autorelease
是在自動(dòng)釋放池被銷毀,向池中的對(duì)象發(fā)送release
只能釋放自己擁有的對(duì)象, 區(qū)別是:在引用計(jì)數(shù)環(huán)境下(在不使用ARC情況下),兩者基本一樣,在GC環(huán)境下,release 是一個(gè)no-op(無(wú)效操作),所以無(wú)論是不是gc都使用drain
18 IPhone OS有沒(méi)有垃圾回收?autorelease 和垃圾回收制(gc)有什么關(guān)系?
沒(méi)有。autorelease只是延遲釋放,gc是每隔一段時(shí)間詢問(wèn)程序,看是否有無(wú)指針指向的對(duì)象,若有,就將它回收翠勉。他們兩者沒(méi)有什么關(guān)系妖啥。
19、drawRect和layoutSubviews的區(qū)別
兩個(gè)方法都是異步執(zhí)行的,layoutSubviews方便數(shù)據(jù)計(jì)算,drawRect方便視圖重繪眉菱。 layoutSubviews對(duì)subviews重新布局layoutSubviews方法調(diào)用先于drawRect
20迹栓、簡(jiǎn)述NotificationCenter、KVC俭缓、KVO克伊、Delegate?并說(shuō)明它們之間的區(qū)別?
Notification 是觀察者模式的實(shí)現(xiàn), KVO是觀察者模式的OB-C底層實(shí)現(xiàn)。NOtification 通過(guò) Notifydcation addobserver 和 remove observer 工作华坦。
KVO是鍵值監(jiān)聽(tīng),鍵值觀察機(jī)制,提供了觀察某一屬性變化的方法. KVC是鍵值編碼,是一種間接訪問(wèn)對(duì)象的屬性,使用字符串來(lái)標(biāo)示屬性(例如:setValue:forKey:)
Delegate:把某個(gè)對(duì)象要做的事情委托給別的對(duì)象去做愿吹。那么別的對(duì)象就是這個(gè)對(duì)象的代理,代替它來(lái)打理要做的事。反映到程序中,首先要明確一個(gè)對(duì)象的委托方是哪個(gè)對(duì)象,委托所做的內(nèi)容是什么惜姐。
21犁跪、線程與進(jìn)程的區(qū)別和聯(lián)系?
線程是進(jìn)程的基本單位, 進(jìn)程和線程都是由操作系統(tǒng)所體會(huì)的程序運(yùn)行的基本單元, 系統(tǒng)利用該基本單元實(shí)現(xiàn)系統(tǒng)對(duì)應(yīng)用的并發(fā)性。
進(jìn)程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式歹袁。
- 進(jìn)程有獨(dú)立的地址空間,一個(gè)進(jìn)程崩潰后,在保護(hù)模式下 不會(huì)對(duì)其它進(jìn)程產(chǎn)生影響, 而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑坷衍。
2)線程有自己的堆棧和局部變量,但線程之間沒(méi)有單獨(dú)的地址空間,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健壯,但在進(jìn)程切換時(shí),耗費(fèi)資源較大,效率要差一些。但對(duì)于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程,不能用進(jìn)程条舔。
22枫耳、簡(jiǎn)述多線程的作用以及什么地方會(huì)用到多線程?OC實(shí)現(xiàn)多線程的方法有哪些?談?wù)劧嗑€程安全問(wèn)題的幾種解決方案?何為線程同步,如何實(shí)現(xiàn)的?分線程回調(diào)主線程方法是什么,有什么作用?
(1)、多線程的作用:可以解決負(fù)載均衡問(wèn)題,充分利用cpu資源 孟抗。為了提高CPU的使用率,采用多線程的方式去同時(shí)完 成幾件事情而互不干擾,
(2)迁杨、大多情況下,要用到多線程的主要是需要處理大量的IO操作時(shí)或處理的情況需要花大量的時(shí)間等等,比如:讀寫文 件、視頻圖像的采集凄硼、處理铅协、顯示、保存等摊沉。
(3)狐史、ios有三種主要方法:1、NSThread说墨。2骏全、NSOperation。3婉刀、GCD吟温。
(4)序仙、解決方案:使用鎖:鎖是線程編程同步工具的基礎(chǔ)突颊。鎖可以讓你很容易保護(hù)代碼中一大塊區(qū)域以便你可以確保代碼的正 確性。使用POSIX互斥鎖;使用NSLock類;使用@synchronized指令等。
(5)律秃、回到主線程的方法: dispatch_async(dispatch_get_main_queue(), ^{ });
作用:主線程是顯示UI界面,子線程多數(shù)是進(jìn)行數(shù)據(jù)處理
23爬橡、http和scoket通信的區(qū)別?socket連接相關(guān)庫(kù),TCP,UDP的連接方法,HTTP的幾種常用方式?
http和scoket通信的區(qū)別:
http是客戶端用http協(xié)議進(jìn)行請(qǐng)求,發(fā)送請(qǐng)求時(shí)候需要封裝http請(qǐng)求頭,并綁定請(qǐng)求的數(shù)據(jù),服務(wù)器一般有web服務(wù)器配合(當(dāng)然也非絕對(duì))。 http請(qǐng)求方式為客戶端主動(dòng)發(fā)起請(qǐng)求,服務(wù)器才能給響應(yīng),一次請(qǐng)求完畢后則斷開(kāi)連接,以節(jié)省資源棒动。服務(wù)器不能主動(dòng)給客戶端響應(yīng)(除非采取http長(zhǎng)連接技術(shù))糙申。iphone主要使用類是NSUrlConnection。
scoket是客戶端跟服務(wù)器直接使用socket“套接字”進(jìn)行連接,并沒(méi)有規(guī)定連接后斷開(kāi),所以客戶端和服務(wù)器可以保持連 接通道,雙方都可以主動(dòng)發(fā)送數(shù)據(jù)船惨。一般在游戲開(kāi)發(fā)或股票開(kāi)發(fā)這種要求即時(shí)性很強(qiáng)并且保持發(fā)送數(shù)據(jù)量比較大的場(chǎng)合使用柜裸。主要使用類是CFSocketRef。
UDP:是用戶數(shù)據(jù)報(bào)協(xié)議:主要用在實(shí)時(shí)性要求高以及對(duì)質(zhì)量相對(duì)較弱的地方,但面對(duì)現(xiàn)在高質(zhì)量的線路不是容易丟包除非 是一些擁塞條件下 ,如流媒體
TCP:是傳輸控制協(xié)議:是面連接的,那么運(yùn)行環(huán)境必然要求其可靠性不可丟包有良好的擁塞控制機(jī)制如http ftp telnet 等,
http的常用方式:get,post
24粱锐、What is lazy loading?
就是懶加載,只在用到的時(shí)候才去初始化疙挺。也可以理解成延時(shí)加載。 我覺(jué)得最好也最簡(jiǎn)單的一個(gè)列子就是tableView中圖片的加載顯示了怜浅。 一個(gè)延時(shí)載,避免內(nèi)存過(guò)高,一個(gè)異步加載,避免線程堵塞铐然。
25、你連接服務(wù)器用的是什么方法,如果請(qǐng)求過(guò)程中,網(wǎng)絡(luò)出了問(wèn)題這么辦?
NSUrlConnection 連接后,有一系列委托方法來(lái)接受來(lái)自服務(wù)器的響應(yīng)和數(shù)據(jù),其中接受相應(yīng)的方法回得到服務(wù)器要傳回的數(shù)據(jù)有多大,接受數(shù)據(jù)的方法會(huì)反復(fù)調(diào)用來(lái)不斷接受服務(wù)器數(shù)據(jù),如果網(wǎng)絡(luò)出了問(wèn)題了,會(huì)調(diào)用一個(gè)方法讓你來(lái)做相關(guān)處理恶座。
26搀暑、OC有多繼承嗎?沒(méi)有的話可以用什么方法替---多繼承即一個(gè)子類可以有多個(gè)父類,它繼承了多個(gè)父類的特性。
Object-c的類沒(méi)有多繼承,只支持單繼承,如果要實(shí)現(xiàn)多繼承的話,可以通過(guò)類別和協(xié)議的方式來(lái)實(shí)現(xiàn),OC類似于多繼承,是在用protocol委托代理來(lái)實(shí)現(xiàn)的;可以實(shí)現(xiàn)多個(gè)接口,通過(guò)實(shí)現(xiàn)多個(gè)接口可以完成C++的多重繼承;
Category是類別,一 般情況用分類好,用Category去重寫類的方法,僅對(duì)本Category有效,不會(huì)影響到其他類與原有類的關(guān)系跨琳。
27自点、什么是Protocol?什么是代理?寫一個(gè)委托的interface?委托的property聲明用什么屬性?為什么?
Protocol:一個(gè)方法簽名的列表,在其中可以定義若干個(gè)方法。根據(jù)配置,遵守協(xié)議的類,會(huì)實(shí)現(xiàn)這個(gè)協(xié)議中的若干個(gè)方法湾宙。
代理:實(shí)現(xiàn)這個(gè)協(xié)議中的方法的類委托的
interface:聲明一個(gè)某協(xié)議的屬性
delagate用assgin屬性,原因是,為了避免循環(huán)引用樟氢。
28、分別描述類別(categories)和延展(extensions)是什么?以及兩者的區(qū)別?繼承和類別在實(shí)現(xiàn)中有何區(qū)別?為什么Category只能為對(duì)象添加方法,卻不能添加成員變量?
類別(categories):在沒(méi)有原類.m文件的基礎(chǔ)上,給該類添加方法;
延展(extensions):一種特殊形式的類別,主要在一個(gè)類的.m文件里聲明和實(shí)現(xiàn)延展的作用,就是給某類添加私有方法或是私有變量侠鳄。
類別與延展兩者區(qū)別:延展可以添加屬性并且它添加的方法是必須要實(shí)現(xiàn)的埠啃。延展可以認(rèn)為是一個(gè)私有的類目。
繼承和類別在實(shí)現(xiàn)中的區(qū)別:類別可以在不獲悉,不改變?cè)瓉?lái)代碼的情況下往里面添加新的方法,只能添加,不能刪除修改伟恶。并且如果類別和原來(lái)類中的方法產(chǎn)生名稱沖突,則類別將覆蓋原來(lái)的方法,因?yàn)轭悇e具有更高的優(yōu)先級(jí)碴开。
Category只能為對(duì)象添加方法,卻不能添加成員變量的原因:如果可以添加成員變量,添加的成員變量沒(méi)有辦法初始化----這是語(yǔ)言規(guī)則
29、寫一個(gè)NSString類的實(shí)現(xiàn)
+ (id)initWithCString:(constchar *)nullTerminatedCString encoding:
(NSStringEncoding)encoding {
NSString *obj;
obj = [self allocWithZone: NSDefaultMallocZone()];
obj = [obj initWithCString: nullTerminatedCString encoding: encoding];
return [obj autorelease];
}
30博秫、Objective-C有私有方法么?私有變量呢?如多沒(méi)有的話,有沒(méi)有什么代替的方法?
objective-c類里面的方法只有兩種, 靜態(tài)方法和實(shí)例方法
.但是可以通過(guò)把方法的聲明和定義都放在.m文件中來(lái)實(shí)現(xiàn)一個(gè)表面上的私有方法潦牛。有私有變量,可以通過(guò)@private來(lái)修飾,或者把聲明放到.m文件中。在Objective‐C中,所有實(shí)例變量默認(rèn)都是私有的,所有實(shí)例方法默認(rèn)都是公有的
31挡育、#import巴碗、#include和@class有什么區(qū)別
@class一般用于頭文件中需要聲明該類的某個(gè)實(shí)例變量的時(shí)候用到,它只是聲明了一個(gè)類名,關(guān)于這個(gè)類的內(nèi)部實(shí)現(xiàn)都沒(méi)有告訴編譯器,在m文件中還是需要使用#import。
而#import比起#include的好處就是不會(huì)引起交叉編譯即寒。
32橡淆、談?wù)勀銓?duì)MVC的理解?為什么要用MVC?在Cocoa中MVC是怎么實(shí)現(xiàn)的?你還熟悉其他的OC設(shè)計(jì)模式或別的設(shè)計(jì)模式嗎?
MVC就是Model-View-Controller的縮寫,M指的是業(yè)務(wù)模型,V指的是用戶頁(yè)面,C指的是控制器召噩。
MVC是架構(gòu)模式,是講M和 V的代碼分離,從而使同那個(gè)一個(gè)程序可以使用不同的表現(xiàn)形式。 M:表示數(shù)據(jù)和業(yè)務(wù)規(guī)則, V是用戶看到的并與之交互的頁(yè)面, C是接受用戶的輸入并調(diào)用M和V取完成用戶需求的單例,代理,觀察者,工廠模式等
單例模式
:說(shuō)白了就是一個(gè)類不通過(guò)alloc方式創(chuàng)建對(duì)象,而是用一個(gè)靜態(tài)方法返回這個(gè)類的對(duì)象逸爵。系統(tǒng)只需要擁有一個(gè)的 全局對(duì)象,這樣有利于我們協(xié)調(diào)系統(tǒng)整體的行為;
代理模式
:代理模式給某一個(gè)對(duì)象提供一個(gè)代理對(duì)象,并由代理對(duì)象控制對(duì)源對(duì)象的引用.比如一個(gè)工廠生產(chǎn)了產(chǎn)品,并不想 直接賣給用戶,而是搞了很多代理商,用戶可以直接找代理商買東西,代理商從工廠進(jìn)貨.常見(jiàn)的如QQ的自動(dòng)回復(fù)就屬于代理攔截,代理模式在iphone中得到廣泛應(yīng)用.
觀察者模式
: 當(dāng)一個(gè)物體發(fā)生變化時(shí),會(huì)通知所有觀察這個(gè)物體的觀察者讓其做出反應(yīng)具滴。實(shí)現(xiàn)起來(lái)無(wú)非就是把所有觀察者的對(duì)象給這個(gè)物體,當(dāng)這個(gè)物體的發(fā)生改變,就會(huì)調(diào)用遍歷所有觀察者的對(duì)象調(diào)用觀察者的方法從而達(dá)到通知觀察者的目的;
33、如監(jiān)測(cè)系統(tǒng)鍵盤的彈出
- (id) init {
self = [super init];
if (self) {
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(keyboardDidShow) name:UIKeyboardDidShowNotification object:nil];
[center addObserver:self selector:@selector(keyboardDidHide) name:UIKeyboardWillHideNotification object:nil]; _keyboardIsVisible = NO;
}
return self;
}
- (void)keyboardDidShow { _keyboardIsVisible = YES; }
- (void)keyboardDidHide { _keyboardIsVisible = NO; }
- (BOOL)keyboardIsVisible { return _keyboardIsVisible; }
34师倔、objective-c中的詞典對(duì)象构韵、可變?cè)~典對(duì)象是哪個(gè),初始化一個(gè)含有兩個(gè)鍵值對(duì)的可變?cè)~典對(duì)象,并動(dòng)態(tài)的添 加和刪除一條記錄,輸出第一條記錄
詞典NSDictionary,可變?cè)~典NSMutableDictionary,
// 初始化一個(gè)可變?cè)~典,帶有2個(gè)鍵值對(duì)
NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2",nil];
// 添加
[dic setObject:@"value3" forKey:@"key3"];
// 刪除
[dic removeObjectForKey:@"key3"];
// 獲取(按key獲取)
[dic objectForKey:@"key1"];
35、c和obj-c如何混用?
- obj-c的編譯器處理后綴為m的文件時(shí),可以識(shí)別obj-c和c的代碼,處理mm文件可以識(shí)別obj-c,c,c++代碼,但cpp文件必須只能用c/c++代碼,而且cpp文件include的頭文件中,也不能出現(xiàn)obj- c的代碼,因?yàn)閏pp只是cpp趋艘。
- 在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是問(wèn)題
- 在cpp中混用obj- c其實(shí)就是使用obj-c編寫的模塊是我們想要的疲恢。如果模塊以類實(shí)現(xiàn),那么要按照cpp class的標(biāo)準(zhǔn)寫類的定義,頭文件中不能出現(xiàn)obj-c的東西,包括#import cocoa的。 實(shí)現(xiàn)文件中,即類的實(shí)現(xiàn)代碼中可以使用obj-c的東西,可以import,只是后綴是mm瓷胧。如果模塊以函數(shù)實(shí)現(xiàn),那么頭文件要按 c的格 式聲明函數(shù),實(shí)現(xiàn)文件中,c++函數(shù)內(nèi)部可以用obj-c,但后綴還是mm或m冈闭。
總結(jié):只要cpp文件和cpp include的文件中不包含 obj-c的東西就可以用了,cpp混用obj-c的關(guān)鍵是使用接口,而不能直接使用實(shí)現(xiàn)代碼,實(shí)際上cpp混用的是obj-c編譯后的o文 件,這個(gè)東西其實(shí)是無(wú)差別的,所以可以用。obj-c的編譯器支持cpp抖单。
36萎攒、舉出5個(gè)以上你所熟悉的ios sdk庫(kù)有哪些和第三方庫(kù)有哪些?
1)ios-sdk: Foundation.framework, CoreGraphics.framework, UIKit.framework, MediaPlayer.framework, CoreAudio.framework
2)第三方庫(kù):
1.json編碼解碼;
2.ASIHTTPRequest等相關(guān)協(xié)議封裝; 3.EGORefreshTableHeaderView下拉刷新代碼;
4.AsyncImageView 異步加載圖片并緩存;
5.SDWebImage——簡(jiǎn)化網(wǎng)絡(luò)圖片處理
37、objc優(yōu)缺點(diǎn)----
OC的特點(diǎn):id類型,動(dòng)態(tài)objc
優(yōu)點(diǎn):1)Cateogies 2)Posing 3)動(dòng)態(tài)識(shí)別 4)指標(biāo)計(jì)算 5)彈性訊息傳遞6)不是一個(gè)過(guò)度復(fù)雜的C衍生語(yǔ)言 7)Objective-C與C++可混合編程
缺點(diǎn):1)不支援命名空間 2)不支持運(yùn)算符重載 3)不支持多重繼承 4)使用動(dòng)態(tài)運(yùn)行時(shí)類型,所有的方法都是函數(shù)調(diào)用,所以很多編譯時(shí)優(yōu)化 方法都用不到矛绘。(如內(nèi)聯(lián)函數(shù)等),性能低劣耍休。
38、UITableView的重用機(jī)制?如何在一個(gè)view上顯示多個(gè)tableView,tableView要求不同的數(shù)據(jù)源以及不同的樣式 (要求自定義cell), 如何組織各個(gè)tableView的delegate和dataSource?請(qǐng)說(shuō)說(shuō)實(shí)現(xiàn)思路?在一個(gè)tableView 中需要自定義多種樣式的cell(兩種或三種),通常你如何實(shí)現(xiàn),說(shuō)說(shuō)思路即可?UITableView的那些元素是可以定義的?
UITableView的重用機(jī)制:
查看UITableView頭文件,會(huì)找到NSMutableArrayvisiableCells,和NSMutableArrayreusableTableCells兩個(gè)結(jié)構(gòu)货矮。visiableCells內(nèi)保存當(dāng)前顯示的cells,reusableTableCells保存可重用的cells羊精。 TableView顯示之初,reusableTableCells為空,那么tableView dequeueReusableCellWithIdentifier:CellIdentifier返回nil。開(kāi)始的cell都 是通過(guò) [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] 來(lái)創(chuàng) 建,而且cellForRowAtIndexPath只是調(diào)用最大顯示cell數(shù)的次數(shù)囚玫。 比如:有100條數(shù)據(jù),iPhone一屏最多顯示10個(gè)cell喧锦。程序最開(kāi)始顯示TableView的情況是:
- 用[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] 創(chuàng)建10次cell,并給cell指定同樣的重用標(biāo)識(shí)(當(dāng)然,可以為不同顯示類型的cell指定不同的標(biāo)識(shí))。并且10個(gè)cell全部都加 入到 visiableCells數(shù)組,reusableTableCells為空抓督。2. 向下拖動(dòng)tableView,當(dāng)cell1完全移出屏幕,并且 cell11(它也是alloc出來(lái)的,原因同上)完全顯示出來(lái)的時(shí)候燃少。 cell11加入到visiableCells,cell1移出 visiableCells,cell1加入到reusableTableCells。
- 接著向下拖動(dòng)tableView,因?yàn)閞eusableTableCells中已 經(jīng)有值,所以,當(dāng)需要顯示新的cell, cellForRowAtIndexPath再次被調(diào)用的時(shí) 候,tableView dequeueReusableCellWithIdentifier:CellIdentifier,返回cell1铃在。 cell1加入到visiableCells,cell1 移出reusableTableCells;cell2移出 visiableCells,cell2加入到reusableTableCells阵具。之后再需要顯示的Cell就可 以正常重用了
39、一個(gè)tableView是否可以關(guān)聯(lián)兩個(gè)不同的數(shù)據(jù)源?你會(huì)怎么處理? 首先從代碼來(lái)看,數(shù)據(jù)源如何關(guān)聯(lián)上的,其次是在數(shù)據(jù)源關(guān)聯(lián)的代理方法里實(shí)現(xiàn)的定铜。 - (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if(indexPath.section == 0) {}if(indexPath.section == 1) {}
}
40阳液、OC中有哪些數(shù)據(jù)存儲(chǔ)方式,各有什么區(qū)別?四種存儲(chǔ)方式: 1.NSUserDefaults,用于存儲(chǔ)配置信息 2.SQLite,用于存儲(chǔ)查詢需求較多的數(shù)據(jù) 3.CoreData,用于規(guī)劃應(yīng)用中的對(duì)象 4.使用基本對(duì)象類型定制的個(gè)性化緩存方案. NSUserDefaults:對(duì)象中儲(chǔ)存了系統(tǒng)中用戶的配置信息,開(kāi)發(fā)者可以通過(guò)這個(gè)實(shí)例對(duì)象對(duì)這些已有的信息進(jìn)行修改,也可以按照自己的需求創(chuàng)建新的配置項(xiàng)。 SQLite擅長(zhǎng)處理的數(shù)據(jù)類型其實(shí)與NSUserDefaults差不多,也是基礎(chǔ)類型的小數(shù)據(jù),只是從組織形式上不同揣炕。開(kāi)發(fā)者可 以以關(guān)系型數(shù)據(jù)庫(kù)的方式組織數(shù)據(jù),使用SQL DML來(lái)管理數(shù)據(jù)帘皿。一般來(lái)說(shuō)應(yīng)用中的格式化的文本類數(shù)據(jù)可以存放在數(shù)據(jù)庫(kù) 中,尤其是類似聊天記錄、Timeline等這些具有條件查詢和排序需求的數(shù)據(jù)畸陡。 CoreData是一個(gè)管理方案,它的持久化可以通過(guò)SQLite鹰溜、XML或二進(jìn)制文件儲(chǔ)存越庇。它可以把整個(gè)應(yīng)用中的對(duì)象建模并進(jìn) 行自動(dòng)化的管理。從歸檔文件還原模型時(shí)CoreData并不是一次性把整個(gè)模型中的所有數(shù)據(jù)都載入內(nèi)存,而是根據(jù)運(yùn)行時(shí)狀 態(tài),把被調(diào)用到的對(duì)象實(shí)例載入內(nèi)存奉狈。框架會(huì)自動(dòng)控制這個(gè)過(guò)程,從而達(dá)到控制內(nèi)存消耗,避免浪費(fèi)涩惑。 無(wú)論從設(shè)計(jì)原理還是使用方法上看,CoreData都比較復(fù)雜仁期。因此,如果僅僅是考慮緩存數(shù)據(jù)這個(gè)需求,CoreData絕對(duì)不 是一個(gè)優(yōu)選方案。CoreData的使用場(chǎng)景在于:整個(gè)應(yīng)用使用CoreData規(guī)劃,把應(yīng)用內(nèi)的數(shù)據(jù)通過(guò)CoreData建模,完全 基于CoreData架構(gòu)應(yīng)用竭恬。 使用基本對(duì)象類型定制的個(gè)性化緩存方案:從需求出發(fā)分析緩存數(shù)據(jù)有哪些要求:按Key查找,快速讀取,寫入不影響正常 操作,不浪費(fèi)內(nèi)存,支持歸檔跛蛋。這些都是基本需求,那么再進(jìn)一步或許還需要固定緩存項(xiàng)數(shù)量,支持隊(duì)列緩存,緩存過(guò)期 等。
41痊硕、ios平臺(tái)怎么做數(shù)據(jù)的持久化?coredata和sqlite有無(wú)必然聯(lián)系?coredata是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)嗎? iOS中可以有四種持久化數(shù)據(jù)的方式: 屬性列表赊级、對(duì)象歸檔、SQLite3和Core Data coredata可以使你以圖形界面的方式快速的定義app的數(shù)據(jù)模型,同時(shí)在你的代碼中容易獲取到它岔绸。coredata提供了基礎(chǔ)結(jié)構(gòu)去處 理常用的功能,例如保存,恢復(fù),撤銷和重做,允許你在app中繼續(xù)創(chuàng)建新的任務(wù)理逊。在使用coredata的時(shí)候,你不用安裝額外的數(shù)據(jù) 庫(kù)系統(tǒng),因?yàn)閏oredata使用內(nèi)置的sqlite數(shù)據(jù)庫(kù)。coredata將你app的模型層放入到一組定義在內(nèi)存中的數(shù)據(jù)對(duì)象盒揉。coredata會(huì) 追蹤這些對(duì)象的改變,同時(shí)可以根據(jù)需要做相應(yīng)的改變,例如用戶執(zhí)行撤銷命令晋被。當(dāng)coredata在對(duì)你app數(shù)據(jù)的改變進(jìn)行保存的時(shí) 候,core data會(huì)把這些數(shù)據(jù)歸檔,并永久性保存。mac os x中sqlite庫(kù),它是一個(gè)輕量級(jí)功能強(qiáng)大的關(guān)系數(shù)據(jù)引擎,也很容易嵌入到應(yīng)用程序刚盈∠勐澹可以在多個(gè)平臺(tái)使用,sqlite是一個(gè)輕 量級(jí)的嵌入式sql數(shù)據(jù)庫(kù)編程。與coredata框架不同的是,sqlite是使用程序式的,sql的主要的API來(lái)直接操作數(shù)據(jù)表藕漱。Core Data不是一個(gè)關(guān)系型數(shù)據(jù)庫(kù),也不是關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)欲侮。雖然Core Dta支持SQLite作為一種存儲(chǔ)類型, 但它不能使用任意的SQLite數(shù)據(jù)庫(kù)。Core Data在使用的過(guò)程種自己創(chuàng)建這個(gè)數(shù)據(jù)庫(kù)肋联。Core Data支持對(duì)一威蕉、對(duì)多的關(guān)系。
42橄仍、OC中的數(shù)字對(duì)象都有哪些,簡(jiǎn)述它們與基本數(shù)據(jù)類型的區(qū)別是什么Objective-C中的數(shù)字對(duì)象NSNumber; Objective-C中的基本類型和C語(yǔ)言中的基本類型一樣.主要有:int,long,float,double,char,void,bool等. 對(duì)于基本類型變量,不需要用指針,也不用手動(dòng)回收,方法執(zhí)行結(jié)束會(huì)自動(dòng)回收.數(shù)字對(duì)象需要指針,也需要手動(dòng)回收內(nèi)存忘伞。
43、什么是動(dòng)態(tài)識(shí)別,動(dòng)態(tài)綁定?延展--程序的編譯過(guò)程
44沙兰、單件實(shí)例是什么?Foundation 和 Application Kit 框架中的一些類只允許創(chuàng)建單件對(duì)象,即這些類在當(dāng)前進(jìn)程中的唯一實(shí)例氓奈。舉例來(lái)說(shuō), NSFileManager 和NSWorkspace 類在使用時(shí)都是基于進(jìn)程進(jìn)行單件對(duì)象的實(shí)例化。當(dāng)向這些類請(qǐng)求實(shí)例的時(shí)候,它們 會(huì)向您傳遞單一實(shí)例的一個(gè)引用,如果該實(shí)例還不存在,則首先進(jìn)行實(shí)例的分配和初始化鼎天。單件對(duì)象充當(dāng)控制中心的角色, 負(fù)責(zé)指引或協(xié)調(diào)類的各種服務(wù)舀奶。
45、如何將產(chǎn)品進(jìn)行多語(yǔ)言發(fā)布?程序國(guó)際化;比如:本地化應(yīng)用程序名稱(1斋射、選中工程,Info—Localizations點(diǎn)擊“+”添加要國(guó)際化的語(yǔ)言育勺。
(2但荤、在InfoPlist.strings右邊會(huì)多出一個(gè)三角形,點(diǎn)擊展開(kāi)可看到InfoPlish.strings(english)和
InfoPlish.strings(chinese)兩個(gè)版本的文件;
(3、在InfoPlish.strings(english)文件中加入:
CFBundleDisplayName ="Program"; 其中“Program”為英文應(yīng)用程序名稱,同理在InfoPlish.strings(chinese)文件中加入: CFBundleDisplayName ="應(yīng)用程序"; 其中“應(yīng)用程序”為中文名稱,注意:CFBundleDisplayName加不加雙引號(hào)都行;
(4涧至、編輯Info.plist,添加一個(gè)新的屬性Application has localized display name, 設(shè)置其類型為boolean,并將其 value設(shè)置為YES即可腹躁。
46、什么是動(dòng)態(tài)鏈接庫(kù)和靜態(tài)鏈接庫(kù)?調(diào)用一個(gè)類的靜態(tài)方法需不需要release? 程序的編譯過(guò)程--鏈接--- 靜態(tài)連接庫(kù)就是把(lib)文件中用到的函數(shù)代碼直接鏈接進(jìn)目標(biāo)程序,程序運(yùn)行的時(shí)候不再需要其它的庫(kù)文件;動(dòng)態(tài)鏈接就是 把調(diào)用的函數(shù)所在文件模塊 (DLL)和調(diào)用函數(shù)在文件中的位置等信息鏈接進(jìn)目標(biāo)程序,程序運(yùn)行的時(shí)候再?gòu)腄LL中尋找 相應(yīng)函數(shù)代碼,因此需要相應(yīng)DLL文件的支持南蓬。 靜態(tài)鏈接庫(kù)和動(dòng)態(tài)鏈接庫(kù)的另外一個(gè)區(qū)別在于靜態(tài)鏈接庫(kù)中不能再包含其他的動(dòng)態(tài)鏈接庫(kù)或者靜態(tài)庫(kù),而在動(dòng)態(tài)鏈接庫(kù)中還 可以再包含其他的動(dòng)態(tài)或靜態(tài)鏈接庫(kù)纺非。
動(dòng)態(tài)的是:運(yùn)行時(shí)才加載到內(nèi)存中,靜態(tài):編譯時(shí)就加載到內(nèi)存中 靜態(tài)方法也就是類方法,不需要release
47、聲明一個(gè)靜態(tài)方法和一個(gè)實(shí)例方法? 解釋:就是類方法和對(duì)象方法,
48赘方、什么是push?遠(yuǎn)程推送?第一步:UIApplication向APNS注冊(cè)push notification服務(wù)1烧颖、應(yīng)用程序 要支持 推送服務(wù)(在網(wǎng)頁(yè)里配置)
(1)https://developer.apple.com/devcenter/ios/index.action(2)登錄 蘋果開(kāi)發(fā)者賬號(hào)(注意是收費(fèi)賬號(hào),$99或$299)
(3)下載push證書(主要是給程序簽名,push服務(wù)只有收費(fèi)開(kāi)發(fā)者才具備。所以需要簽名驗(yàn)證),如果沒(méi)有 push證書,創(chuàng)建一個(gè)push證書(App ID->鑰匙串程序生成request->push證書)注意事項(xiàng):App ID的 Bundle ID必須和程序plist文件里的Bundle identifier一致窄陡。App ID一旦生成,將不可修改炕淮。
(4)把證書安裝到鑰匙串里(雙擊證書文件)(5)生成 編譯程序 用的描述文件(網(wǎng)頁(yè)里進(jìn)行) 2、向APNS注冊(cè)push服務(wù)(UIApplication的registerForRemoteNotificationTypes:方法)第二步 獲取APNS分配的DeviceToken(64位16進(jìn)制串)- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken第三步 把DeviceToken發(fā)送給自己的后臺(tái)服務(wù)器,服務(wù)器記錄每臺(tái)設(shè)備的DeviceToken以便日后推送信息給客 戶端跳夭。(需要有一個(gè)網(wǎng)絡(luò)接口,讓客戶端發(fā)送DeviceToken)第四步 服務(wù)器推送信息給客戶端 1涂圆、服務(wù)器除了需要有客戶端的DeviceToken之外,還要有push證書,對(duì)push的內(nèi)容進(jìn)行簽名。(蘋果為了防 止 惡意向客戶端(比如DeviceToken泄露了)發(fā)送消息,每次推送消息,都需要證書進(jìn)行簽名,從而避免黑客惡 意攻擊用戶手機(jī)币叹。) 2乘综、如果你的服務(wù)器是java寫的,可以直接使用鑰匙串導(dǎo)出的p12文件(證書和密鑰一起導(dǎo)出)。如果你的服務(wù)器 是php寫的,因?yàn)閜hp語(yǔ)言不支持p12文件類型,需要轉(zhuǎn)換為pem文件套硼。3卡辰、將p12轉(zhuǎn)換為pem文件:終端 先找到你p12所在的目錄 openssl pkcs12 -in CertificateName.p12 - outCertificateName.pem -nodes4、服務(wù)器發(fā)送信息給APNS,APNS自動(dòng)將信息推送給客戶端第五步 客戶端處理收到的信息- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo注意事項(xiàng) 1邪意、測(cè)試版的push證書僅僅用于開(kāi)發(fā)期間測(cè)試,發(fā)布版的程序需要生成一個(gè)發(fā)布版的push證書九妈。 2、測(cè)試版APNS的ssl地址和發(fā)布版的ssl地址不同 3雾鬼、測(cè)試版的DeviceToken和發(fā)布版的DeviceToken也不同4萌朱、php文件要喝pem文件放在同一目錄。5策菜、除了alert sound和badge之外,json串里還可以包含自定義信息晶疼。6、推送的信息最大255字節(jié) 7又憨、推送的信息受網(wǎng)絡(luò)影響較大,有可能造成延遲甚至丟失,重要信息的傳遞不應(yīng)該使用push通知,應(yīng)該有專門的 后臺(tái)接口翠霍。
8、借助push推送,兩個(gè)客戶端可以實(shí)現(xiàn)即時(shí)通信,工程里面存放我們的p12文件,客戶端自己組織json串,發(fā) 送請(qǐng)求到APNS蠢莺。
49寒匙、什么是沙箱模型?哪些操作是屬于私有api范疇? 某個(gè)iphone工程進(jìn)行文件操作有此工程對(duì)應(yīng)的指定的位置,不能逾越。 iphone常見(jiàn)私有api的應(yīng)用(比如直接發(fā)送短信,訪問(wèn)沙箱之外的磁盤文件).
50躏将、如何將敏感字變成** 延展---幾個(gè)字變?yōu)閹讉€(gè)如何實(shí)現(xiàn)? 調(diào)用stringByReplacingOccurrencesOfString:withString:給定字符串,指定替換字,替換*
51锄弱、iphone閱讀器,如果要讀取一個(gè)文本文件,請(qǐng)問(wèn)你是如何處理編碼問(wèn)題的?另外像pdf格式的文件,你如何讀
取?
首先檢測(cè)文本編碼格式(只需讀取小部分用來(lái)判斷), iphone手機(jī)閱讀器中對(duì)于PDF格式的閱讀,可以直接用UIWebView控件顯示,也可以從網(wǎng)上下到很多直接讀取pdf格式 的代碼直接從pdf中得到數(shù)據(jù)考蕾。復(fù)雜表格動(dòng)畫- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;-(void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation: (UITableViewRowAnimation)animation;- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
52、在開(kāi)發(fā)大型項(xiàng)目的時(shí)候,如何進(jìn)行內(nèi)存泄露檢測(cè)的? 內(nèi)存泄露怎么處理?如何檢測(cè)內(nèi)存泄露:可以通過(guò)xcode的自帶工具run---start with performance tool里有instruments下有個(gè)leaks工具,啟動(dòng)此工具 后,運(yùn)行項(xiàng)目,工具里可以顯示內(nèi)存泄露的情況,雙擊可找到源碼位置,可以幫助進(jìn)行內(nèi)存泄露的處理会宪。 如何處理:先定位到具體位置, 再解決之肖卧。
53、iphone app為什么會(huì)被打回來(lái),如何制止? app的設(shè)置界面掸鹅、按鈕使用了類似iphone的操作方式以及icon的圓角設(shè)計(jì) -> 重新設(shè)計(jì)?app的年齡設(shè)置太低 -> 改了年齡?app里有實(shí)物獎(jiǎng)勵(lì) -> 免責(zé)聲明,和蘋果無(wú)關(guān)?app描述里提了后續(xù)版本的功能的字樣 -> 刪除?app有打分的功能 -> 有reject的,也有通過(guò)的?app需要使用location,沒(méi)有提示用戶 -> 加了提示,允許用戶拒絕?app沒(méi)提供測(cè)試賬號(hào) -> 提供?
app里有私有api -> 修改? 應(yīng)用內(nèi)含有有某公司LOGO的圖片,沒(méi)有該公司授權(quán)文件,被拒-> 修改?
第三方靜態(tài)庫(kù)包含私有api的調(diào)用(聯(lián)系第三方技術(shù)支持,更新靜態(tài)庫(kù)); 包含潛在的色情,暴力等內(nèi)容(調(diào)整應(yīng)用年齡限制等級(jí),并加入舉報(bào)功能) 做瀏覽器的,分級(jí)必須選17+
54塞帐、iphone應(yīng)用程序的項(xiàng)目基本結(jié)構(gòu)?· Classes -> 源程序文件(.h、.m)· Other Sources-> main.m 等,不需要程序員修改 -Prefix.pch· Resources -> 界面文件(.xib)河劝、配置文件-info.plist· Frameworks -> 鏈接的庫(kù)· Targets -> 項(xiàng)目的不同Target(資源、編譯配置不同)· Executables -> 項(xiàng)目中所有的可執(zhí)行文件 -Prefix.pch:_Prefix為所有的項(xiàng)目程序文件預(yù)先配置運(yùn)行環(huán)境的前綴標(biāo)頭,在程序運(yùn)行之前,引入所需框架中的(.h)頭文 件矛紫。這樣可以減少每個(gè)頭文件對(duì)程序編譯做出相同的定義,在巨型的應(yīng)用程序項(xiàng)目開(kāi)發(fā)中節(jié)省大量的時(shí)間,例如,程序有 100個(gè)根文件需要定義abc.h,只需要在_Preix.pch文件下建立一個(gè)對(duì)象,所有的根文件便可以重復(fù)地對(duì)程序編譯做出定 義赎瞎。
55、請(qǐng)寫出代碼,用blocks來(lái)取代上例中的protocol,并比較兩種方法的優(yōu)勢(shì)颊咬。實(shí)際應(yīng)用部分?請(qǐng)寫出代碼,用
blocks取代協(xié)議或回調(diào)方法
56务甥、你做iphone開(kāi)發(fā)時(shí)候,有哪些傳值方式,view和view之間是如何傳值的? block, target-action ,代理,屬性,
57、給定的一個(gè)字符串,判斷字符串中是否還有png,有就刪除它? NSMutableString *mstr=[NSMutableString stringWithFormat:@"ccc"];
NSRange substr = [mstr rangeOfString:@"png"]; //字符串查找,可以判斷字符串中是否有
if (substr.location != NSNotFound) {[mstr deleteCharactersInRange:substr];
}
58喳篇、編譯語(yǔ)言和解釋語(yǔ)言的區(qū)別 區(qū)別:C語(yǔ)言,OC語(yǔ)言屬于編譯語(yǔ)言;解釋語(yǔ)言:也可以理解為腳本文件,不需要編譯, 編譯型語(yǔ)言寫的程序執(zhí)行之前,需要一個(gè)專門的編譯過(guò)程,把程序編譯成為機(jī)器語(yǔ)言的文件,比如exe文件,以后要運(yùn)行的 話就不用重新翻譯了,直接使用編譯的結(jié)果就行了(exe文件),因?yàn)榉g只做了一次,運(yùn)行時(shí)不需要翻譯,所以編譯型語(yǔ) 言的程序執(zhí)行效率高,但也不能一概而論,部分解釋型語(yǔ)言的解釋器通過(guò)在運(yùn)行時(shí)動(dòng)態(tài)優(yōu)化代碼,甚至能夠使解釋型語(yǔ)言的 性能超過(guò)編譯型語(yǔ)言敞临。 解釋則不同,解釋性語(yǔ)言的程序不需要編譯,省了道工序,解釋性語(yǔ)言在運(yùn)行程序的時(shí)候才翻譯, 比如解釋性basic語(yǔ)言,專門有一個(gè)解釋器能夠直接執(zhí)行basic程序,每個(gè)語(yǔ)句都是執(zhí)行的時(shí)候才翻譯。這樣解釋性語(yǔ)言每 執(zhí)行一次就要翻譯一次,效率比較低麸澜。解釋是一句一句的翻譯挺尿。
59、對(duì)于語(yǔ)句NSString* testObject = [[NSData alloc] init];testObject 在編譯時(shí)和運(yùn)行時(shí)分別是什么類型的對(duì)
象?
編譯時(shí)是NSString,運(yùn)行時(shí)是NSDate
60炊邦、給用戶推送的通知的偽代碼
61编矾、ViewController的 loadView, viewDidLoad,viewWillAppear,viewDidUnload,dealloc、init分別是在什么時(shí)
候調(diào)用的?在自定義ViewController的時(shí)候這幾個(gè)函數(shù)里面應(yīng)該做什么工作?
1馁害、viewDidLoad 此方法只有當(dāng)view從nib文件初始化的時(shí)候才被調(diào)用
2窄俏、viewDidUnload當(dāng)系統(tǒng)內(nèi)存吃緊的時(shí)候會(huì)調(diào)用該方法,在該方法中將所有IBOutlet(無(wú)論是property還是實(shí)例變量) 置 為nil(系統(tǒng)release view時(shí)已經(jīng)將其release掉了)在該方法中釋放其他與view有關(guān)的對(duì)象、其他在運(yùn)行時(shí)創(chuàng)建(但 非系統(tǒng)必須)的對(duì)象碘菜、在viewDidLoad中 被創(chuàng)建的對(duì)象凹蜈、緩存數(shù)據(jù)等 release對(duì)象后,將對(duì)象置為nil(IBOutlet只需要 將其置為nil,系統(tǒng)release view時(shí)已經(jīng)將其release掉了) dealloc方法,viewDidUnload和dealloc方法沒(méi)有關(guān)聯(lián),dealloc還是繼續(xù)做它該做的事情流程應(yīng)該是這樣:(loadView/nib文件)來(lái)加載view到內(nèi)存 -->viewDidLoad函數(shù)進(jìn)一步初始化這些view -->內(nèi)存不足時(shí),調(diào)用 viewDidUnload函數(shù)釋放views -->當(dāng)需要使用view時(shí)有回到第一步如此循環(huán)
4、viewWillAppear方法,視圖即將過(guò)渡到屏幕上時(shí)調(diào)用,(一般在返回需要刷新頁(yè)面時(shí),我都選擇使用代理,所以很少用到)
5忍啸、viewWillDisappear方法,這個(gè)A->B之后,A在B之后的操作
62仰坦、描述程序啟動(dòng)的順序1、main.m是程序的入口
2计雌、UIApplicationMain()創(chuàng)建應(yīng)用程序?qū)ο?并且為此對(duì)象指定委托,檢測(cè)程序的執(zhí)行,同時(shí)開(kāi)啟事件循環(huán),處理程序接收到的事 件
3缎岗、UIApplicationDelegate方法的執(zhí)行
4、加載window5白粉、指定根視圖控制器
6传泊、在指定的試圖控制器中添加控件,實(shí)現(xiàn)應(yīng)用程序界面
63鼠渺、OC中是所有對(duì)象間的交互是如何實(shí)現(xiàn)的? 通過(guò)指針實(shí)現(xiàn)的
64、objective-c中的類型轉(zhuǎn)換分為哪幾類? 可變與不可變之間的轉(zhuǎn)化; 可變與可變之間的轉(zhuǎn)化;
不可變與不可變之間眷细。
65拦盹、獲取項(xiàng)目根路徑,并在其下創(chuàng)建一個(gè)名稱為userData的目錄? // 獲取根路徑
NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:];// 創(chuàng)建文件系統(tǒng)管理器NSFileManager *fileManager = [[NSFileManager alloc] init];
// 判斷userData目錄是否存在if(![fileManager fileExistsAtPath:[NSString stringWithFormat:@"%@/userData", documentsDirectory]]) { // 不存在,創(chuàng)建一個(gè)userData目錄[fileManager createDirectoryAtPath:[NSString stringWithFormat:@"%@/userData", documentsDirectory]withIntermediateDirectories:false attributes:nil error:nil];}
66、目標(biāo)-動(dòng)作機(jī)制 目標(biāo)是動(dòng)作消息的接收者溪椎。一個(gè)控件,或者更為常見(jiàn)的是它的單元,以插座變量的形式保有其動(dòng)作消息的目標(biāo)普舆。
動(dòng)作是控件發(fā)送給目標(biāo)的消息,或者從目標(biāo)的角度看,它是目標(biāo)為了響應(yīng)動(dòng)作而實(shí)現(xiàn) 的方法。 程序需要某些機(jī)制來(lái)進(jìn)行事件和指令的 翻譯校读。這個(gè)機(jī)制就是目標(biāo)-動(dòng)作機(jī)制沼侣。參考target-action
67、淺復(fù)制和深復(fù)制的區(qū)別? 淺層復(fù)制(copy):只復(fù)制指向?qū)ο蟮闹羔?而不復(fù)制引用對(duì)象本身歉秫。//通過(guò)對(duì)象的指針來(lái)訪問(wèn)這個(gè)對(duì)象----只賦值地址 深層復(fù)制(mutableCopy):復(fù)制引用對(duì)象本身---再創(chuàng)建一個(gè)對(duì)象 意思就是有個(gè)A對(duì)象,復(fù)制一份后得到A_copy對(duì)象后,對(duì)于淺復(fù)制來(lái)說(shuō),A和A_copy指向的是同一個(gè)內(nèi)存資源,復(fù)制的 只不過(guò)是是一個(gè)指針,對(duì)象本身資源 還是只有一份,那如果我們對(duì)A_copy執(zhí)行了修改操作,那么發(fā)現(xiàn)A引用的對(duì)象同樣被修改,這其實(shí)違背了我們復(fù)制拷貝的一 個(gè)思想蛾洛。深復(fù)制就好理解了,內(nèi)存中存在了
兩份獨(dú)立對(duì)象本身。//當(dāng)修改A時(shí),A copy不變雁芙。
68轧膘、obc中可修改和不可以修改類型 可修改不可修改的集合類。這個(gè)我個(gè)人簡(jiǎn)單理解就是可動(dòng)態(tài)添加修改和不可動(dòng)態(tài)添加修改一樣兔甘。比如NSArray和 NSMutableArray谎碍。前者在初始化后的內(nèi)存控件就是固定不可變的,后者可以添加等,可以動(dòng)態(tài)申請(qǐng)新的內(nèi)存空間。
69洞焙、什么是安全釋放?[_instance release],_instance = nil;
70蟆淀、類變量的@protected ,@private,@public,@package聲明各有什么含義? 變量的作用域不同,@protected 該類和所有子類中 的方法可以直接訪問(wèn)這樣的變量,這是默認(rèn)的;@private 該類中的方法可以訪問(wèn)這樣的變量,子類不可以; @public除了自己和子類方法外,也可以被其他類或者其他模塊中的方法訪問(wèn);@package 目前尚未得出結(jié)論
71 OC中異常exception 怎么捕獲?不同的CPU結(jié)構(gòu)上開(kāi)銷怎樣?C中又什么類似的方法? 了解一下異常捕獲CPU的開(kāi)銷:
72、關(guān)于Objective-C++中的異常處理,可以相互捕獲到嗎?不可以;
73澡匪、for(int index = 0; index < 20; index ++){NSString *tempStr =
@”tempStr”;NSLog(tempStr);NSNumber *tempNumber = [NSNumber numberWithInt: 2];NSLog(tempNumber);}這段代碼有什么問(wèn)題.?會(huì)不會(huì)造成內(nèi)存泄露(多線程)?在內(nèi)存緊張的設(shè)備上做大 循環(huán)時(shí)自動(dòng)釋放池是寫在循環(huán)內(nèi)好還是循環(huán)外好?為什么?
74扳碍、什么是序列化或者Acrchiving,可以用來(lái)做什么,怎樣與copy結(jié)合,原理是什么?.序列化就是:歸檔
75、runloop是什么?在主線程中的某個(gè)函數(shù)里調(diào)用了異步函數(shù),怎么樣block當(dāng)前線程,且還能響應(yīng)當(dāng)前線程的
timer事件,touch事件等.---NSRunLoop,NSTimer需要自己實(shí)現(xiàn)----GCD的返回主線程的方法,看前面的題
run loop,正如其名稱所示,是線程進(jìn)入和被線程用來(lái)響應(yīng)事件以及調(diào)用事件處理函數(shù)的地方仙蛉。需要在代碼中使用控制語(yǔ)句實(shí)現(xiàn)run loop的循環(huán),也就是說(shuō),需要代碼提供while 或者 for循環(huán)來(lái)驅(qū)動(dòng)run loop笋敞。在這個(gè)循環(huán)中,使用一個(gè) runloop對(duì)象[NSRunloop currentRunloop]執(zhí)行接收消息,調(diào)用對(duì)應(yīng)的處理函數(shù)。
76荠瘪、描述下拉刷新的實(shí)現(xiàn)機(jī)制?
獲取數(shù)據(jù),刷新頁(yè)面
77夯巷、什么是沙盒?沙盒包含哪些文件,描述每個(gè)文件的使用場(chǎng)景。如何獲取這些文件的路徑?如何獲取應(yīng)用程序包 中文件的路徑?
沙盒是某個(gè)iphone工程進(jìn)行文件操作有此工程對(duì)應(yīng)的指定的位置,不能逾越哀墓。 包括:四個(gè)文件夾:documents,tmp,app,Library趁餐。 手動(dòng)保存的文件在documents文件里。 Nsuserdefaults保存的文件在tmp文件夾里篮绰。
Documents 目錄:您應(yīng)該將所有de應(yīng)用程序數(shù)據(jù)文件寫入到這個(gè)目錄下后雷。這個(gè)目錄用于存儲(chǔ)用戶數(shù)據(jù)或其它應(yīng)該定期備 份的信息。AppName.app 目錄:這是應(yīng)用程序的程序包目錄,包含應(yīng)用程序的本身。由于應(yīng)用程序必須經(jīng)過(guò)簽名,所以 您在運(yùn)行時(shí)不能對(duì)這個(gè)目錄中的內(nèi)容進(jìn)行修改,否則可能會(huì)使應(yīng)用程序無(wú)法啟動(dòng)臀突。Library 目錄:這個(gè)目錄下有兩個(gè)子目 錄:Caches 和 PreferencesPreferences 目錄包含應(yīng)用程序的偏好設(shè)置文件勉抓。您不應(yīng)該直接創(chuàng)建偏好設(shè)置文件,而是 應(yīng)該使用NSUserDefaults類來(lái)取得和設(shè)置應(yīng)用程序的偏好.Caches 目錄用于存放應(yīng)用程序?qū)S玫闹С治募?保存應(yīng)用程 序再次啟動(dòng)過(guò)程中需要的信息。tmp 目錄:這個(gè)目錄用于存放臨時(shí)文件,保存應(yīng)用程序再次啟動(dòng)過(guò)程中不需要的信息候学。
獲取這些目錄路徑的方法:1,獲取家目錄路徑的函數(shù):NSString *homeDir = NSHomeDirectory();2,獲取Documents目錄路徑的方法:NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);NSString *docDir = [paths objectAtIndex:0];3,獲取Caches目錄路徑的方法:NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);NSString *cachesDir = [paths objectAtIndex:0];4,獲取tmp目錄路徑的方法:NSString *tmpDir = NSTemporaryDirectory();5,獲取應(yīng)用程序程序包中資源文件路徑的方法:例如獲取程序包中一個(gè)圖片資源(apple.png)路徑的方法:NSString *imagePath = [[NSBundle mainBundle] pathForResource:@”apple” ofType:@”png”]; UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath]; 代碼中的mainBundle類方法用于返回一個(gè)代表應(yīng)用程序包的對(duì)象藕筋。
78、介紹一下XMPP?有什么優(yōu)缺點(diǎn)嗎?XMPP(Extensible Messaging and Presence Protocol,前稱)是一種以XML為基礎(chǔ)的開(kāi)放式實(shí)時(shí)通信協(xié)議,是 經(jīng)由互聯(lián)網(wǎng)工程工作小組(IETF)通過(guò)的互聯(lián)網(wǎng)標(biāo)準(zhǔn)梳码。簡(jiǎn)單的說(shuō),XMPP就是一種協(xié)議,一種規(guī)定隐圾。就是說(shuō),在網(wǎng)絡(luò)上傳 東西,要建立連接,TCP/IP連接,建立后再傳東西,而XMPP就是規(guī)定你傳的東西的格式。XMPP是基于XML的協(xié)議掰茶。 優(yōu)點(diǎn)開(kāi)放:
XMPP協(xié)議是自由暇藏、開(kāi)放、公開(kāi)的,并且易于了解濒蒋。 而且在客戶端 盐碱、 服務(wù)器 、 組件 啊胶、 源碼庫(kù)等方面,都已經(jīng)各自有多種實(shí)現(xiàn)甸各。 標(biāo)準(zhǔn):
互聯(lián)網(wǎng)工程工作小組( IETF )已經(jīng)將Jabber的核心XML流協(xié)議以XMPP之名,正式列為認(rèn)可的實(shí)時(shí)通信及Presence技術(shù)垛贤。 而XMPP的技術(shù)規(guī)格已被定義在RFC 3920及RFC 3921 焰坪。 任何IM供應(yīng)商在遵循XMPP協(xié)議下,都可與Google Talk實(shí)現(xiàn)連接。 證實(shí)可用:
第一個(gè)Jabber(現(xiàn)在XMPP)技術(shù)是Jeremie Miller在1998年開(kāi)發(fā)的,現(xiàn)在已經(jīng)相當(dāng)穩(wěn)定;數(shù)以百計(jì)的開(kāi)發(fā)者為XMPP技術(shù)而努 力聘惦。 今日的互聯(lián)網(wǎng)上有數(shù)以萬(wàn)計(jì)的XMPP服務(wù)器運(yùn)作著,并有數(shù)以百萬(wàn)計(jì)的人們使用XMPP實(shí)時(shí)傳訊軟件某饰。分散式:
XMPP網(wǎng)絡(luò)的架構(gòu)和電子郵件十分相像;XMPP核心協(xié)議通信方式是先創(chuàng)建一個(gè)stream,XMPP以TCP傳遞XML數(shù)據(jù)流,沒(méi)有 中央主服務(wù)器。 任何人都可以運(yùn)行自己的XMPP服務(wù)器,使個(gè)人及組織能夠掌控他們的實(shí)時(shí)傳訊體驗(yàn)善绎。安全:
任何XMPP協(xié)議的服務(wù)器可以獨(dú)立于公眾XMPP網(wǎng)絡(luò)(例如在企業(yè)內(nèi)部網(wǎng)絡(luò)中),而使用SASL及TLS等技術(shù)的可靠安全性,已自 帶于核心XMPP技術(shù)規(guī)格中黔漂。可擴(kuò)展:
XML 命名空間的威力可使任何人在核心協(xié)議的基礎(chǔ)上建造定制化的功能;為了維持通透性,常見(jiàn)的擴(kuò)展由XMPP標(biāo)準(zhǔn)基金會(huì) 禀酱。 彈性佳:
XMPP除了可用在實(shí)時(shí)通信的應(yīng)用程序,還能用在網(wǎng)絡(luò)管理炬守、內(nèi)容供稿、協(xié)同工具剂跟、文件共享减途、游戲、遠(yuǎn)程系統(tǒng)監(jiān)控等曹洽。 多樣性:
用XMPP協(xié)議來(lái)建造及布署實(shí)時(shí)應(yīng)用程序及服務(wù)的公司及開(kāi)放源代碼計(jì)劃分布在各種領(lǐng)域;用XMPP技術(shù)開(kāi)發(fā)軟件,資源及支持的 來(lái)源是多樣的,使得使你不會(huì)陷于被“綁架”的困境鳍置。缺點(diǎn)數(shù)據(jù)負(fù)載太重:
隨著通常超過(guò)70%的XMPP協(xié)議的服務(wù)器的數(shù)據(jù)流量的存在和近60%的被重復(fù)轉(zhuǎn)發(fā),XMPP協(xié)議目前擁有一個(gè)大型架空中存在的 數(shù)據(jù)提供給多個(gè)收件人。 新的議定書正在研究,以減輕這一問(wèn)題送淆。沒(méi)有二進(jìn)制數(shù)據(jù):XMPP協(xié)議的方式被編碼為一個(gè)單一的長(zhǎng)的XML文件,因此無(wú)法提供修改二進(jìn)制數(shù)據(jù)税产。 因此, 文件傳輸協(xié)議一樣使用外部的 HTTP。 如果不可避免,XMPP協(xié)議還提供了帶編碼的文件傳輸?shù)乃袛?shù)據(jù)使用的Base64 。 至于其他二進(jìn)制數(shù)據(jù)加密會(huì)話 (encrypted conversations)或圖形圖標(biāo)(graphic icons)以嵌入式使用相同的方法辟拷。
79撞羽、談?wù)剬?duì)性能優(yōu)化的看法,如何做? 控制好內(nèi)存,不用的內(nèi)存實(shí)時(shí)釋放;冗余代碼;用戶體驗(yàn)度;耗時(shí)操作,開(kāi)線程進(jìn)行處理
80、寫一個(gè)遞歸方法:計(jì)算N的階乘,然后將計(jì)算結(jié)果進(jìn)行存儲(chǔ)梧兼。以便應(yīng)用退出后下次啟動(dòng)可直接獲取該值放吩。 開(kāi)啟一個(gè)線程,在線程種實(shí)現(xiàn)遞歸的方法,將結(jié)果存到本地,下次運(yùn)行時(shí)先看本地,沒(méi)有在運(yùn)行這個(gè)遞歸方法。--
---用代碼實(shí)現(xiàn)----
81羽杰、簡(jiǎn)述應(yīng)用程序按Home鍵進(jìn)入后臺(tái)時(shí)的生命周期,和從后臺(tái)回到前臺(tái)時(shí)的生命周期? 應(yīng)用程序:-[AppDelegate application:willFinishLaunchingWithOptions:]-[AppDelegate application:didFinishLaunchingWithOptions:]
-[AppDelegate applicationDidBecomeActive:] 退到后臺(tái):-[AppDelegate applicationWillResignActive:] -[AppDelegate applicationDidEnterBackground:] 回到前臺(tái):
-[AppDelegate applicationWillEnterForeground:] -[AppDelegate applicationDidBecomeActive:] ViewController之間加載頁(yè)面:
-[mainViewController viewDidLoad] -[mainViewController viewWillAppear:] -[mainViewController viewWillLayoutSubviews] -[mainViewController viewDidLayoutSubviews] -[mainViewController viewDidAppear:] 退出當(dāng)前頁(yè)面:
-[mainViewController viewWillDisappear:]-[mainViewController viewDidDisappear:]返回之前頁(yè)面:-[mainViewController viewWillAppear:]-[mainViewController viewWillLayoutSubviews]-[mainViewController viewDidLayoutSubviews]-[mainViewController viewDidAppear:]
82渡紫、簡(jiǎn)述值傳遞和引用傳遞的區(qū)別? 所謂值傳遞,就是說(shuō)僅將對(duì)象的值傳遞給目標(biāo)對(duì)象,就相當(dāng)于copy;系統(tǒng)將為目標(biāo)對(duì)象重新開(kāi)辟一個(gè)完全相同的內(nèi)存空間。 所謂引用傳遞,就是說(shuō)將對(duì)象在內(nèi)存中的地址傳遞給目標(biāo)對(duì)象,就相當(dāng)于使目標(biāo)對(duì)象和原始對(duì)象對(duì)應(yīng)同一個(gè)內(nèi)存存儲(chǔ)空間考赛。此時(shí),如 果對(duì)目標(biāo)對(duì)象進(jìn)行修改,內(nèi)存中的數(shù)據(jù)也會(huì)改變惕澎。
83、NSArray和NSMutableArray的區(qū)別,多線程操作哪個(gè)更安全? NSArray更安全,當(dāng)同時(shí)被訪問(wèn)時(shí),NSArray是不可改變
84颜骤、當(dāng)前有一個(gè)數(shù)組,里面有若干重復(fù)的數(shù)據(jù),如何去除重復(fù)的數(shù)據(jù)?(會(huì)幾個(gè)寫幾個(gè)) 可以由數(shù)組,到集合唧喉。。忍抽。八孝。
85、isKindOfClass鸠项、isMemberOfClass干跛、selector作用分別是什么 isKindOfClass,作用是,某個(gè)對(duì)象屬于某個(gè)類型,包括繼承的類型--- isMemberOfClass:某個(gè)對(duì)象確切屬于某個(gè)類型,是不是具體的實(shí)例 selector:通過(guò)方法名,獲取在內(nèi)存中的函數(shù)的入口地址
86、寫出下面程序段的輸出結(jié)果
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"a string value" forKey:@"akey"]; NSLog(@"%@", [dict objectForKey:@"akey"]);[dict release];打印輸出 a string value,然后崩潰----原因:便利構(gòu)造器創(chuàng)建的對(duì)象,之后的release,會(huì)造成過(guò)度釋放
87祟绊、請(qǐng)寫出以下代碼的執(zhí)行結(jié)果
NSString * name = [ [ NSString alloc] init ];name = @”Habb”;[ name release];打印輸出結(jié)果是: Habb,在[name release]前后打印均有輸出結(jié)果 ---會(huì)造成內(nèi)存泄露---原先指向的區(qū)域變成了野指針,之后的釋放,不能釋放之前創(chuàng)建的區(qū)域
88楼入、請(qǐng)分別寫出SEL、id牧抽、@的意思? SEL是“selector”的一個(gè)類型,表示一個(gè)方法的名字-------就是一個(gè)方法的入口地址 id是一個(gè)指向任何一個(gè)繼承了Object(或者NSObject)類的對(duì)象嘉熊。需要注意的是id是一個(gè)指針,所以在使用id 的時(shí)候不需要加*。
@:OC中的指令符
89扬舒、以.mm為拓展名的文件里,可以包含的代碼有哪些? .mm是oc和C++混編類型文件后綴,給編譯器識(shí)別的阐肤。
90、說(shuō)說(shuō)如何進(jìn)行后臺(tái)運(yùn)行程序?答:判斷是否支持多線程
UIDevice* device = [UIDevice currentDevice];BOOL backgroundSupported = NO;if ([device respondsToSelector:@selector(isMultitaskingSupported)])backgroundSupported = device.multitaskingSupported; 聲明你需要的后臺(tái)任務(wù)Info.plist中添加UIBackgroundModes鍵值,它包含一個(gè)或多個(gè)string的值,包括audio:在后臺(tái)提供聲音 播放功能,包括音頻流和播放視頻時(shí)的聲音 location:在后臺(tái)可以保持用戶的位置信息 voip:在后臺(tái)使用VOIP功能 前面的每個(gè)value讓系統(tǒng)知道你的應(yīng)用程序應(yīng)該在適當(dāng)?shù)臅r(shí)候被喚醒讲坎。例如,一個(gè)應(yīng)用程序,開(kāi)始播放音樂(lè),然后移動(dòng)到后臺(tái)仍然需要 執(zhí)行時(shí)間,以填補(bǔ)音頻輸出緩沖區(qū)孕惜。添加audio鍵用來(lái)告訴系統(tǒng)框架,需要繼續(xù)播放音頻,并且可以在合適的時(shí)間間隔下回調(diào)應(yīng)用程序;如果應(yīng)用程序不包括此項(xiàng),任何音頻播放在移到后臺(tái)后將停止運(yùn)行。除了添加鍵值的方法,IOS還提供了兩種途徑使應(yīng)用程序在后臺(tái)工作:Task completion—應(yīng)用程序可以向系統(tǒng)申請(qǐng)額外的時(shí)間去完成給定的任務(wù)Local notifications—應(yīng)用程序可以預(yù)先安排時(shí)間執(zhí)行l(wèi)ocal notifications 傳遞實(shí)現(xiàn)長(zhǎng)時(shí)間的后臺(tái)任務(wù):應(yīng)用程序可以請(qǐng)求在后臺(tái)運(yùn)行以實(shí)現(xiàn)特殊的服務(wù)衣赶。這些應(yīng)用程序并不連續(xù)的運(yùn)行,但是會(huì)被系統(tǒng)框架在合適的時(shí)間喚醒,以實(shí)現(xiàn)這些服務(wù)
91诊赊、你了解svn,cvs等版本控制工具么?版本控制 svn,cvs 是兩種版控制的器,需要配套相關(guān)的svn,cvs服務(wù)器。scm是xcode里配置版本控制的地方府瞄。版本控制 的原理就是a和b同時(shí)開(kāi)發(fā)一個(gè)項(xiàng)目,a寫完當(dāng)天的代碼之后把代碼提交給服務(wù)器,b要做的時(shí)候先從服務(wù)器得到最新版本, 就可以接著做碧磅。 如果a和b都要提交給服務(wù)器,并且同時(shí)修改了同一個(gè)方法,就會(huì)產(chǎn)生代碼沖突,如果a先提交,那么b提交 時(shí),服務(wù)器可以提示沖突的代碼,b可以清晰的看到,并做出相應(yīng)的修改或融合后再提交到服務(wù)器碘箍。