面試題1
- 定義屬性時(shí), 什么情況使用
copy
,assign
和retain
?
property關(guān)鍵字:readonly, readwrite, assign, retain, copy, nonatomic, strong, weak, unsafe_unretained
readwrite此標(biāo)記說(shuō)明屬性會(huì)被當(dāng)成讀寫(xiě)的奕纫,這也是默認(rèn)屬性青团。設(shè)置器和讀取器都需要在@implementation中實(shí)現(xiàn)逞度。如果使用@synthesize關(guān)鍵字,讀取器和設(shè)置器都會(huì)被解析季二。
readonly此標(biāo)記說(shuō)明屬性是只讀的桦锄,默認(rèn)的標(biāo)記是讀寫(xiě)辛润,如果你指定了只讀表制,在@implementation中只需要一個(gè)讀取器÷癖茫或者如果你使用@synthesize關(guān)鍵字幔欧,也是有讀取器方法被解析。而且如果你試圖使用點(diǎn)操作符為屬性賦值丽声,你將得到一個(gè)編譯錯(cuò)誤礁蔗。
assign: 賦值特性=(僅設(shè)置變量時(shí), setter方法將傳入?yún)?shù)賦值給實(shí)例變量), 一般常用于基本數(shù)據(jù)類(lèi)型, 常見(jiàn)委托設(shè)計(jì)模式, 以此來(lái)防止循環(huán)引用.
assigin 可以用非 OC 對(duì)象,而 weak 必須用于 OC 對(duì)象
retain: 持有特性, 保留計(jì)數(shù), 獲得到對(duì)象的所有權(quán), 引用計(jì)數(shù)(reference counting)在原有的基礎(chǔ)上+1
例如當(dāng)使用malloc分配了一塊內(nèi)存,并把它的地址賦值給了指針a雁社,后來(lái)如果希望指針b也共享這塊內(nèi)存瘦麸,于是講a賦值給(assgin)b。這時(shí)就用到了assgin歧胁,此時(shí)a和b指向同一塊內(nèi)存滋饲。但是現(xiàn)在問(wèn)題出現(xiàn)了厉碟,當(dāng)a不再需要這塊內(nèi)存時(shí),能都直接釋放呢屠缭?肯定是不能的箍鼓,因?yàn)閍并不知道b是否還在使用這塊內(nèi)存,如果a釋放了呵曹,那么b在使用這塊內(nèi)存的時(shí)候引起程序crash
copy:是你不希望a和b共享一塊內(nèi)存時(shí)會(huì)使用到款咖。a和b各自有自己的內(nèi)存。(引申出深拷貝, 淺拷貝)
NSString屬性什么時(shí)候用copy奄喂,什么時(shí)候用strong?
iOS 集合的深復(fù)制與淺復(fù)制
對(duì)于字符串铐殃,通常都是使用copy的方式昙啄。雖然使用strong似乎也沒(méi)有沒(méi)有問(wèn)題崇裁,但是事實(shí)上在開(kāi)發(fā)中都會(huì)使用copy鞋仍。為什么這么做贝咙?因?yàn)閷?duì)于字符串,我們希望是一次內(nèi)容的拷貝碌识,外部修改也不會(huì)影響我們的原來(lái)的值衰伯,而且NSString類(lèi)遵守了NSCopying, NSMutableCopying, NSSecureCoding協(xié)議瞧剖。
下面是使用copy的方式肖揣,驗(yàn)證如下:
NSString *hahaString = @"哈哈";
NSString *heheString = [hahaString copy];
// 哈哈, 哈哈
NSLog(@"%@, %@", hahaString, heheString);
heheString = @"呵呵";
// 哈哈, 呵呵
NSLog(@"%@, %@", hahaString, heheString);
我們修改了heheString民假,并不會(huì)影響到原來(lái)的hahaString。copy一個(gè)對(duì)象變成新的對(duì)象(新內(nèi)存地址) 引用計(jì)數(shù)+1 原對(duì)象計(jì)數(shù)不變龙优。
nonatomic:非原子性訪(fǎng)問(wèn)羊异,對(duì)屬性賦值的時(shí)候不加鎖,多線(xiàn)程并發(fā)訪(fǎng)問(wèn)會(huì)提高性能彤断。如果不加此屬性野舶,則默認(rèn)是兩個(gè)訪(fǎng)問(wèn)方法都為原子性訪(fǎng)問(wèn)。
atomic是Objc使用的一種線(xiàn)程保護(hù)技術(shù)瓦糟,基本上來(lái)講筒愚,是防止在寫(xiě)未完成的時(shí)候被另外一個(gè)線(xiàn)程讀取赴蝇,造成數(shù)據(jù)錯(cuò)誤菩浙。而這種機(jī)制是耗費(fèi)系統(tǒng)資源的,所以在iPhone這種小型設(shè)備上句伶,如果沒(méi)有使用多線(xiàn)程間的通訊編程劲蜻,那么nonatomic是一個(gè)非常好的選擇
strong, weak, unsafe_unretained是ARC引入的
strong:相當(dāng)于retain,但是對(duì)于有的類(lèi)型考余,例如NSString先嬉,則使用strong相當(dāng)于使用copy這樣直接用strong就可以直接處理retain和strong的情況了。
weak:相當(dāng)于assign楚堤,但是比后者多一點(diǎn):對(duì)象被銷(xiāo)毀時(shí)會(huì)將weak引用設(shè)為nil疫蔓,而對(duì)nil發(fā)送消息都不會(huì)導(dǎo)致崩潰否則weak引用為野指針含懊,會(huì)出現(xiàn)問(wèn)題.
unsafe_unretained:用unsafe_unretained聲明的指針,指針指向的對(duì)象一旦被釋放衅胀,這些指針將成為野指針岔乔。
使用@property配合@synthesize可以讓編譯器自動(dòng)實(shí)現(xiàn)getter/setter
方法,使用的時(shí)候也很方便滚躯,可以直接使用“對(duì)象.屬性”的方法調(diào)用;如果我們想要”對(duì)象.方法“的方式來(lái)調(diào)用一個(gè)方法并獲取到方法的返回值雏门,那就需要使用@property配合@dynamic了
使用@dynamic關(guān)鍵字是告訴編譯器由我們自己來(lái)實(shí)現(xiàn)訪(fǎng)問(wèn)方法。如果使用的是@synthesize掸掏,那么這個(gè)工作編譯器就會(huì)幫你實(shí)現(xiàn)了
2.怎樣啟動(dòng)一個(gè)新線(xiàn)程, 子線(xiàn)程怎樣刷新UI
?
刷新UI
方法1:
[self performSelectorOnMainThread:@selector(updateUI:) withObject:nil waitUntilDone:YES];
方法2:
dispatch_async(dispatch_get_global_queue(0, 0), ^{
// 處理耗時(shí)操作的代碼塊...
//通知主線(xiàn)程刷新
dispatch_async(dispatch_get_main_queue(), ^{
//回調(diào)或者說(shuō)是通知主線(xiàn)程刷新茁影,
});
});
3.KVO
是什么? ?內(nèi)部是怎樣實(shí)現(xiàn)的?
KVO是實(shí)現(xiàn)Cocoa Bindings的基礎(chǔ), 它提供了一種方法, 當(dāng)某個(gè)屬性改變時(shí), 相應(yīng)的objects會(huì)被通知到. 在其他語(yǔ)言中, 這種觀(guān)察者模式通常需要單獨(dú)實(shí)現(xiàn), 而在OC中, 通常無(wú)須增加額外代碼即可使用.
實(shí)現(xiàn): 通過(guò)Objective-C強(qiáng)大的運(yùn)行時(shí)(runtime)實(shí)現(xiàn)的. 當(dāng)你第一次觀(guān)察某個(gè)object時(shí), runtime會(huì)創(chuàng)建一個(gè)新的繼承原先class的subclass, 在這個(gè)新的class中, 它重寫(xiě)了所有被觀(guān)察的key, 然后將object的isa指針指向新創(chuàng)建的class(這個(gè)指針告訴Objective-C運(yùn)行時(shí)某個(gè)object到底是哪種類(lèi)型的object). 所以object神奇的變成了新的子類(lèi)的實(shí)例.
這些被重寫(xiě)的方法實(shí)現(xiàn)了如何通知觀(guān)察者們。當(dāng)改變一個(gè)key時(shí)丧凤,會(huì)觸發(fā)setKey方法募闲,但這個(gè)方法被重寫(xiě)了,并且在內(nèi)部添加了發(fā)送通知機(jī)制息裸。(當(dāng)然也可以不走setXXX方法蝇更,比如直接修改iVar,但不推薦這么做)呼盆。
有意思的是:蘋(píng)果不希望這個(gè)機(jī)制暴露在外部年扩。除了setters,這個(gè)動(dòng)態(tài)生成的子類(lèi)同時(shí)也重寫(xiě)了-class方法访圃,依舊返回原先的class厨幻!如果不仔細(xì)看的話(huà),被KVO過(guò)的object看起來(lái)和原先的object沒(méi)什么兩樣腿时。
KVO依賴(lài)于NSObject 的兩個(gè)方法: willChangeValueForKey: 和didChangevlueForKey:;在一個(gè)被觀(guān)察屬性發(fā)生改變之前况脆, willChangeValueForKey: 一定會(huì)被調(diào)用,這就 會(huì)記錄舊的值批糟。而當(dāng)改變發(fā)生后格了,didChangeValueForKey: 會(huì)被調(diào)用,繼而 observeValueForKey:ofObject:change:context: 也會(huì)被調(diào)用徽鼎。
原博客鏈接
4.寫(xiě)出對(duì)所有類(lèi)進(jìn)行擴(kuò)展的幾種方式.
類(lèi)目, 延展, 協(xié)議, 繼承
5.利用 NSOperation
與 NSOperationQueue
處理多線(xiàn)程時(shí), 有3個(gè) NSOperation
分別為A, B, C, 要求A, B執(zhí)行完之后, 才執(zhí)行 C, 如何做?
// 創(chuàng)建隊(duì)列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 創(chuàng)建3個(gè)操作
// 同步執(zhí)行一個(gè)操作
NSOperation *a = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"a");
}];
NSOperation *b = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"b");
}];
NSOperation *c = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"c");
}];
[b addDependency:a];
[c addDependency:b];
[queue addOperation:a];
[queue addOperation:b];
[queue addOperation:c];
6.構(gòu)造5個(gè) string
對(duì)象, 并添加到數(shù)組中, 對(duì) array
中的元素按字母排序, 遍歷 array
輸出 string
內(nèi)容
NSMutableArray *arr = @[@"qda", @"adsg", @"rwf", @"wrwev", @"vbwer"].mutableCopy;
arr = [arr sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)].mutableCopy;
for (NSString *str in arr) {
NSLog(@"%@", str);
}
面試題2
1.該函數(shù)輸出是什么?
main()
{
int a[5] = {1, 2, 3, 4, 5};
int *ptr = (int *)(&a + 1);
printf("%d, %d", *(a+1), *(ptr - 1));
}
輸出:2, 5
2.有一個(gè)1G大小的一個(gè)文件, 里面每一行是一個(gè)詞, 詞的大小不超過(guò)16字節(jié).
內(nèi)存限制大小是1M, 返回頻數(shù)里面最高的100個(gè)詞.
3.HTTP 協(xié)議 1xx, 2xx, 3xx, 4xx, 5xx的含義. 204, 304的含義
HTTP狀態(tài)碼是五個(gè)不同的類(lèi)別:
- 1XX臨時(shí)/信息響應(yīng)
- 2XX成功
- 3XX重定向
- 4XX客戶(hù)端/請(qǐng)求錯(cuò)誤
- 5XX服務(wù)器錯(cuò)誤
204(無(wú)內(nèi)容): 服務(wù)器成功處理了請(qǐng)求盛末,但沒(méi)有返回任何內(nèi)容。
304(未修改): 自從上次請(qǐng)求后否淤,請(qǐng)求的網(wǎng)頁(yè)未修改過(guò)悄但。服務(wù)器返回此響應(yīng)時(shí),不會(huì)返回網(wǎng)頁(yè)內(nèi)容石抡。
如果網(wǎng)頁(yè)自請(qǐng)求者上次請(qǐng)求后再也沒(méi)有更改過(guò)檐嚣,您應(yīng)將服務(wù)器配置為返回此響應(yīng)(稱(chēng)為 If-Modified-Since HTTP 標(biāo)頭)。服務(wù)器可以告訴 Googlebot 自從上次抓取后網(wǎng)頁(yè)沒(méi)有變更啰扛,進(jìn)而節(jié)省帶寬和開(kāi)銷(xiāo)嚎京。
4.給出 cocoa touch
框架
Cocoa Touch框架
除 UIKit 之外嗡贺,Cocoa Touch 包含創(chuàng)建世界一流 iOS 應(yīng)用程序所需的所有框架,從 3D 圖形鞍帝、專(zhuān)業(yè)音頻到網(wǎng)絡(luò)暑刃,甚至提供特殊設(shè)備訪(fǎng)問(wèn) API 以控制攝像機(jī)或從 GPS 硬件獲取位置。Cocoa Touch 既包含只需要幾行代碼就可以完成全部任務(wù)的強(qiáng)大的 Objective-C 框架膜眠,也在需要時(shí)提供基礎(chǔ)的 C 語(yǔ)言 API 來(lái)直接訪(fǎng)問(wèn)系統(tǒng)岩臣。這些框架示例包括:
- 通過(guò) Core Animation,您就可以通過(guò)基于組合獨(dú)立圖層的簡(jiǎn)單編程模型來(lái)創(chuàng)建豐富的用戶(hù)體驗(yàn)宵膨。
- Core Audio 是播放架谎、處理和錄制音頻的專(zhuān)業(yè)級(jí)技術(shù),能夠輕松為您的應(yīng)用程序添加強(qiáng)大的音頻功能辟躏。
- Core Data 提供面向?qū)ο蟮臄?shù)據(jù)管理解決方案谷扣,該方案易于使用和理解,甚至可處理任何應(yīng)用或大或小的數(shù)據(jù)模型捎琐。
拓展:
iphone 技術(shù)層
Cocoa Touch 層由多個(gè)框架組成会涎,他們?yōu)閼?yīng)用程序提供了核心功能。
UIKit 負(fù)責(zé)啟動(dòng)和結(jié)束應(yīng)用程序瑞凑,控制界面和多觸點(diǎn)事件
Map Kit 提供地圖的相關(guān)服務(wù)末秃,定位或者區(qū)域檢測(cè)等
Game Kit 創(chuàng)建和使用網(wǎng)絡(luò)機(jī)制
Message UI/Address Book UI 提供操作電子郵件和聯(lián)系人的信息
5.用OC, 自己實(shí)現(xiàn)一個(gè) AutoReleasePool
.
6.NSThread
, NSOperation
, GCD
, 各有什么特點(diǎn), 使用需要注意什么?
NSThread.
每個(gè)NSThread對(duì)象對(duì)應(yīng)一個(gè)線(xiàn)程,量級(jí)較輕(真正的多線(xiàn)程)
NSThree是官方推薦的線(xiàn)程處理方式籽御,它在處理機(jī)制上练慕,需要開(kāi)發(fā)者負(fù)責(zé)手動(dòng)管理Thread的生命周期,包括子線(xiàn)程與主線(xiàn)程之間的同步等技掏。線(xiàn)程共享同一應(yīng)用程序的部分內(nèi)存空間铃将,它們擁有對(duì)數(shù)據(jù)相同的訪(fǎng)問(wèn)權(quán)限。你得協(xié)調(diào)多個(gè)線(xiàn)程 對(duì)同一數(shù)據(jù)的訪(fǎng)問(wèn)哑梳,一般做法是在訪(fǎng)問(wèn)之前加鎖劲阎,這會(huì)導(dǎo)致一定的性能開(kāi)銷(xiāo)。在 iOS 中我們可以使用多種形式的 thread鸠真。 比其他兩個(gè)輕量級(jí) 需要自己管理線(xiàn)程的生命周期悯仙,線(xiàn)程同步。 線(xiàn)程同步對(duì)數(shù)據(jù)的加鎖會(huì)有一定的系統(tǒng)開(kāi)銷(xiāo).
NSOperation/NSOperationQueue 面向?qū)ο蟮木€(xiàn)程技術(shù)
如果需要讓線(xiàn)程同時(shí)并行運(yùn)行多個(gè)弧哎,可以將線(xiàn)程加入隊(duì)列(Queue)中雁比,NSOperationQueue類(lèi)就是一個(gè)線(xiàn)程隊(duì)列管理類(lèi)稚虎,他提供了線(xiàn)程并行撤嫩、隊(duì)列的管理〈乐眨可以認(rèn)為NSOperationQueue就是一個(gè)線(xiàn)程管理器序攘,通過(guò)addOperations方法茴她,我們可以一次性把多個(gè)(數(shù)組形式)線(xiàn)程添加到隊(duì)列中。同時(shí)程奠,NSOperationQueue允許通過(guò)setMaxConcurrentOperationCount方法設(shè)置隊(duì)列的并行(同一時(shí)間)運(yùn)行數(shù)量
Grand Central Dispatch (GCD)是Apple開(kāi)發(fā)的一個(gè)多核編程的解決方法丈牢。該方法在Mac OS X 10.6雪豹中首次推出,并隨后被引入到了iOS4.0中瞄沙。GCD是一個(gè)替代諸如NSThread, NSOperationQueue, NSInvocationOperation等技術(shù)的很高效和強(qiáng)大的技術(shù)己沛,它看起來(lái)象就其它語(yǔ)言的閉包(Closure)一樣,但蘋(píng)果把它叫做blocks距境。
GCD —— Grand Central Dispatch(大調(diào)度中心) 是基于C語(yǔ)言的框架申尼,可以充分利用多核,是蘋(píng)果推薦使用的多線(xiàn)程技術(shù)
以上這三種編程方式從上到下垫桂,抽象度層次是從低到高的师幕,抽象度越高的使用越簡(jiǎn)單,也是Apple最推薦使用的诬滩,在項(xiàng)目中很多框架技術(shù)分別使用了不同多線(xiàn)程技術(shù)霹粥。
三種多線(xiàn)程技術(shù)的對(duì)比
NSThread:–優(yōu)點(diǎn):NSThread 比其他兩個(gè)輕量級(jí),使用簡(jiǎn)單–缺點(diǎn):需要自己管理線(xiàn)程的生命周期疼鸟、線(xiàn)程同步后控、加鎖、睡眠以及喚醒等空镜。線(xiàn)程同步對(duì)數(shù)據(jù)的加鎖會(huì)有一定的系統(tǒng)開(kāi)銷(xiāo)
NSOperation:不需要關(guān)心線(xiàn)程管理忆蚀,數(shù)據(jù)同步的事情,可以把精力放在自己需要執(zhí)行的操作上–NSOperation是面向?qū)ο蟮?/p>
- 優(yōu)點(diǎn): 提供了一些在GCD中不容易實(shí)現(xiàn)的特性,如:限制最大并發(fā)數(shù)量,操作之間的依賴(lài)關(guān)系.
GCD:NSOperation的高效和強(qiáng)大的技術(shù)–GCD是基于C語(yǔ)言的
- 優(yōu)點(diǎn)1:用Block定義任務(wù),使用起來(lái)非常靈活便捷;(要注意:也可能出現(xiàn)循環(huán)引用)
- 優(yōu)點(diǎn)2:提供了更多的控制能力以及操作隊(duì)列中所不能使用的底層函數(shù).
7.分別介紹下 KVO
, KVC
, NOtification
, Delegate
使用場(chǎng)景.
iOS 如何選擇delegate姑裂、notification馋袜、KVO?
KVC舶斧,即是指 NSKeyValueCoding欣鳖,一個(gè)非正式的Protocol,提供一種機(jī)制來(lái)間接訪(fǎng)問(wèn)對(duì)象的屬性茴厉。而不是通過(guò)調(diào)用Setter泽台、Getter方法訪(fǎng)問(wèn)。KVO 就是基于 KVC 實(shí)現(xiàn)的關(guān)鍵技術(shù)之一矾缓。
盡量使用KVC可以大大地減少我們的代碼量怀酷,當(dāng)遇到property的時(shí)候,可以多想想是否可以KVC來(lái)幫助我嗜闻,是否可以用KVC來(lái)重構(gòu)代碼蜕依, 當(dāng)需要加入observer模式時(shí),可以考慮下KVO, 在高性能的observer里面,KVO會(huì)給我們很好的幫助样眠。
8.在 - (void)scrollViewDidScroll:(UIScrollView *)scrollView
如何判斷滾動(dòng)是用戶(hù)手動(dòng)引發(fā)的.
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (UIGestureRecognizerStateBegan == scrollView.panGestureRecognizer.state) {
NSLog(@"手動(dòng)發(fā)出");
}
}
面試題3
1.下面的代碼循環(huán)了幾次?
int i = 0;
while(i < 6) {
if(i == 5) {
continue;
}
i++;
}
死循環(huán)
2.UITextField
與 UITextView
有什么區(qū)別?
UITextField:
1.UITextField只能單行輸入
2.有placehoder屬性設(shè)置占位文字
3.繼承自UIControl
4.監(jiān)聽(tīng)行為包括:
- 1> 設(shè)置代理
- 2> addTarget:action:forControlEvents:
- 3> 通知:UITextFieldTextDidChangeNotification
UITextView:
1.支持多行輸入并且可以滾動(dòng)顯示瀏覽全文
2.不能設(shè)置占位文字
3.繼承自UIScollView
4.監(jiān)聽(tīng)行為包括:
- 1> 設(shè)置代理
- 2> 通知:UITextViewTextDidChangeNotification
3.把一段文本用你已知的控件顯示兩種顏色? 盡可能說(shuō)出你的方法.
方法1:NSAttributedString/NSMutableAttributedString
NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"我們結(jié)婚吧"];
[str addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0, 2)];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(50, 50, 50, 50)];
[self.view addSubview:label];
label.attributedText = str;
4.objc
中向一個(gè) nil
對(duì)象發(fā)送消息將會(huì)發(fā)生什么?
在 Objective-C 中向 nil 發(fā)送消息是完全有效的——只是在運(yùn)行時(shí)不會(huì)有任何作用:
如果一個(gè)方法返回值是一個(gè)對(duì)象友瘤,那么發(fā)送給nil的消息將返回0(nil)。例如:
Person * motherInlaw = [[aPerson spouse] mother];
如果 spouse 對(duì)象為 nil檐束,那么發(fā)送給 nil 的消息 mother 也將返回 nil辫秧。
如果方法返回值為指針類(lèi)型,其指針大小為小于或者等于sizeof(void*)被丧,float盟戏,double,long double 或者 long long 的整型標(biāo)量甥桂,發(fā)送給 nil 的消息將返回0抓半。
如果方法返回值為結(jié)構(gòu)體,發(fā)送給 nil 的消息將返回0。結(jié)構(gòu)體中各個(gè)字段的值將都是0格嘁。
如果方法的返回值不是上述提到的幾種情況笛求,那么發(fā)送給 nil 的消息的返回值將是未定義的。
5.有這樣一段 json
數(shù)據(jù): {"title":null}, 轉(zhuǎn)成字典之后將 title
對(duì)應(yīng)的 value
賦值在一個(gè)
label.text
, 會(huì)出現(xiàn)什么問(wèn)題?
將該數(shù)據(jù)解析之后數(shù)據(jù)變?yōu)?/p>
title = <null>
這個(gè)數(shù)據(jù)類(lèi)型不是nil 也不是 String糕簿。 解析成對(duì)象之后探入,如果直接向這個(gè)對(duì)象發(fā)送消息(eg:length,count 等等)就會(huì)直接崩潰懂诗。提示錯(cuò)誤為:
-[NSNull length]: unrecognized selector sent to instance 0x388a4a70
6.一個(gè)列表有足夠多的顯示區(qū)域, 滑動(dòng)了一下, 如何判斷向上滑動(dòng)還是向下滑動(dòng)了? 請(qǐng)?jiān)敿?xì)說(shuō)明.
int _lastPosition; //臨時(shí)值
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
int currentPostion = scrollView.contentOffset.y;
if (currentPostion - _lastPosition > 0) {
_lastPosition = currentPostion;
NSLog(@"ScrollUp now");
}
else if (_lastPosition - currentPostion > 0)
{
_lastPosition = currentPostion;
NSLog(@"ScrollDown now");
}
}
7.有兩個(gè)字符串 @"hello", @"world", 你有幾種方法將它們拼接在一起?
NSString* string1, string2; //已存在的字符串蜂嗽,需要將string1和string2連接起來(lái)
//方法1.
string = [NSString initWithFormat:@"%@,%@", string1, string2 ];
//方法2.
string = [string1 stringByAppendingString:string2];
//方法3 .
string = [string stringByAppendingFormat:@"%@,%@",string1, string2];
面試題4
1.現(xiàn)在有一個(gè)數(shù)組, 數(shù)組里面是整數(shù), 用你認(rèn)為最優(yōu)的算法找出里面第 k 大的元素.
2.一個(gè)理發(fā)店有一個(gè)入口和一個(gè)出口. 理發(fā)店內(nèi)有一個(gè)5人沙發(fā), 1個(gè)理發(fā)師. 新來(lái)的顧客坐在沙發(fā)上等待. 理發(fā)師可從事理發(fā)和休息兩種活動(dòng). 理發(fā)店的活動(dòng)滿(mǎn)足下列條件:
- 休息的理發(fā)師是坐在自己專(zhuān)用的理發(fā)椅上, 不會(huì)占用顧客的沙發(fā);
- 處理休息狀態(tài)的理發(fā)師可為在沙發(fā)上等待時(shí)間最長(zhǎng)的顧客理發(fā);
- 理發(fā)時(shí)間長(zhǎng)短由理發(fā)師決定;
適用信號(hào)量機(jī)制或管程機(jī)制實(shí)現(xiàn)理發(fā)師進(jìn)程和顧客進(jìn)程, 可以用語(yǔ)言表述.
3.如果現(xiàn)在需要讓 UILabel
進(jìn)行交互(可以點(diǎn)擊響應(yīng)事件), 有哪些方式?
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(60, 0, self.view.frame.size.width - 60, self.view.frame.size.height)];
label.userInteractionEnabled= YES;
UITapGestureRecognizer *labelTapGestureRecognizer = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(labelTouchUpInside:)];
[label addGestureRecognizer:labelTapGestureRecognizer];
}
-(void) labelTouchUpInside:(UITapGestureRecognizer *)recognizer{
NSLog(@"被點(diǎn)擊了");
}
UILabel 也是一個(gè)UIView,同樣繼承自UIResponder殃恒,所以只要擴(kuò)展UILabel植旧,并覆蓋相關(guān)方法就可以了,如:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;
// 點(diǎn)擊該label的時(shí)候, 來(lái)個(gè)高亮顯示
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self setTextColor:[UIColor whiteColor]];
}
// 還原label顏色,獲取手指離開(kāi)屏幕時(shí)的坐標(biāo)點(diǎn), 在label范圍內(nèi)的話(huà)就可以觸發(fā)自定義的操作
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[self setTextColor:COLOR(59,136,195,1.0)];
UITouch *touch = [touches anyObject];
CGPoint points = [touch locationInView:self];
if (points.x >= self.frame.origin.x && points.y >= self.frame.origin.x && points.x <= self.frame.size.width && points.y <= self.frame.size.height)
{
[delegate myLabel:self touchesWtihTag:self.tag];
}
}
4.UILabel
是否可以顯示 html 文本? 如果可以怎么顯示?
NSString * htmlString = @"<html><body> Some html string \n <font size=\"13\" color=\"red\">This is some text!</font> </body></html>";
NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];
UILabel * myLabel = [[UILabel alloc] initWithFrame:self.view.bounds];
myLabel.attributedText = attrStr;
[self.view addSubview:myLabel];
5.你在工作中最經(jīng)常使用什么來(lái)進(jìn)行布局和屏幕適配? 簡(jiǎn)單描述一下你遇到的問(wèn)題?
masonry(本質(zhì)上是界面約束的語(yǔ)法糖), xib
6.簡(jiǎn)單描述 UITableView
的重用機(jī)制
鏈接
7.ViewController
的 loadView
, viewDidLoad
, viewDidUnload
分別是什么時(shí)候調(diào)用的, 在使用 ViewController
時(shí)在這幾個(gè)函數(shù)中應(yīng)該做什么工作?
鏈接
面試題5
1.聲明 @property
中 NSString
屬性用 copy
和 strong
修飾的區(qū)別?
同面試題1
2.請(qǐng)說(shuō)明一下參數(shù)區(qū)別: assign
, weak
, unsafe_unretain
, __block
和 __weak
同面試題1
3.@synthesize
和 @dynamic
分別有什么作用?
同面試題1
4.在 ARC
的項(xiàng)目中, 會(huì)出現(xiàn)內(nèi)存泄露問(wèn)題嗎? 請(qǐng)舉例說(shuō)明.
鏈接
5.描述一個(gè) Block
里循環(huán)引用的實(shí)例.
鏈接
對(duì)象有一個(gè)Block屬性离唐,然而這個(gè)Block屬性中又引用了對(duì)象的其他成員變量病附,那么就會(huì)對(duì)這個(gè)變量本身產(chǎn)生強(qiáng)應(yīng)用,那么變量本身和他自己的Block屬性就形成了循環(huán)引用
6.NSNotification
和 KVO
區(qū)別, 各舉例一個(gè)應(yīng)用場(chǎng)景.
面試題2
7.loadView
是干嘛用的?
面試題4
8.描述 viewWillLayouSubView
的執(zhí)行過(guò)程
9.setNeedsLayout
, layoutNeeded
, setNeedsDisplay
, 它們的作用是什么?
- setNeedsDisplay調(diào)用drawRect方法來(lái)實(shí)現(xiàn)view的繪制
- setNeedsLayout則調(diào)用layoutSubView來(lái)實(shí)現(xiàn)view中subView的重新布局
10.如何高性能的給 UIImageView
加個(gè)圓角? (不推薦layer.cornerRadius
!)
方法一:最簡(jiǎn)單的方法, 但是會(huì)嚴(yán)重?fù)p耗性能
self.imageView=[[UIImageView alloc] initWithFrame:CGRectMake(100,200, 100, 100)];
[self.imageView setImage:[UIImage imageNamed:@"918BB156-1FBA-47B7-89D6-4F53518BBEED.jpg"]];
self.imageView.layer.cornerRadius = 50;
self.imageView.layer.masksToBounds = YES;
[self.view addSubview:self.imageView];
方法二:設(shè)置 Rasterize柵格化處理, 會(huì)將圖片放在緩存區(qū)亥鬓,不會(huì)不斷的進(jìn)行圖片渲染
self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];
[self.view addSubview:self.imageView];
[self.imageView setImage:[UIImage imageNamed:@"918BB156-1FBA-47B7-89D6-4F53518BBEED.jpg"]];
self.imageView.layer.cornerRadius = 100;
self.imageView.layer.shouldRasterize = YES;
self.imageView.clipsToBounds = YES;
//不設(shè)置會(huì)模糊完沪,不相信可以自己嘗試
self.imageView.layer.rasterizationScale = [UIScreen mainScreen].scale;
方法三:貝塞爾曲線(xiàn)
self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];
UIImage *image = [UIImage imageNamed:@"918BB156-1FBA-47B7-89D6-4F53518BBEED.jpg"];
// 設(shè)置繪制環(huán)境
UIGraphicsBeginImageContextWithOptions(self.imageView.bounds.size, NO, 1);
// 在繪制之前先剪出一個(gè)圓形
[[UIBezierPath bezierPathWithRoundedRect:self.imageView.bounds cornerRadius:100] addClip];
// 圖片在設(shè)置的圓形里面繪制
[image drawInRect:self.imageView.bounds];
// 獲取照片
self.imageView.image = UIGraphicsGetImageFromCurrentImageContext();
// 結(jié)束繪制
UIGraphicsEndImageContext();
[self.view addSubview:self.imageView];
11.BAD_ACCESS
在什么情況下出現(xiàn)? 如何調(diào)試?
12.什么叫做符號(hào)化(Symbolication
)?
鏈接
13.什么是運(yùn)行時(shí)(Runtime
)? Method Swizzling
呢?
Runtime:Objective-C的動(dòng)態(tài)特性
Method Swizzling:方法交換
14.什么是 Runloop
? Runloop
和線(xiàn)程有什么關(guān)系?
深入理解RunLoop
15.MD5
和 Base64
的區(qū)別, 各自場(chǎng)景是什么?
參考答案:
做過(guò)加密相關(guān)的功能的,幾乎都會(huì)使用到MD5和Base64嵌戈,它們兩者在實(shí)際開(kāi)發(fā)中是最常用的覆积。
MD5:是一種不可逆的摘要算法,用于生成摘要熟呛,無(wú)法逆著破解得到原文宽档。常用的是生成32位摘要,用于驗(yàn)證數(shù)據(jù)的有效性庵朝。比如吗冤,在網(wǎng)絡(luò)請(qǐng)求接口中又厉,通過(guò)將所有的參數(shù)生成摘要,客戶(hù)端和服務(wù)端采用同樣的規(guī)則生成摘要欣孤,這樣可以防篡改。又如昔逗,下載文件時(shí)降传,通過(guò)生成文件的摘要,用于驗(yàn)證文件是否損壞勾怒。
Base64:屬于加密算法婆排,是可逆的,經(jīng)過(guò)encode后笔链,可以decode得到原文段只。在開(kāi)發(fā)中,有的公司上傳圖片采用的是將圖片轉(zhuǎn)換成base64字符串鉴扫,再上傳赞枕。在做加密相關(guān)的功能時(shí),通常會(huì)將數(shù)據(jù)進(jìn)行base64加密/解密坪创。
- 寫(xiě)出以下代碼的輸出結(jié)果
dispatch_queue_t queue = dispatch_queue_create("my.label", DISPATCH_QUEUE_SERIAL);
NSLog(@"1");
dispatch_async(queue, ^{
NSLog(@"2");
dispatch_sync(queue, ^{
NSLog(@"3");
});
NSLog(@"4");
});
NSLog(@"5");
輸出結(jié)果:
1
5
2
17.根據(jù)你之前做過(guò)的項(xiàng)目, 描述一個(gè)緩存模型或者框架(例如圖片內(nèi)存緩存器)
--
面試題6
- 用偽代碼實(shí)現(xiàn)遞歸的快速排序算法.
- 簡(jiǎn)述一下
UITableView
的框架和使用方法.
比較詳細(xì)的介紹了UITableView - 簡(jiǎn)述
ASIHTTPRequest
的使用方法
該作者已經(jīng)停止更新 沒(méi)使用過(guò)
鏈接 - 簡(jiǎn)述
iOS
的單元測(cè)試方法.
鏈接 - 將
abcde
入棧, 不可能的出棧順序.
不可能的出棧順序: 1.ECDBA 2.DCEAB
1.在E先出棧的情況下(說(shuō)明此時(shí)abcde均已入棧),不可能出現(xiàn)C在D之前出棧
2.AB均入棧的情況下, A不可能在B之前出棧 -
int find(int *a, int n, int count)count
為 a 數(shù)組長(zhǎng)度; n 為要查找的數(shù), 假設(shè) a 為有序的數(shù)組. - 為什么很多內(nèi)置的類(lèi), 如
Table ViewController
的delegate
的屬性是assign
不是retain
?
防止在ARC情況下出現(xiàn)循環(huán)引用 - 由于
UDID
這些無(wú)法被調(diào)用了, 有什么方法可以確定iOS
設(shè)備的唯一性
鏈接 - 列舉一下自己遇到過(guò)的
iOS App
審核被拒的解決經(jīng)歷
略
面試題7
1.簡(jiǎn)述OC中內(nèi)存管理機(jī)制炕婶。與 retain
配對(duì)使用的方法是 dealloc
還是 release
,為什么莱预?需要與 alloc
配對(duì)使用的方法是 dealloc
還是 release
柠掂,為什么? readwrite
依沮, readonly
涯贞, assign
, retain
危喉, copy
宋渔, nonatomic
、 atomic
辜限、 strong
傻谁、 weak
屬性的作用?
面試題1
2.類(lèi)變量的 @protected
, @private
, @public
, @package
列粪,聲明各有什么含義审磁?
- @private 實(shí)例變量只能被聲明它的類(lèi)訪(fǎng)問(wèn)
- @protected 實(shí)例變量能被聲明它的類(lèi)和子類(lèi)訪(fǎng)問(wèn), 如果沒(méi)有自定義關(guān)鍵字, 是默認(rèn)的選項(xiàng)
- @public 實(shí)例變量可以被在任何地方訪(fǎng)問(wèn)
- @package Objective-C中的@package與C語(yǔ)言中變量和函數(shù)的private_extern類(lèi)似。任何在實(shí)現(xiàn)類(lèi)的鏡像之外的代碼想使用這個(gè)實(shí)例變量都會(huì)引發(fā)link error(作用域:只能在聲明的文件中使用)
3.線(xiàn)程是什么岂座?進(jìn)程是什么态蒂?二者有什么區(qū)別和聯(lián)系?
進(jìn)程與線(xiàn)程的一個(gè)簡(jiǎn)單解釋
進(jìn)程和線(xiàn)程的區(qū)別费什?
4.談?wù)勀銓?duì)多線(xiàn)程開(kāi)發(fā)的理解钾恢?iOS
中有幾種實(shí)現(xiàn)多線(xiàn)程的方法手素?
關(guān)于iOS多線(xiàn)程,你看我就夠了
5.線(xiàn)程同步和異步的區(qū)別瘩蚪?IOS
中如何實(shí)現(xiàn)多線(xiàn)程的同步泉懦?
關(guān)于iOS多線(xiàn)程,你看我就夠了
6.假設(shè)有一個(gè)字符串aabcad
疹瘦,請(qǐng)寫(xiě)一段程序崩哩,去掉字符串中不相鄰的重復(fù)字符串,即上述字符串處理之后的輸出結(jié)果為:aabcd
NSMutableString *str = @"aabcad".mutableCopy;
NSMutableArray *marry = [[NSMutableArray alloc]init];
for (int i = 0; i < str.length - 1; i++) {
unsigned char a = [str characterAtIndex:i];
for (int j = i + 1; j < str.length; j++) {
unsigned char b = [str characterAtIndex:j];
if (a == b) {
if (j == i + 1) {
} else {
[marry addObject:[NSString stringWithFormat:@"%d",j]];
}
}
}
}
for (int i = (int)marry.count - 1; i > 0; i--) {
NSInteger num = [[marry objectAtIndex:i]intValue];
[str deleteCharactersInRange:NSMakeRange(num, 1)];
}
NSLog(@"%@", str);
7.獲取一臺(tái)設(shè)備唯一標(biāo)識(shí)的方法有哪些言沐?
鏈接
8.iOS
類(lèi)是否可以多繼承邓嘹?如果沒(méi)有,那可以用其他方法實(shí)現(xiàn)嗎险胰?簡(jiǎn)述實(shí)現(xiàn)過(guò)程汹押。
沒(méi)有 用 類(lèi)目 和 延展 可以實(shí)現(xiàn)
9.堆和棧的區(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)制文件。
10.iOS
本地?cái)?shù)據(jù)存儲(chǔ)都有哪幾種方式陋守?
- 1.plist文件存儲(chǔ)
- 2.NSUserDefaults
- 3.NSKeyedArchiver:(歸檔)采用歸檔的形式來(lái)保存數(shù)據(jù)震贵,該數(shù)據(jù)對(duì)象需要遵守NSCoding協(xié)議,并且該對(duì)象對(duì)應(yīng)的類(lèi)必須提供encodeWithCoder:和initWithCoder:方法水评。
- 4.Write寫(xiě)入方式:永久保存在磁盤(pán)中猩系。但是只支持NSString、 NSData中燥、NSArray寇甸、NSDictionary
- 5.SQLite(FMDB):注意FMDB不是數(shù)據(jù)庫(kù), 而是一個(gè)SQLite管理框架.
- 6.CoreData:切記CoreData不是數(shù)據(jù)庫(kù), 他的存儲(chǔ)核心思想是托管對(duì)象, 只是咱們經(jīng)常用的存儲(chǔ)文件為SQLite.還可以用XML, 二進(jìn)制等方式. CoreData入門(mén)
11.iOS
動(dòng)態(tài)類(lèi)型和動(dòng)態(tài)綁定、動(dòng)態(tài)載入
- 1.動(dòng)態(tài)類(lèi)型:如id類(lèi)型疗涉。實(shí)際上靜態(tài)類(lèi)型因?yàn)槠涔潭ㄐ院涂深A(yù)知性而使用得更加廣泛拿霉。靜態(tài)類(lèi)型是強(qiáng)類(lèi)型,而動(dòng)態(tài)類(lèi)型屬于弱類(lèi)型咱扣。運(yùn)行時(shí)決定接收者绽淘。
- 2.動(dòng)態(tài)綁定:讓代碼在運(yùn)行時(shí)判斷需要調(diào)用什么方法,而不是在編譯時(shí)闹伪。與其他面向?qū)ο笳Z(yǔ)言一樣沪铭,方法調(diào)用和代碼并沒(méi)有在編譯時(shí)連接在一起壮池,而是在消息發(fā)送時(shí)才進(jìn)行連接。運(yùn)行時(shí)決定調(diào)用哪個(gè)方法杀怠。
- 3.動(dòng)態(tài)載入:讓程序在運(yùn)行時(shí)添加代碼模塊以及其他資源, 用戶(hù)可以根據(jù)需要加載一些可執(zhí)行代碼和資源椰憋,而不是在啟動(dòng)時(shí)就加載所有組件∨馔耍可執(zhí)行代碼中可以含有和程序運(yùn)行時(shí)整合的新類(lèi)橙依。
Objective-C多態(tài):動(dòng)態(tài)類(lèi)型識(shí)別+動(dòng)態(tài)綁定+動(dòng)態(tài)加載
面試題8
1.寫(xiě)出方法獲取iOS
內(nèi)存使用情況。
// 獲取當(dāng)前設(shè)備可用內(nèi)存及所占內(nèi)存的頭文件
#import <sys/sysctl.h>
#import <mach/mach.h>
// 獲取當(dāng)前設(shè)備可用內(nèi)存(單位:MB)
- (double)availableMemory
{
vm_statistics_data_t vmStats;
mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT;
kern_return_t kernReturn = host_statistics(mach_host_self(),
HOST_VM_INFO,
(host_info_t)&vmStats,
&infoCount);
if (kernReturn != KERN_SUCCESS) {
return NSNotFound;
}
return ((vm_page_size *vmStats.free_count) / 1024.0) / 1024.0;
}
// 獲取當(dāng)前任務(wù)所占用的內(nèi)存(單位:MB)
- (double)usedMemory
{
task_basic_info_data_t taskInfo;
mach_msg_type_number_t infoCount = TASK_BASIC_INFO_COUNT;
kern_return_t kernReturn = task_info(mach_task_self(),
TASK_BASIC_INFO,
(task_info_t)&taskInfo,
&infoCount);
if (kernReturn != KERN_SUCCESS) {
return NSNotFound;
}
return taskInfo.resident_size / 1024.0 / 1024.0;}
2.深拷貝和淺拷貝的理解离钝?
見(jiàn)上面題
3.怎樣實(shí)現(xiàn)一個(gè)singleton
的類(lèi)票编。
+ (Singleton *) sharedInstance {
static Singleton *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[Singleton alloc] init];
});
return sharedInstance;
}
4.什么是安全釋放褪储?
把對(duì)象指著置為nil,再對(duì)其釋放
5.RunLoop
是什么卵渴?
一個(gè)RunLoop就是一個(gè)事件處理的循環(huán),用來(lái)不停的調(diào)度工作以及處理輸入時(shí)間鲤竹。使用runloop的目的是讓你的線(xiàn)程在有工作的時(shí)候忙于工作,而沒(méi)工作的時(shí)候處于休眠狀態(tài)浪读。runloop的設(shè)計(jì)是為了減少cpu無(wú)謂的空轉(zhuǎn)。每個(gè)開(kāi)辟的線(xiàn)程都有一個(gè)Runloop, 主線(xiàn)程的Runloop時(shí)默認(rèn)開(kāi)啟的, 咱們手動(dòng)開(kāi)辟的子線(xiàn)程Runloop是默認(rèn)不開(kāi)啟的, 如果需要開(kāi)啟, 需要調(diào)用
API[[NSRunloop currentRunloop] run]
開(kāi)啟.最常見(jiàn)的需要開(kāi)啟Runloop的是在子線(xiàn)程里面調(diào)用計(jì)時(shí)器(NSTimer), 如果不開(kāi)啟 runloop循環(huán)方法就不能正常執(zhí)行.
6.什么是序列化和反序列化辛藻,可以用來(lái)做什么碘橘?如何在OC中實(shí)現(xiàn)復(fù)雜對(duì)象的存儲(chǔ)?
如果你需要存儲(chǔ)一個(gè)復(fù)雜的對(duì)象的話(huà)吱肌,經(jīng)常要以二進(jìn)制的方法序列化這個(gè)對(duì)象痘拆,這個(gè)過(guò)程叫Archiving。如果一個(gè)對(duì)象需要進(jìn)行序列化氮墨,那么需要遵循NScoding協(xié)議纺蛆,主要有兩個(gè)方法: -(id)initWithCoder:(NSCoder)coder;//從coder中讀取數(shù)據(jù),保存到相應(yīng)變量中规揪,即反序列化數(shù)據(jù)桥氏。 -(void)encodeWithCoder:(NSCoder)coder;//讀取實(shí)例變量,并把這些數(shù)據(jù)寫(xiě)到coder中去猛铅,即序列化數(shù)據(jù)字支。
主要用于存儲(chǔ)對(duì)象狀態(tài)為另一種通用格式,比如存儲(chǔ)為二進(jìn)制奸忽、xml堕伪、json等等
7.寫(xiě)一個(gè)標(biāo)準(zhǔn)宏MIN
,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)栗菜?
#define MIN_NUMBER(a, b) ((a)<(b))?(a):(b)
運(yùn)算符優(yōu)先級(jí)(不加括號(hào)可能會(huì)出現(xiàn)歧義)
8.iphone os
有沒(méi)有垃圾回收機(jī)制刃跛?簡(jiǎn)單闡述一下OC
內(nèi)存管理。
iphone os沒(méi)有垃圾回收機(jī)制苛萎。
垃圾回收機(jī)制用于在空閑時(shí)間以不定時(shí)的方式動(dòng)態(tài)的回收無(wú)任何引用的對(duì)象占據(jù)的內(nèi)存空間
OC內(nèi)存管理:
OC的內(nèi)存管理機(jī)制是引用計(jì)數(shù), 內(nèi)存管理原則是誰(shuí)開(kāi)辟誰(shuí)釋放, 有retain就要有release.
.分為ARC(自動(dòng)引用計(jì)數(shù))和MRC(非自動(dòng)引用計(jì)數(shù)), 在MRC下, 我們需要手動(dòng)管理內(nèi)存,需要使用到 retain/copy/release/autorelease等方法實(shí)現(xiàn)內(nèi)存管理, ARC下一般不需要程序員手動(dòng)管理內(nèi)存, 系統(tǒng)會(huì)為程序添加自動(dòng)釋放池以實(shí)現(xiàn)內(nèi)存管理, 當(dāng)然, 咱們說(shuō)的一般不需要不能理解為完全不需要考慮內(nèi)存問(wèn)題, 比如在解決block循環(huán)引用問(wèn)題的時(shí)候, 就需要使用__weak修飾, 需要注意的是ARC和MRC下解決循環(huán)引用的方法還不一樣,MRC下是__block, ARC下是__weak .
9.簡(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)applicationDidBecomeActive:(UIApplication *)application {
}
10.ViewController
的 alloc
,loadView
, viewDidLoad
,viewWillAppear
, viewDidUnload
, dealloc
蛙酪、init
分別是在什么時(shí)候調(diào)用的齐苛?在自定義ViewController
的時(shí)候這幾個(gè)函數(shù)里面應(yīng)該做什么工作?
alloc初始化當(dāng)前的ViewController
loadView:沒(méi)有正在使用nib視圖頁(yè)面桂塞,子類(lèi)將會(huì)創(chuàng)建自己的自定義視圖層
viewDidLoad:試圖被加載后調(diào)用
viewWillAppear:試圖即將出現(xiàn)的時(shí)候調(diào)用
viewDidUnload:<iOS6之后廢棄>當(dāng)系統(tǒng)內(nèi)存吃緊的時(shí)候會(huì)調(diào)用該方法,釋放掉當(dāng)前未在window中顯示的試圖和對(duì)應(yīng)的控制器