iOS之面試題

之前看了很多面試題,感覺要不是不夠就是過於冗餘,於是我將網上的一些面試題進行了刪減和重排,現在分享給大家。

@property 後面可以有哪些修飾符?

線程安全的:
(atomic,nonatomic )nonatomic 非原子操作,決定編譯器生成的setter getter是否是原子操作,atomic表示多線程安全,一般使用nonatomic.
訪問權限的
(readonly,readwrite)readwrite 是可讀可寫特性;需要生成getter方法和setter方法時; readonly是隻讀特性,只會生成getter方法,不會生成setter方法,不希望屬性在類外改變
內存管理(ARC)
    (assign,strong,weak,copy)
內存管理(MRC)
    (assign,retain,copy)
    assign 是賦值特性,setter方法將傳入參數賦值給實例變量,僅設置變量時;
    retain 表示持有特性,setter方法將傳入參數先保留,再賦值,傳入參數的retaincount會+1;
    copy 表示賦值特性,setter方法將傳入對象複製一份;需要完全一份新的變量時。
指定方法名稱
    setter=
    getter=

什麼情況使用 weak 關鍵字,相比 assign 有什麼不同?比如:

在ARC中,出現循環引用的時候,必須要有一端使用weak,比如:自定義View的代理屬性
已經自身已經對它進行一次強應用,沒有必要在強引用一次,此時也會使用weak,自定義View的子控件屬性一般也使用weak;但是也可以使用strong weak當對象銷燬的時候,指針會被自動設置爲nil,而assign不會* assigin 可以用非OC對象,而weak必須用於OC對象

怎麼用 copy 關鍵字(深複製與淺複製)?

對象拷貝有兩種方式:淺複製和深複製。顧名思義,淺複製,並不拷貝對象本身,僅僅是拷貝指向對象的指針;深複製是直接拷貝整個對象內存到另一塊內存中。在非集合類對象中:對immutable對象進行copy操作,是指針複製,mutableCopy操作時內容複製;對mutable對象進行copy和mutableCopy都是內容複製。用@property聲明 NSString、NSArray、NSDictionary 經常使用copy關鍵字,是因爲他們有對應的可變類型:NSMutableString、NSMutableArray、NSMutableDictionary,他們之間可能進行賦值操作,爲確保對象中的字符串值不會無意間變動,應該在設置新屬性值時拷貝一份。
字符串使用copy是爲了外部把字符串內容改了,影響該屬性
block使用copy是在MRC遺留下來的,在MRC中,方法內部的block是在在棧區的,使用copy可以把它放到堆區.在ACR中對於block使用copy還是strong效果是一樣的

用@property聲明的NSString(或NSArray,NSDictionary)經常使用copy關鍵字,爲什麼?如果改用strong關鍵字,可能造成什麼問題?

因爲父類指針可以指向子類對象,使用copy的目的是爲了讓本對象的屬性不受外界影響,使用copy無論給我傳入是一個可變對象還是不可對象,我本身持有的就是一個不可變的副本.
如果我們使用是strong,那麼這個屬性就有可能指向一個可變對象,如果這個可變對象在外部被修改了,那麼會影響該屬性.

這個寫法會出什麼問題: @property (copy) NSMutableArray *array;

添加,刪除,修改數組內的元素的時候,程序會因爲找不到對於的方法而崩潰.因爲copy就是複製一個不可變NSArray的對象

如何讓自己的類用 copy 修飾符?

你是說讓我的類也支持copy的功能嗎?
如果面試官說是:
    遵守NSCopying協議
    實現 - (id)copyWithZone:(NSZone *)zone; 方法
如果面試官說否,是屬性中如何使用copy
    在使用字符串和block的時候一般都使用copy

@property 的本質是什麼?ivar、getter、setter 是如何生成並添加到這個類中的

在普通的OC對象中,@property就是編譯其自動幫我們生成一個私有的成員變量和setter與getter方法的聲明和實現
我爲了搞清屬性是怎麼實現的,曾經反編譯過相關的代碼,他大致生成了五個個東西
OBJC_IVAR_$類名$屬性名稱 該屬性的偏移量
setter與getter方法對應的實現函數
ivar_list 就是成員變量列表
method_list 方法列表
prop_list 屬性列表
也就是說我們每次在增加一個屬性,系統都會在ivar_list中添加一個成員變量的描述,在method_list中增加setter與getter方法的描述,在屬性列表中增加一個屬性的屬性的描述,然後計算該屬性在對象中的偏移量,然後伸出setter與getter方法對應的實現,在setter方法方法中從偏移量的位置開始賦值,在getter方法中從偏移量開始取值,爲了能夠讀取正確字節數,系統對象偏移量的指針類型進行了類型強轉.

@protocol 和 category 中如何使用 @property

在protocol中使用property只會生成setter和getter方法聲明,我們使用屬性的目的,是希望遵守我協議的對象的實現該屬性
category 使用 @property 也是隻會生成setter和getter方法的聲明,如果我們真的需要給category增加屬性的實現,需要藉助於運行時的兩個函數
    objc_setAssociatedObject
    objc_getAssociatedObject

@synthesize和@dynamic分別有什麼作用?

@property有兩個對應的詞,一個是@synthesize,一個是@dynamic。如果@synthesize和@dynamic都沒寫,那麼默認的就是@syntheszie var = _var;
@synthesize的語義是如果你沒有手動實現setter方法和getter方法,那麼編譯器會自動爲你加上這兩個方法。
@dynamic告訴編譯器,屬性的setter與getter方法由用戶自己實現,不自動生成。(當然對於readonly的屬性只需提供getter即可)。假如一個屬性被聲明爲@dynamic var,然後你沒有提供@setter方法和@getter方法,編譯的時候沒問題,但是當程序運行到instance.var =someVar,由於缺setter方法會導致程序崩潰;或者當運行到 someVar = var時,由於缺getter方法同樣會導致崩潰。編譯時沒問題,運行時才執行相應的方法,這就是所謂的動態綁定。

ARC下,不顯示指定任何屬性關鍵字時,默認的關鍵字都有哪些?

對應基本數據類型默認關鍵字是
atomic,readwrite,assign
對於普通的OC對象
atomic,readwrite,strong

#import 跟#include 又什麼區別 #import<> 跟 #import”“又什麼區別?

#import是Objective-C導入頭文件的關鍵字,#include是C/C++導入頭文件的關鍵字,使用#import頭文件會自動只導入一次,不會重複導入,相當於#include和#pragma once;@class告訴編譯器某個類的聲明,當執行時,纔去查看類的實現文件,可以解決頭文件的相互包含;#import<>用來包含系統的頭文件,#import””用來包含用戶頭文件。

objc中向一個nil對象發送消息將會發生什麼?

在Objective-C中向nil發送消息是完全有效的——只是在運行時不會有任何作用:
    如果一個方法返回值是一個對象,那麼發送給nil的消息將返回0(nil)。例如:Person * motherInlaw = [ aPerson spouse] mother];如果spouse對象爲nil,那麼發送給nil的消息mother也將返回nil。
    如果方法返回值爲指針類型,其指針大小爲小於或者等於sizeof(void*),float,double,long double 或者long long的整型標量,發送給nil的消息將返回0。
    如果方法返回值爲結構體,發送給nil的消息將返回0。結構體中各個字段的值將都是0。
    如果方法的返回值不是上述提到的幾種情況,那麼發送給nil的消息的返回值將是未定義的。

objc中向一個對象發送消息[obj foo]和objc_msgSend()函數之間有什麼關係?

該方法編譯之後就是objc_msgSend()函數調用.如果我沒有記錯的大概是這樣的.
((void ()(id, SEL))(void )objc_msgSend)((id)obj, sel_registerName("foo"));

什麼時候會報unrecognized selector的異常?

當該對象上某個方法,而該對象上沒有實現這個方法的時候

一個objc對象如何進行內存佈局?(考慮有父類的情況)

所有父類的成員變量和自己的成員變量都會存放在該對象所對應的存儲空間中.每一個對象內部都一個isA指針,指向他的類對象,類對象中存放着本對象的對象方法列表和成員變量的列表,屬性列表,它內部也有一個isA指針指向元對象(meta class),元對象內部存放的是類方法列表,類對象內部還有一個superclass的指針,指向他的父類對象根對象就是NSobject

一個objc對象的isa的指針指向什麼?有什麼作用?

指向他的類對象,從而可以找到對象上的方法

下面的代碼輸出什麼?

@implementation Son : Father
- (id)init
{
self = [super init];
if (self) {
NSLog(@”%@”, NSStringFromClass([self class]));
NSLog(@”%@”, NSStringFromClass([super class]));
}
return self;
}
@end

輸出的結果都是:Son,
原因:super 和 self 都是指向的本實例對象的,
不同的是,super調用的跳過本類方法,調用父類的方法父類方法的class方法本來都是在基類中實現的,所以無論使用self和super調用都是一樣的.

runtime如何通過selector找到對應的IMP地址?(分別考慮類方法和實例方法)

每一個類對象中都一個方法列表,方法列表中記錄着方法的名稱,方法實現,以及參數類型,其實selector本質就是方法名稱,通過這個方法名稱就可以在方法列表中找到對應的方法實現.

objc中的類方法和實例方法有什麼本質區別和聯繫?

類方法
    類方法是屬於類對象的
    類方法只能通過類對象調用
    類方法中的self是類對象
    類方法可以調用其他的類方法
    類方法中不能訪問成員變量
    類方法中不定直接調用對象方法
實例方法
    實例方法是屬於實例對象的
    實例方法只能通過實例對象調用
    實例方法中的self是實例對象
    實例方法中可以訪問成員變量
    實例方法中直接調用實例方法
    實例方法中也可以調用類方法(通過類名)

能否向編譯後得到的類中增加實例變量?能否向運行時創建的類中添加實例變量?爲什麼?

因爲編譯後的類已經註冊在 runtime 中,類結構體中的 objc_ivar_list 實例變量的鏈表 和 instance_size 實例變量的內存大小已經確定,同時runtime 會調用 class_setIvarLayout 或 class_setWeakIvarLayout 來處理 strong weak 引用。所以不能向存在的類中添加實例變量,運行時創建的類是可以添加實例變量,調用 class_addIvar 函數。但是得在調用 objc_allocateClassPair 之後,objc_registerClassPair 之前,原因同上。

runloop和線程有什麼關係?

  1. 每一個線程中都一個runloop,只有主線的的runloop默認是開啓的,其他線程的runloop是默認沒有開啓的
  2. 可以通過CFRunLoopRun() 函數來開啓一個事件循環
  3. 看SDWebImage源碼的時候見到有這麼用過.

runloop的mode作用是什麼?

model 主要是用來指定時間在運行循環中的優先級的
蘋果公開提供的 Mode 有兩個:
kCFRunLoopDefaultMode
kCFRunLoopCommonModes

如果我們把一個NSTimer對象以kCFRunLoopDefaultMode添加到主運行循環中的時候,當一直有用戶事件處理的時候,NSTimer將不再被調度,如果我們把一個NSTimer對象以kCFRunLoopCommonModes添加到主運行循環中的時候,當一直有用戶事件處理的時候,NSTimer還能正常的調度,互不影響.

runloop內部是如何實現的?

1.他是一個死循環
2.如果事件隊列中存放在事件,那就取出事件,執行相關代碼
3.如果沒有事件,就掛起,等有事件了,立即喚醒事件循環,開始執行.

不手動指定autoreleasepool的前提下,一個autorealese對象在什麼時刻釋放?(比如在一個vc的viewDidLoad中創建)

在每次事件循環開始創建自動釋放池,在每次事件結束銷燬自動釋放池
以viewDidLoad方法爲例,可以理解爲在viewDidLoad方法開始執行之前創建自動釋放池,
在viewDidLoad方法執行之後銷燬自動釋放吃

蘋果是如何實現autoreleasepool的?

1.我猜想autoreleasepool 本質就是一個隊列(數組),
2.當調用autorelease的時候會把該對象添加到autoreleasepool中,並且把引用計數+1
3.當autoreleasepool即將銷燬的時候,把其中的所有對象進行一次release操作

使用block時什麼情況會發生引用循環,如何解決?

  只要是一個對象對該block進行了強引用,在block內部有直接使用到該對象,用__weak修飾self.

在block內如何修改block外部變量?

通過 __bock修改的外部變量,可以在block內部修改
想裝B的話可以說一下__bock內部做了什麼事

使用系統的某些block api(如UIView的block版本寫動畫時),是否也考慮引用循環問題?

一般不用考慮,因爲官方文檔中沒有告訴我們要注意發生強引用,所以推測系統控件一般沒有對這些block進行強引用,所以我們可以不用考慮循環強引用的問題

GCD的隊列(dispatch_queue_t)分哪兩種類型?

串行隊列和並行隊列

如何用GCD同步若干個異步調用?(如根據若干個url異步加載多張圖片,然後在都下載完成後合成一張整圖)

總體上說:  使用 dispatch group,然後 wait forever 等待完成, 或者採取 group notify 來通知回調。
細節:
1.創建異步隊列
2.創建dispatch_group  dispatch_group_t =  dispatch_group_create()
3.通過組來執行異步下載任務
dispatch_group_async(queueGroup, aQueue, ^{    
      NSLog(@"下載圖片.");    
}); 
4.等到所有任務完成   dispatch_group_wait(queueGroup, DISPATCH_TIME_FOREVER);
5.合成圖片

dispatch_barrier_async的作用是什麼?

barrier:是障礙物的意思,在多個並行任務中間,他就像是一個隔離帶,把前後的並行任務分開.dispatch_barrier_async 作用是在並行隊列中,等待前面操作並行任務完成再執行dispatch_barrier_async中的任務,如果後面還有並行任務,會開始執行後續的並行任務

蘋果爲什麼要廢棄dispatch_get_current_queue?

容易誤用造成死鎖

以下代碼運行結果如何?

  • (void)viewDidLoad
    {
    [super viewDidLoad];
    NSLog(@”1”);
    dispatch_sync(dispatch_get_main_queue(), ^{
    NSLog(@”2”);
    });
    NSLog(@”3”);
    }

    只能輸出1,然後線程主線程死鎖

如何手動觸發一個value的KVO

1.通過setValue:forKey: 給屬性賦值
2.通過setValue:forKeyPath: 給屬性賦值
3.直接調用setter方法方法給屬性賦值
4.直接通過指針給屬性賦值
5.給這個value設置一個值,就可以觸發了

KVC和KVO的keyPath一定是屬性麼?

一個可以是成員變量

IBOutlet連出來的視圖屬性爲什麼可以被設置成weak?

因爲視圖已經對它有一個強引用了

IB中User Defined Runtime Attributes如何使用?

User Defined Runtime Attributes 是一個不被看重但功能非常強大的的特性,它能夠通過KVC的方式配置一些你在interface builder 中不能配置的屬性。當你希望在IB中作儘可能多得事情,這個特性能夠幫助你編寫更加輕量級的viewcontroller

類別的作用?繼承和類別在實現中有何區別?用哪個好? 類別和類擴展的區別(怎麼向類中添加屬性).

ategory 可以在不獲悉,不改變原來代碼的情況下往裏面添加新的方法,只能添加,不能刪除修改。並且如果類別和原來類中的方法產生名稱衝突,則類別將覆蓋原來的方法,因爲類別具有更高的優先級。類別主要有3個作用:(1)將類的實現分散到多個不同文件或多個不同框架中。(2)創建對私有方法的前向引用。(3)向對象添加非正式協議。繼承可以增加,修改或者刪除方法,並且可以增加屬性。類別好,不影響類與原有類的關係.category和extensions的不同在於後者可以添加屬性。

MVC設計模式是什麼?有什麼特性?爲什麼在iPhone上被廣泛運用? 你還熟悉什麼設計模式?

MVC設計模式考慮三種對象:模型對象、視圖對象、和控制器對象。模型對象代表 特別的知識和專業技能,它們負責保有應用程序的數據和定義操作數據的邏輯。視圖對象知道如何顯示應用程序的模型數據,而且可能允許用戶對其進行編輯。控制 器對象是應用程序的視圖對象和模型對象之間的協調者。
設計模式:並不是一種新技術,而是一種編碼經驗,使用比如java中的接口,iphone中的協議,繼承關係等基本手段,用比較成熟的邏輯去處理某一種類型的事情,總結爲所謂設計模式。面向對象編程中,java已經歸納了23種設計模式。
mvc設計模式 :模型,視圖,控制器,可以將整個應用程序在思想上分成三大塊,對應是的數據的存儲或處理,前臺的顯示,業務邏輯的控制。 Iphone本身的設計思想就是遵循mvc設計模式。其不屬於23種設計模式範疇。
代理模式:代理模式給某一個對象提供一個代理對象,並由代理對象控制對源對象的引用.比如一個工廠生產了產品,並不想直接賣給用戶,而是搞了很多代理商,用戶可以直接找代理商買東西,代理商從工廠進貨.常見的如QQ的自動回覆就屬於代理攔截,代理模式在iphone中得到廣泛應用.
 單例模式:說白了就是一個類不通過alloc方式創建對象,而是用一個靜態方法返回這個類的對象。系統只需要擁有一個的全局對象,這樣有利於我們協調系統整體的行爲,比如想獲得[UIApplication sharedApplication];任何地方調用都可以得到 UIApplication的對象,這個對象是全局唯一的。
觀察者模式: 當一個物體發生變化時,會通知所有觀察這個物體的觀察者讓其做出反應。實現起來無非就是把所有觀察者的對象給這個物體,當這個物體的發生改變,就會調用遍歷所有觀察者的對象調用觀察者的方法從而達到通知觀察者的目的。

obj-c的優缺點

objc優點:  1)Cateogies   2) Posing  3) 動態識別?  4) 指標計算   5)彈性訊息傳遞  6) 不是一個過度複雜的 C 衍生語言  7) Objective-C 與 C++ 可混合編程   缺點:   1) 不支持命名空間   2)  不支持運算符重載

代理、通知、block的理解

第一就是代理,這也是很常用的方式,特點是一對一的形式,而且邏輯結構非常清晰。實現起來較爲簡單:寫協議 ,設置代理這個屬性, 最好在你想通知代理做事情的方法中調用即可。當然這裏面有一些細節,包括①協議定義時,請用關鍵字@required,和@optional來明確代理是否必須實現某些方法②代理的類型需用id類型,並寫明要遵守的協議③就是在調用代理方法的時候需要判斷代理是否實現該方法。

第二就是通知,通知的優點很明顯,他是一對多的形式,而且可以在任意對象之間傳遞,不需要二者有聯繫,當然他的實現和代理相比較稍微繞一點,註冊,發通知,收通知。這裏面的注意點就是 ①對於系統沒有定義的事件監聽時需要自己發通知,這是你就需要定義一個key,字符串類型,這也是通知的一個弊端,你需要拷貝到收通知的對象,避免寫錯一個字母而無法收通知的尷尬 ②就是註冊的通知中心需要手動移除,不然除了性能的問題還會有其他的問題出現,比如說一個控制器消失了之後還有因爲某些事件而發出通知,造成不想要的結果。

第三就是block了,這是蘋果後來才加入的,也是目前開發比較常用的一種方式,功能比較強大,但是在理解和使用上可能需要一段時間摸索和熟悉。他的最大特點就是回調,而且回調時可以傳入參數,最重要的是,無論在哪調用,block的執行都會回到block創建的地方執行,而非調用的地方。而block本身可以封裝一段代碼,一段代碼你懂的,很多人在初學時會被搞暈,甚至在block的聲明上就糾結,其實很正常,多用就好。

對於語句NSString*obj = [[NSData alloc] init]; obj在編譯時和運行時分別時什麼類型的對象?

編譯時是NSString的類型;運行時是NSData類型的對象

鍵路徑(keyPath)、鍵值編碼(KVC)和鍵值觀察(KVO)

鍵路徑
在一個給定的實體中,同一個屬性的所有值具有相同的數據類型。鍵-值編碼技術用於進行這樣的查找—它是一種間接訪問對象屬性的機制。 - 鍵路徑是一個由用點作分隔符的鍵組成的字符串,用於指定一個連接在一起的對象性質序列。第一個鍵的性質是由先前的性質決定的,接下來每個鍵的值也是相對於其前面的性質。鍵路徑使您可以以獨立於模型實現的方式指定相關對象的性質。通過鍵路徑,您可以指定對象圖中的一個任意深度的路徑,使其指向相關對象的特定屬性。

鍵值編碼KVC
鍵值編碼是一種間接訪問對象的屬性使用字符串來標識屬性,而不是通過調用存取方法,直接或通過實例變量訪問的機制,非對象類型的變量將被自動封裝或者解封成對象,很多情況下會簡化程序代碼;KVC的缺點:一旦使用 KVC 你的編譯器無法檢查出錯誤,即不會對設置的鍵、鍵路徑進行錯誤檢查,且執行效率要低於合成存取器方法和自定的 setter 和 getter 方法。因爲使用 KVC 鍵值編碼,它必須先解析字符串,然後在設置或者訪問對象的實例變量。

鍵值觀察KVO
鍵值觀察機制是一種能使得對象獲取到其他對象屬性變化的通知 ,極大的簡化了代碼。實現 KVO 鍵值觀察模式,被觀察的對象必須使用 KVC 鍵值編碼來修 改它的實例變量,這樣才能被觀察者觀察到。因此,KVC是KVO的基礎。

多線程編程

NSThread:當需要進行一些耗時操作時會把耗時的操作放到線程中。線程同步:多個線程同時訪問一個數據會出問題,NSlock、線程同步塊、@synchronized(self){}。

NSOperationQueue操作隊列(不需考慮線程同步問題)。編程的重點都放在main裏面,NSInvocationOperation、BSBlockOperation、自定義Operation。創建一個操作綁定相應的方法,當把操作添加到操作隊列中時,操作綁定的方法就會自動執行了,當把操作添加到操作隊列中時,默認會調用main方法。Apple提供了NSOperation這個類,提供了一個優秀的多線程編程方法;一個NSOperationQueue操作隊列,相當於一個線程管理器,而非一個線程,因爲你可以設置這個線程管理器內可以並行運行的線程數量等。

GCD(Grand Central Dispatch)宏大的中央調度,串行隊列、併發隊列、主線程隊列;同步和異步:同步指第一個任務不執行完,不會開始第二個,異步是不管第一個有沒有執行完,都開始第二個。串行和並行:串行是多個任務按一定順序執行,並行是多個任務同時執行;

代碼是在分線程執行,在主線程嘟列中刷新UI。
多線程編程是防止主線程堵塞、增加運行效率的最佳方法。
多線程是一個比較輕量級的方法來實現單個應用程序內多個代碼執行路徑。

TCP和UDP的區別於聯繫

TCP爲傳輸控制層協議,爲面向連接、可靠的、點到點的通信;

UDP爲用戶數據報協議,非連接的不可靠的點到多點的通信;

TCP側重可靠傳輸,UDP側重快速傳輸。

TCP連接的三次握手

第一次握手:客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;

第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包,即SYN+ACK包,此時服務器進入SYN+RECV狀態;

第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次狀態。

Scoket連接和HTTP連接的區別

HTTP協議是基於TCP連接的,是應用層協議,主要解決如何包裝數據。Socket是對TCP/IP協議的封裝,Socket本身並不是協議,而是一個調用接口(API),通過Socket,我們才能使用TCP/IP協議。

HTTP連接:短連接,客戶端向服務器發送一次請求,服務器響應後連接斷開,節省資源。服務器不能主動給客戶端響應(除非採用HTTP長連接技術),iPhone主要使用類NSURLConnection。

Socket連接:長連接,客戶端跟服務器端直接使用Socket進行連接,沒有規定連接後斷開,因此客戶端和服務器段保持連接通道,雙方可以主動發送數據,一般多用於遊戲.Socket默認連接超時時間是30秒,默認大小是8K(理解爲一個數據包大小)。

HTTP協議的特點,關於HTTP請求GET和POST的區別

GET和POST的區別:

HTTP超文本傳輸協議,是短連接,是客戶端主動發送請求,服務器做出響應,服務器響應之後,鏈接斷開。HTTP是一個屬於應用層面向對象的協議,HTTP有兩類報文:請求報文和響應報文。

HTTP請求報文:一個HTTP請求報文由請求行、請求頭部、空行和請求數據4部分組成。

HTTP響應報文:由三部分組成:狀態行、消息報頭、響應正文。

GET請求:參數在地址後拼接,沒有請求數據,不安全(因爲所有參數都拼接在地址後面),不適合傳輸大量數據(長度有限制,爲1024個字節)。

GET提交、請求的數據會附在URL之後,即把數據放置在HTTP協議頭中。

以?分割URL和傳輸數據,多個參數用&連接。如果數據是英文字母或數字,原樣發送,

如果是空格,轉換爲+,如果是中文/其他字符,則直接把字符串用BASE64加密。

POST請求:參數在請求數據區放着,相對GET請求更安全,並且數據大小沒有限制。把提交的數據放置在HTTP包的包體中.

GET提交的數據會在地址欄顯示出來,而POST提交,地址欄不會改變。

傳輸數據的大小:

GET提交時,傳輸數據就會受到URL長度限制,POST由於不是通過URL傳值,理論上書不受限。

安全性:

POST的安全性要比GET的安全性高;

通過GET提交數據,用戶名和密碼將明文出現在URL上,比如登陸界面有可能被瀏覽器緩存。

HTTPS:安全超文本傳輸協議(Secure Hypertext Transfer Protocol),它是一個安全通信通道,基於HTTP開發,用於客戶計算機和服務器之間交換信息,使用安全套結字層(SSI)進行信息交換,即HTTP的安全版。

XML數據解析方式各有什麼不同?

XML數據解析的兩種解析方式:DOM解析和SAX解析;

DOM解析必須完成DOM樹的構造,在處理規模較大的XML文檔時就很耗內存,佔用資源較多,讀入整個XML文檔並構建一個駐留內存的樹結構(節點樹),通過遍歷樹結構可以檢索任意XML節點,讀取它的屬性和值,通常情況下,可以藉助XPath查詢XML節點;

SAX與DOM不同,它是事件驅動模型,解析XML文檔時每遇到一個開始或者結束標籤、屬性或者一條指令時,程序就產生一個事件進行相應的處理,一邊讀取XML文檔一邊處理,不必等整個文檔加載完才採取措施,當在讀取解析過程中遇到需要處理的對象,會發出通知進行處理。因此,SAX相對於DOM來說更適合操作大的XML文檔。

JSON解析:性能比較好的主要是第三方的JSONKIT和iOS自帶的JSON解析類,其中自帶的JSON解析性能最高。

如何進行真機調試?

xcode7可免費直接測試

xcode7之前{
1.首先需要用鑰匙串創建一個鑰匙(key);
2.將鑰匙串上傳到官網,獲取iOS Development證書;
3.創建App ID即我們應用程序中的Boundle ID;
4.添加Device ID即UDID;
5.通過勾選前面所創建的證書:App ID、Device ID;
6.生成mobileprovision文件;
7.先決條件:申請開發者賬號 99美刀
}

APP發佈的上架流程

1.登錄應用發佈網站添加應用信息;

2.下載安裝發佈證書;

3.選擇發佈證書,使用Archive編譯發佈包,用Xcode將代碼(發佈包)上傳到服務器;

4.等待審覈通過;

5.生成IPA:菜單欄->Product->Archive.

對沙盒的理解

每個iOS應用都被限制在“沙盒”中,沙盒相當於一個加了僅主人可見權限的文件夾,及時在應用程序安裝過程中,系統爲每個單獨的應用程序生成它的主目錄和一些關鍵的子目錄。蘋果對沙盒有幾條限制:

1.應用程序在自己的沙盒中運作,但是不能訪問任何其他應用程序的沙盒;

2.應用之間不能共享數據,沙盒裏的文件不能被複制到其他應用程序的文件夾中,也不能把其他應用文件夾複製到沙盒中;

3.蘋果禁止任何讀寫沙盒以外的文件,禁止應用程序將內容寫到沙盒以外的文件夾中;

4.沙盒目錄裏有三個文件夾:Documents——存儲;應用程序的數據文件,存儲用戶數據或其他定期備份的信息;Library下有兩個文件夾,Caches存儲應用程序再次啓動所需的信息,

Preferences包含應用程序的偏好設置文件,不可在這更改偏好設置;temp存放臨時文件即應用程序再次啓動不需要的文件。

獲取沙盒根目錄的方法,有幾種方法:用NSHomeDirectory獲取。獲取Document路徑:NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES).

ViewController 的 loadView、viewDidLoad、viewDidUnload 分別是在什麼時候調用的?

viewDidLoad在view從nib文件初始化時調用,loadView在controller的view爲nil時調用。此方法在編程實現view時調用,view控制器默認會註冊memory warning notification,當view controller的任何view沒有用的時候,viewDidUnload會被調用,在這裏實現將retain的view release,如果是retain的IBOutlet view 屬性則不要在這裏release,IBOutlet會負責release 。

iOS 核心框架

CoreAnimation
CoreGraphics
CoreLocation
AVFoundation
Foundation

iOS核心機制

UITableView 重用
ObjC內存管理;自動釋放池,ARC如何實現
runloop
runtime
Block的定義、特性、內存區域、如何實現
Responder Chain
NSOperation
GCD

數據結構

8大排序算法
二叉樹實現
二分查找實現

面向對象編程

封裝、繼承、多態

設計模式6個原則

設計一個類的功能,如何劃分粒度(單一職責)

接口隔離。

如果有一個鳥類,有飛的動作,一個鴕鳥繼承它是合適的嗎(里氏替換)

類之間的依賴如何依賴偶合度最小(依賴倒轉)
高層依賴低層,低層不能依賴高層。依賴接口,不能依賴具體的類。

如果A要調用C函數,但C是B的成員類,應該如何設計?(迪米特)

如何設計類,能做到只增加代碼,而不修改代碼,有哪些經驗(開放封閉)
通過設計模式解決。

計算機技術

計算機網絡: TCP/IP、HTTPCDN、SPDY
計算機安全: RSA、AES、DES
操作系統:線程、進程、堆棧、死鎖、調度算法

iOS新特性、新技術

iOS7 UIDynamic、SpritKit、新佈局、扁平化
iOS8 應用程序擴展、HealthKit、SceneKit、CoreLocation、TouchID、PhotoKit
iOS9
Apple Watch
第三方庫:SDWebImage、AFNetwork、JSONKit、wax
swift
發佈了5 篇原創文章 · 獲贊 2 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章