轉(zhuǎn):IOS一些面試題整理

斐波那契數(shù)列(Fibonacci sequence)

func Fib() -> Int {
   var prev = 0
   var curr = 1
   for _ in 1 ..< 100 {
    var temp = curr
    curr = prev + curr
    prev = temp
  }
   return curr
}

nil、Nil、NULL、NSNull的區(qū)別

nil:指向一個(gè)對(duì)象的空指針,對(duì)objective c id 對(duì)象賦空值.

Nil:指向一個(gè)類(lèi)的空指針,表示對(duì)類(lèi)進(jìn)行賦空值.

NULL:指向其他類(lèi)型(如:基本類(lèi)型、C類(lèi)型)的空指針, 用于對(duì)非對(duì)象指針賦空值.

NSNull:在集合對(duì)象中,表示空值的對(duì)象.

網(wǎng)絡(luò)圖片處理

圖片處理.png

SDWebImage的使用

第一步,下載SDWebImage,導(dǎo)入工程。github托管地址https://github.com/rs/SDWebImage
第二步,在需要的地方導(dǎo)入頭文件
1   #import "UIImageView+WebCache.h"
第三步,調(diào)用sd_setImageWithURL:方法緩存圖片,注意,這就是新版本的新方法,舊方法是setImageWithURL:。下面將幾個(gè)方法都介紹一下。
1. sd_setImageWithURL:
/圖片緩存的基本代碼,就是這么簡(jiǎn)單
    [self.image1 sd_setImageWithURL:imagePath1];
2. sd_setImageWithURL:  completed:
//用block 可以在圖片加載完成之后做些事情
    [self.image2 sd_setImageWithURL:imagePath2 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
         
        NSLog(@"這里可以在圖片加載完成之后做些事情");
         
    }];
3. sd_setImageWithURL:  placeholderImage:
//給一張默認(rèn)圖片,先使用默認(rèn)圖片,當(dāng)圖片加載完成后再替換
    [self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"default"]];
4. sd_setImageWithURL:  placeholderImage:  completed:
//使用默認(rèn)圖片,而且用block 在完成后做一些事情
    [self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"default"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
         
        NSLog(@"圖片加載完成后做的事情");
         
    }];
5. sd_setImageWithURL:  placeholderImage:  options:
//options 選擇方式
     
    [self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"default"] options:SDWebImageRetryFailed];
其他就不一一介紹了,oc是自文檔語(yǔ)言,看方法名就知道干什么的了。除了帶options選項(xiàng)的方法,其他的方法都是綜合存儲(chǔ),也就是內(nèi)存緩存和磁盤(pán)緩存結(jié)合的方式,如果你只需要內(nèi)存緩存,那么在options這里選擇SDWebImageCacheMemoryOnly就可以了。
如果不想深入了解,到這里你已經(jīng)可以用SDWebimage進(jìn)行圖片緩存了,接下來(lái)我要解釋options的所有選項(xiàng),以及SDWebImage內(nèi)部執(zhí)行流程。
一、options所有選項(xiàng):
//失敗后重試
     SDWebImageRetryFailed = 1 << 0,
      
     //UI交互期間開(kāi)始下載,導(dǎo)致延遲下載比如UIScrollView減速。
     SDWebImageLowPriority = 1 << 1,
      
     //只進(jìn)行內(nèi)存緩存
     SDWebImageCacheMemoryOnly = 1 << 2,
      
     //這個(gè)標(biāo)志可以漸進(jìn)式下載,顯示的圖像是逐步在下載
     SDWebImageProgressiveDownload = 1 << 3,
      
     //刷新緩存
     SDWebImageRefreshCached = 1 << 4,
      
     //后臺(tái)下載
     SDWebImageContinueInBackground = 1 << 5,
      
     //NSMutableURLRequest.HTTPShouldHandleCookies = YES;
      
     SDWebImageHandleCookies = 1 << 6,
      
     //允許使用無(wú)效的SSL證書(shū)
     //SDWebImageAllowInvalidSSLCertificates = 1 << 7,
      
     //優(yōu)先下載
     SDWebImageHighPriority = 1 << 8,
      
     //延遲占位符
     SDWebImageDelayPlaceholder = 1 << 9,
      
     //改變動(dòng)畫(huà)形象
     SDWebImageTransformAnimatedImage = 1 << 10,

SDWebImage內(nèi)部實(shí)現(xiàn)過(guò)程

1. 入口 setImageWithURL:placeholderImage:options: 會(huì)先把 placeholderImage 顯示,然后 SDWebImageManager 根據(jù) URL 開(kāi)始處理圖片。
2. 進(jìn)入 SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交給 SDImageCache 從緩存查找圖片是否已經(jīng)下載 queryDiskCacheForKey:delegate:userInfo:.
3. 先從內(nèi)存圖片緩存查找是否有圖片,如果內(nèi)存中已經(jīng)有圖片緩存,SDImageCacheDelegate 回調(diào) imageCache:didFindImage:forKey:userInfo: 到 SDWebImageManager。
4. SDWebImageManagerDelegate 回調(diào) webImageManager:didFinishWithImage: 到 UIImageView+WebCache 等前端展示圖片。
5. 如果內(nèi)存緩存中沒(méi)有,生成 NSInvocationOperation 添加到隊(duì)列開(kāi)始從硬盤(pán)查找圖片是否已經(jīng)緩存。
6. 根據(jù) URLKey 在硬盤(pán)緩存目錄下嘗試讀取圖片文件。這一步是在 NSOperation 進(jìn)行的操作,所以回主線(xiàn)程進(jìn)行結(jié)果回調(diào) notifyDelegate:。
7. 如果上一操作從硬盤(pán)讀取到了圖片,將圖片添加到內(nèi)存緩存中(如果空閑內(nèi)存過(guò)小,會(huì)先清空內(nèi)存緩存)。SDImageCacheDelegate 回調(diào) imageCache:didFindImage:forKey:userInfo:。進(jìn)而回調(diào)展示圖片。
8. 如果從硬盤(pán)緩存目錄讀取不到圖片,說(shuō)明所有緩存都不存在該圖片,需要下載圖片,回調(diào) imageCache:didNotFindImageForKey:userInfo:。
9. 共享或重新生成一個(gè)下載器 SDWebImageDownloader 開(kāi)始下載圖片。
10. 圖片下載由 NSURLConnection 來(lái)做,實(shí)現(xiàn)相關(guān) delegate 來(lái)判斷圖片下載中、下載完成和下載失敗。
11. connection:didReceiveData: 中利用 ImageIO 做了按圖片下載進(jìn)度加載效果。
12. connectionDidFinishLoading: 數(shù)據(jù)下載完成后交給 SDWebImageDecoder 做圖片解碼處理。
13. 圖片解碼處理在一個(gè) NSOperationQueue 完成,不會(huì)拖慢主線(xiàn)程 UI。如果有需要對(duì)下載的圖片進(jìn)行二次處理,最好也在這里完成,效率會(huì)好很多。
14. 在主線(xiàn)程 notifyDelegateOnMainThreadWithInfo: 宣告解碼完成,imageDecoder:didFinishDecodingImage:userInfo: 回調(diào)給 SDWebImageDownloader。
15. imageDownloader:didFinishWithImage: 回調(diào)給 SDWebImageManager 告知圖片下載完成。
16. 通知所有的 downloadDelegates 下載完成,回調(diào)給需要的地方展示圖片。
17. 將圖片保存到 SDImageCache 中,內(nèi)存緩存和硬盤(pán)緩存同時(shí)保存。寫(xiě)文件到硬盤(pán)也在以單獨(dú) NSInvocationOperation 完成,避免拖慢主線(xiàn)程。
18. SDImageCache 在初始化的時(shí)候會(huì)注冊(cè)一些消息通知,在內(nèi)存警告或退到后臺(tái)的時(shí)候清理內(nèi)存圖片緩存,應(yīng)用結(jié)束的時(shí)候清理過(guò)期圖片。
19. SDWI 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache,方便使用。
20. SDWebImagePrefetcher 可以預(yù)先下載圖片,方便后續(xù)使用。
從上面流程可以看出,當(dāng)你調(diào)用setImageWithURL:方法的時(shí)候,他會(huì)自動(dòng)去給你干這么多事,當(dāng)你需要在某一具體時(shí)刻做事情的時(shí)候,你可以覆蓋這些方法。比如在下載某個(gè)圖片的過(guò)程中要響應(yīng)一個(gè)事件,就覆蓋這個(gè)方法:
//覆蓋方法,指哪打哪,這個(gè)方法是下載imagePath2的時(shí)候響應(yīng)
    SDWebImageManager *manager = [SDWebImageManager sharedManager];
     
    [manager downloadImageWithURL:imagePath2 options:SDWebImageRetryFailed progress:^(NSInteger receivedSize, NSInteger expectedSize) {
         
        NSLog(@"顯示當(dāng)前進(jìn)度");
         
    } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
         
        NSLog(@"下載完成");
    }];
對(duì)于初級(jí)來(lái)說(shuō),用sd_setImageWithURL:的若干個(gè)方法就可以實(shí)現(xiàn)很好的圖片緩存。

http://www.cocoachina.com/ios/20141212/10622.html

屬性相關(guān)的關(guān)鍵字,可以按照一些功能來(lái)分類(lèi)
線(xiàn)程相關(guān)

atomic:默認(rèn)為該屬性,功能為在多線(xiàn)程的情況下,編譯器自動(dòng)生成相應(yīng)的線(xiàn)程安全代碼,達(dá)到互斥加鎖的目的,避免所對(duì)應(yīng)的變量出現(xiàn)讀寫(xiě)不同步的問(wèn)題。
nonatomic:當(dāng)該變量不需要考慮多線(xiàn)程的情況時(shí)使用該關(guān)鍵字,能夠提高性能和效率。
atomic主要用于線(xiàn)程保護(hù)的,可以避免當(dāng)一個(gè)線(xiàn)程在對(duì)一個(gè)地址進(jìn)行訪(fǎng)問(wèn)時(shí)防止另一個(gè)線(xiàn)程對(duì)此地址同時(shí)進(jìn)行訪(fǎng)問(wèn),防止了數(shù)據(jù)錯(cuò)誤。眾所周知,線(xiàn)程鎖會(huì)耗費(fèi)系統(tǒng)資源,所以在實(shí)際使用時(shí),如果沒(méi)有線(xiàn)程相關(guān)的內(nèi)容,建議使用nonatomic。
目前大部分的iOS app中,nonatomic的普遍使用也是基于性能考慮的。

讀寫(xiě)相關(guān)

readwrite:默認(rèn)類(lèi)型,會(huì)自動(dòng)生成相應(yīng)的讀寫(xiě)方法。
readonly:只生成相應(yīng)的get方法,不生成set方法。
主要使用目的:控制外部類(lèi)對(duì)該屬性的訪(fǎng)問(wèn)權(quán)限。

內(nèi)存引用相關(guān)

這里又根據(jù)系統(tǒng)版本分為兩類(lèi),一類(lèi)是iOS 5.0之前,一類(lèi)是iOS 5.0加入了ARC機(jī)制之后。

ARC之前

assgin:默認(rèn)類(lèi)型,set方法中為直接賦值,即直接指向了一個(gè)地址,沒(méi)有任何引用計(jì)數(shù)的更改。
retain:set方法中,首先釋放(release)之前的對(duì)象,即去除對(duì)于舊對(duì)象的引用計(jì)數(shù),并直接指向新的對(duì)象的地址,并使新對(duì)象的引用計(jì)數(shù)加一。
copy:set方法中,與retain類(lèi)似,先release舊對(duì)象,然后對(duì)于新的對(duì)象進(jìn)行copy,實(shí)質(zhì)為使用新的內(nèi)存空間和地址,引用計(jì)數(shù)唯一,并將目標(biāo)對(duì)象的內(nèi)容拷貝過(guò)來(lái)。可以認(rèn)為是內(nèi)容拷貝。

ARC之后

weak:弱引用,與assgin類(lèi)似,只是當(dāng)對(duì)象釋放后,weak類(lèi)型會(huì)自動(dòng)置空,即將指針設(shè)為nil,避免野指針。
strong:強(qiáng)引用,默認(rèn)類(lèi)型,與retain類(lèi)似。
內(nèi)存計(jì)數(shù)方面的關(guān)鍵字是objc主要內(nèi)容。

CALayer和UIView的區(qū)別聯(lián)系

1 UIView是UIKIt的只能在iOS使用, CALayer是QuartzCore的 iOS和mac os通用
2 CALayer比UIView更加輕量級(jí),但是可以實(shí)現(xiàn)同樣的效果
3 UIView的CALayer類(lèi)似UIView的子View樹(shù)形結(jié)構(gòu)
4 UIView比CALayer多了一個(gè)事件處理功能,也就是說(shuō)UIView能處理用戶(hù)觸摸
5 UIView有個(gè)重要的屬性layer,可以返回它的主CALayer實(shí)例.CALayer *layer = myView.layer
6 坐標(biāo)系統(tǒng): CALayer的坐標(biāo)系統(tǒng)比UIView多了一個(gè)anchorPoint屬性
8 渲染 當(dāng)更新層 改變不能立即顯示在屏幕上.當(dāng)所有的層都準(zhǔn)備好時(shí),可以調(diào)用setNeedsDisplay方法來(lái)重繪顯示.
9 變換 要在一個(gè)層中添加一個(gè)3D或仿射變換,可以分別設(shè)置層的transform或者affineTransform屬性
10 變形Quartz Core的渲染能力 使二維圖像可以被自由的操縱,就像是三維的.圖像可以在一個(gè)三維坐標(biāo)系中以任意的角度被旋轉(zhuǎn) 縮放 和傾斜.CATransform3D的一套方法提供了一些魔術(shù)般的效果

簡(jiǎn)述同步和異步

同步:串行的執(zhí)行任務(wù) 異步:并行的執(zhí)行任務(wù).同步函數(shù)不具備開(kāi)啟線(xiàn)程的能力,而異步函數(shù)具備
所謂同步,就是在發(fā)出一個(gè)調(diào)用時(shí),在沒(méi)有得到結(jié)果之前,該調(diào)用就不返回.但是一旦調(diào)用返回,就得到返回值了.也就是 由調(diào)用者主動(dòng)等待這個(gè)調(diào)用結(jié)果。而異步則是相反,調(diào)用在發(fā)出之后,這個(gè)調(diào)用就直接返回了,所以沒(méi)有返回結(jié)果.換句話(huà)說(shuō)就是當(dāng)一個(gè)異步過(guò)程調(diào)用發(fā)出后,調(diào)用者不會(huì)立刻得到結(jié)果。而是在調(diào)用發(fā)出后,被調(diào)用者通過(guò)狀態(tài)、通知來(lái)通知調(diào)用者,或通過(guò)回調(diào)函數(shù)處理這個(gè)調(diào)用.

多線(xiàn)程安全怎么控制?

用互斥鎖,隊(duì)列組,柵欄函數(shù),依賴(lài)

什么時(shí)候使用繼承,什么時(shí)候使用類(lèi)別

在OC中,一個(gè)類(lèi)繼承另一個(gè)類(lèi),就是繼承了父類(lèi)所有的屬性和方法,并且可以擴(kuò)充自己的屬性:而類(lèi)別是在不改變?cè)蓄?lèi)的基礎(chǔ)上進(jìn)行方法擴(kuò)充;
因此,根據(jù)開(kāi)發(fā)需求,如果這個(gè)類(lèi)需要擴(kuò)充屬性,或者需要重寫(xiě)系統(tǒng)的類(lèi)的某些方法,用繼承;如果只是對(duì)一個(gè)類(lèi)擴(kuò)充接口和模塊,使用類(lèi)別更加方便.

關(guān)鍵字const有什么含意?修飾類(lèi)呢?static的作用,用于類(lèi)呢?還有extern c的作用?

當(dāng)使用 const修飾基數(shù)數(shù)據(jù)類(lèi)型變量時(shí),該變量就變?yōu)槌A?進(jìn)入靜態(tài)區(qū)
當(dāng)使用const修飾指針類(lèi)型變量時(shí):
當(dāng)使用const在指針類(lèi)型兩邊,那么該指針變量指向的內(nèi)存空間的內(nèi)容就不能改變了,但指針的指向可以改變.
如果const在變量的左邊,那么該指針的指向不能改變了,而指向內(nèi)存空間的內(nèi)容可以改變
當(dāng)使用const修飾符時(shí),const NSSting *str,相當(dāng)于修飾該對(duì)象,表示對(duì)象是不可更改的.
static修飾變量,表示這個(gè)內(nèi)部全局變量,只能在本文件中訪(fǎng)問(wèn).系統(tǒng)會(huì)將該變量放進(jìn)靜態(tài)區(qū),它的生命周期被延長(zhǎng)到了程序結(jié)束
static修飾類(lèi), 表示這個(gè)內(nèi)部的方法, 只能在本文件中訪(fǎng)問(wèn).
extern c表示聲明了一外部變量, 多個(gè)外部變量如果同名,實(shí)際指向的是同一塊存儲(chǔ)空間.

UIView從出現(xiàn)到銷(xiāo)毀的過(guò)程?

loadView
viewDidLoad
viewWillAppear
viewWillLayoutSubviews
viewDidlayoutSubviews
viewDidAppear
viewWillDisappear
viewDidDisappear

frame和bounds有什么不同

frame的位置是相對(duì)父空間的左上角來(lái)說(shuō)的 參照的是父類(lèi)的坐標(biāo)系,指的是空間在父控件內(nèi)的位置和大小
bounds的位置是相對(duì)控件自身的左上角來(lái)說(shuō)的,參照的是自身坐標(biāo)系,指的是自己本身的大小

NSTimer和GCD的定時(shí)器有什么區(qū)別

NSTimer 可以調(diào)用invalidate進(jìn)行撤銷(xiāo),創(chuàng)建和撤銷(xiāo)必須在同一線(xiàn)程
NSTimer需要交定時(shí)器添加到當(dāng)前的runloop中
它的時(shí)間單位是秒
GCD一旦執(zhí)行就不能撤銷(xiāo)
GCD中的定時(shí)器不受runloop模式的影響
時(shí)間單位是納秒

應(yīng)用程序的沙盒下,都有哪些文件夾?它們有什么特點(diǎn)?本地緩存一般存在哪個(gè)文件下?

1 Documents
將應(yīng)用程序的數(shù)據(jù)文件保存在該目錄下.不過(guò)這些數(shù)據(jù)類(lèi)型僅限于不可以再生的數(shù)據(jù),可再生的數(shù)據(jù)文件應(yīng)該存在LIbrary/Cache下
2 Library 它有兩個(gè)子文件
caches 主要是緩存文件,用戶(hù)使用過(guò)程中緩存都可以保存在這些目錄中.保存那些可再生的文件,比如網(wǎng)絡(luò)數(shù)據(jù)請(qǐng)求.因此,應(yīng)用程序通常還需要負(fù)責(zé)刪除這些文件.
Preferences 應(yīng)用程序的偏好設(shè)置文件. 我們使用NSUserDefaults寫(xiě)的設(shè)置數(shù)據(jù)都會(huì)保存到該目錄下的一個(gè)plist文件中 它會(huì)被iTunes同步
3. tmp
各種臨時(shí)文件, 保存應(yīng)用再次啟動(dòng)時(shí)不需要的文件.而且,當(dāng)應(yīng)用不在需要這些文件時(shí)應(yīng)主動(dòng)將其刪除,因?yàn)樵撃夸浵碌臇|西隨時(shí)有可能被系統(tǒng)清除,目前已知的一種可能清理的原因是系統(tǒng)磁盤(pán)存儲(chǔ)空間不足的時(shí)候

__weak什么時(shí)候用?

當(dāng)兩個(gè)對(duì)象互相引用的時(shí)候,一端用strong,另一端必須用weak .例如: A擁有B, B也擁有A, 那么必須一方使用weak
一般UI控件都可以使用weak,因?yàn)樽陨硪呀?jīng)對(duì)它進(jìn)行一次強(qiáng)引用,沒(méi)有必要再?gòu)?qiáng)引用一次.

Object-c的類(lèi)可以多重繼承么?可以實(shí)現(xiàn)多個(gè)接口么?Category是什么?重寫(xiě)一個(gè)類(lèi)的方式用繼承好還是分類(lèi)好?為什么?

Object-c的類(lèi)不可以多重繼承;可以實(shí)現(xiàn)多個(gè)接口,通過(guò)實(shí)現(xiàn)多個(gè)接口可以完成C++的多重繼承;Category是類(lèi)別,一般情況用分類(lèi)好,用Category去重寫(xiě)類(lèi)的方法,僅對(duì)本Category有效,不會(huì)影響到其他類(lèi)與原有類(lèi)的關(guān)系。

寫(xiě)一個(gè)setter方法用于完成@property (nonatomic,retain)NSString *name,寫(xiě)一個(gè)setter方法用于完成@property(nonatomic,copy)NSString *name

- (void) setName:(NSString*) str
    {
        [str retain];
        [name release];
        name = str;
    }
    
    - (void)setName:(NSString *)str
    {
        id t = [str copy];
        [name release];
        name = t;
    }

Object C中創(chuàng)建線(xiàn)程的方法是什么?如果在主線(xiàn)程中執(zhí)行代碼,方法是什么?如果想延時(shí)執(zhí)行代碼、方法又是什么?

線(xiàn)程創(chuàng)建有三種方法:使用NSThread創(chuàng)建、使用GCD的dispatch、使用子類(lèi)化的NSOperation,然后將其加入NSOperationQueue;在主線(xiàn)程執(zhí)行代碼,方法是performSelectorOnMainThread,如果想延時(shí)執(zhí)行代碼可以用performSelector:onThread:withObject:waitUntilDone:

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

category 可以在不獲悉,不改變?cè)瓉?lái)代碼的情況下往里面添加新的方法,只能添加,不能刪除修改,并且如果類(lèi)別和原來(lái)類(lèi)中的方法產(chǎn)生名稱(chēng)沖突,則類(lèi)別將覆蓋原來(lái)的方法,因?yàn)轭?lèi)別具有更高的優(yōu)先級(jí)。
類(lèi)別主要有3個(gè)作用1).將類(lèi)的實(shí)現(xiàn)分散到多個(gè)不同文件或多個(gè)不同框架中。2).創(chuàng)建對(duì)私有方法的前向引用。3).向?qū)ο筇砑臃钦絽f(xié)議。繼承可以增加,修改或者刪除方法,并且可以增加屬性。

什么是KVO和KVC?

VC:鍵 – 值編碼是一種間接訪(fǎng)問(wèn)對(duì)象的屬性使用字符串來(lái)標(biāo)識(shí)屬性,而不是通過(guò)調(diào)用存取方法,直接或通過(guò)實(shí)例變量訪(fǎng)問(wèn)的機(jī)制。
KVO:鍵值觀(guān)察機(jī)制,他提供了觀(guān)察某一屬性變化的方法,極大的簡(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];
    }
}

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

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

“當(dāng)通過(guò)KVC調(diào)用對(duì)象時(shí),比如:[self valueForKey:@”someKey”]時(shí),程序會(huì)自動(dòng)試圖通過(guò)幾種不同的方式解析這個(gè)調(diào)用。首先查找對(duì)象是否帶有 someKey 這個(gè)方法,如果沒(méi)找到,會(huì)繼續(xù)查找對(duì)象是否帶有someKey這個(gè)實(shí)例變量(iVar),如果還沒(méi)有找到,程序會(huì)繼續(xù)試圖調(diào)用 -(id) valueForUndefinedKey:這個(gè)方法。如果這個(gè)方法還是沒(méi)有被實(shí)現(xiàn)的話(huà),程序會(huì)拋出一個(gè)NSUndefinedKeyException異常錯(cuò)誤。設(shè)計(jì)valueForUndefinedKey:方法的主要目的是當(dāng)你使用-(id)valueForKey方法從對(duì)象中請(qǐng)求值時(shí),對(duì)象能夠在錯(cuò)誤發(fā)生前,有最后的機(jī)會(huì)響應(yīng)這個(gè)請(qǐng)求。這樣做有很多好處,下面的兩個(gè)例子說(shuō)明了這樣做的好處?!?

對(duì)于單例的理解

在objective-c中要實(shí)現(xiàn)一個(gè)單例類(lèi),至少需要做以下四個(gè)步驟:
    1).為單例對(duì)象實(shí)現(xiàn)一個(gè)靜態(tài)實(shí)例,并初始化,然后設(shè)置成nil,
    2).實(shí)現(xiàn)一個(gè)實(shí)例構(gòu)造方法檢查上面聲明的靜態(tài)實(shí)例是否為nil,如果是則新建并返回一個(gè)本類(lèi)的實(shí)例,
    3).重寫(xiě)allocWithZone方法,用來(lái)保證其他人直接使用alloc和init試圖獲得一個(gè)新實(shí)力的時(shí)候不產(chǎn)生一個(gè)新實(shí)例,
    4).適當(dāng)實(shí)現(xiàn)allocWitheZone,copyWithZone,release和autorelease。

并行(Concurrent) & 串行(Serial)

并行和串行描述的是任務(wù)和任務(wù)之間的執(zhí)行方式,并行是任務(wù)A和任務(wù)B可以同時(shí)執(zhí)行,串行是任務(wù)A執(zhí)行完了任務(wù)B才能執(zhí)行(按順序執(zhí)行)。

異步(Asynchronous) & 同步(Synchronous)

異步和同步描述的其實(shí)就是函數(shù)什么時(shí)候返回. 比如用來(lái)下載圖片的函數(shù): 同步函數(shù)只有在image下載結(jié)束之后才返回, 下載的這段時(shí)間函數(shù)只能等待,而異步函數(shù),不會(huì)去等它完成(異步函數(shù)不會(huì)堵塞當(dāng)前線(xiàn)程去執(zhí)行下一個(gè)函數(shù))。

并發(fā)(Concurrency) & 并行(Parallelism)

這個(gè)更容易混淆了, 并發(fā)和并行都是用來(lái)讓不同的任務(wù)可以"同時(shí)執(zhí)行"。 只是并行是真同時(shí),而并發(fā)是假同時(shí)(是CPU地在各個(gè)進(jìn)程之間快速切換, 給人一種能同時(shí)處理多任務(wù)的錯(cuò)覺(jué))。

CAAnimation繼承結(jié)構(gòu)

2199750-55f7eeca360d509b.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,666評(píng)論 30 472
  • 基礎(chǔ) 1. 為什么說(shuō)Objective-C是一門(mén)動(dòng)態(tài)的語(yǔ)言? 2. 講一下MVC和MVVM,MVP? 3. 為...
    波妞和醬豆子閱讀 3,558評(píng)論 0 46
  • 多線(xiàn)程、特別是NSOperation 和 GCD 的內(nèi)部原理。運(yùn)行時(shí)機(jī)制的原理和運(yùn)用場(chǎng)景。SDWebImage的原...
    LZM輪回閱讀 2,132評(píng)論 0 12
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛(ài)閱讀 2,255評(píng)論 0 7
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,580評(píng)論 0 35

友情鏈接更多精彩內(nèi)容