iOS常見面試題總結

weixin_33797791發表於2016-06-05

1.objective-c常見面試題:
1、**OC **語言的基本特點
OC 語言是 C 語言的一個超集,只是在 C 的基礎之上加上了物件導向(oop) 的特性;
OC 與 Java 語言相同都是單繼承,這一點與 C++語言不同(多重繼承);OC 不支援名稱空間機制,取而代之的是在類名之前新增字首,以此來區分。

2、以下命名正確的是
(1)類(Person、person、ObjectAndKeys、personAndOther) (2)物件 (objectAndKeys、Person、_person、$dog) (3)例項變數 (_dog、^age、name、Name、)

3、資料型別和表示式
(1) inta=5,b=2,c=2,result,result=ab++-c;result的值和b的值。
答:result 的值為 8,b 的值為3。根據運算子的優先順序(乘法比加法的優先 級高),首先計算 a
b,因為 b++,“++”在後面。因此,先計算 ab,其結果為 10,計算完成後 b 的結果++,因此b 的結果為3。最後與c 相減,result 的結果 為8。
(
2)result= (b > a)? a++ : ((++c> a-b)? ++c : b++),求result,a,b,c 的值,假設 abc的值分別為123。(右結合性;運算子號優 先級->結合性->順序)
答:運算子號相同,因此判斷運算子號的結合性。即表示式為:result = (b > a)? a++ :(++c > a-b)? ++c : b++),然後我們判斷表達是(b > a)是否為真。 因此,result 的結果為1,a、b、c 的值分別為 2、2、3。
(
3)inta = 5, b = 12, c = 3, result = 0, d = 5, e = 2,result= a -= b /= c += d %= e;求result,abcde*。
答:運算子號相同,因此,判斷該運算子號的結合性。賦值運算子號為右結合, 因此,表示式從右開始計算。d %= 2,分解為d = d % e,d 值為 1;計算c += d, 同理,c值為4。再計算b /= c,b值為3;再計算a -= b,a值為2。最後將a 值賦值給 result。因此,result 的結果為2,a、b、c、d、e 的結果分別是 2、3、 4、1、2。(複合賦值運算子效率更高)

(4)如果第三題中 d-5,求result。答:%(模運算子號)的符號取決與第一個數,因此,result 的值為-1,a、b、
c、d、e 的值分別為-1、6、2、-1、2。(5)假設 abc 的值分別是456。那麼result = a < b < c,求result 是多少?
答:result 值為 1。(
6
)解釋id型別
答:任意型別物件。程式執行時決定才物件的型別。 (7)解釋nil,傳送訊息時,程式是否會出現異常。
答:不會,在OC 語言中可以 nil 傳送訊息,而程式不會丟擲異常,其結果是什麼也不做。

4、流程控制語句
(1)**switch 語句每一case 都需要新增 break 語句嗎?答:switch 語句中的 break 語句不是必須的,此外,default 語句也不是必須
新增的。如果在某一個條件中新增(case 語句之後)break 語句,即當條件滿足 時,跳出 switch 語句。(
2
)
do while 語句和 while 語句的區別,並寫出幾個死迴圈。
答:do while 語句至少執行一次迴圈體,而while 語句括號中的表示式為真, 才執行迴圈體。
while(1){ }、for(;)(
3
)
switch **語句 **if **語句區別與聯絡以及它的優勢在哪裡

答:均表示條件的判斷,switch 語句表示式只能處理是整型、字元型和列舉類 型,而選擇流程語句則沒有這樣的限制。但 switch 語句比選擇流程控制語句效 率更高。(4)int number = 26,k = 1,求 k 的值
do {k = number % 10;
number /= 10;} while(
number
);
答:do while 語句的特點是,迴圈體至少執行一次。程式執行到表示式 k
=number%10,已知number 為26,又已知算術運算子比賦值運算子好優先順序別高,因此先計算 number%10,其結果為 6;已知 k 為1,因此,k 的結果為6。number/=10,number 的值2。while 語句判斷表示式是否為真,此時,number 為 2。繼續執行迴圈體,此時number、k 的值分別為 2、6,2%10 的結果仍為 2,再與 k 相乘,其 k 的結果為12。程式執行到迴圈體第二行 number/10,此時 number 已為 10,因此,number 的結果為 0。while 表示式內條件為假,迴圈就此結束。因此,k 的值為 12。

5、寫出以下方法型別、方法名稱和返回值型別
(1)-(void)initWithName:(NSString)name andAge:(int) age;(2)+(Person)personName:(NSString)name; (3)-(void)setName:(NSString )name setAge:(int)agesetDelegate:(id)delegate;
(4)-(NSString
)name;(5)+ (Kingdom *)shareKingdom; (6)+(Kingdom *)defaultKingdom;

6、建立一個這樣的 Person類,用類目的形式給**Person **新增一組方法(方法任意)、並且若干私有方法以及在 Person類中新增一個協議(手寫程式碼)
.h檔案#import @”Person.h”
@protocol PersonDelegate @required- (void)thisRequiredMethod;@optional

  • (void)thisOptionalMethod; @end
    @interface Person : NSObject { @private
    NSString *_name;
    NSInteger _age; }
  • (void)test;
  • (void)test1:(int)arg1;
  • (void)test1:(int)arg1 test2:(int)arg2; @end@interface Person (Create)- (id)initWithName:(NSString *)aName;- (id)initWithName:(NSString *)aName age:(int)age; + (id)personBorn; @end

.m檔案
@interface Person () - (void)private1;- (void)private2; @end @implementation

  • (void)test {}- (void)test1:(int)arg1 {}- (void)test1:(int)arg1 test2:(int)arg2 {} - (void)private1 {}- (void)private2 {}
  • (id)initWithName:(NSString *)aName { self = [superinit];
    if (self) {}return self;
    }- (id)initWithName:(NSString *)aName age:(int)age {
    ...... }
  • (id)personBorn {Person *person = [[Person alloc] init]; return [person autorelease];
    } @end

7、協議的基本概念和協議中方法預設為什麼型別
答:OC 中的協議是一個方法列表,且多少有點相關。它的特點是可以被任何 類使用(實現),但它並不是類(這裡我們需要注意),自身不會實現這樣方法,
而是又其他人來實現。協議經常用來實現委託物件(委託設計模式)。如果一個類採用了一個協議,那麼它必須實現協議中必須需要實現的方法,在 協議中的方法預設是必須實現(@required),新增關鍵字@optional,表明一旦
採用該協議,這些“可選”的方法是可以選擇不實現的。

8、**#include #import 的區別、#import @class **的區別
答:#include 和#import 其效果相同,都是查詢類中定義的行為(方法)。只 是後者不會引起交叉編譯,確保標頭檔案只會被匯入一次。@class 的表明,只定義了類的名稱,而具體類的行為是不知道的,一般用於.h 檔案,因此,@class 比#import 編譯效率更高。此外@class 和#import 的主要區別在於解決引用死鎖 的問題。

9@public@protected@private它們的含義與作用
( 1) @public:答:物件的例項變數的作用域在任意地方都可以被訪問
( 2) @protected:答:物件的例項變數作用域在本類和子類都可以被訪問
( 3) @private:答:例項變數的作用域只能在本類(自身)中訪問
(4)通過指標運算子(->)能夠訪問到private方法嗎?**OC **語言中還提供 了哪些方式能直接和間接的訪問物件的例項變數?
答:不可以,可以通過合成存取器訪問例項變數,也可自己定義 setter 和getter 方法訪問例項變數,KVC(key value coding)——鍵值編碼,間接的方式訪問實 例變數。

10、簡述類目優點和缺點,如果覆蓋本類或者父類的方法,會出現什麼問題?
答:(1)優點:不需要通過增加子類而增加現有類的行為(方法),且類目中的方法與原始類方法基本沒有區別;通過類目可以將龐大一個類的方法進行劃分,從而便於程式碼的日後的維護、更新以及提高程式碼的閱讀性。
(2)缺點:無法向類目新增例項變數,如果需要新增例項變數,只能通過 定義子類的方式;類目中的方法與原始類以及父類方法相比具有更高階別的優先 級,如果覆蓋父類的方法,可能導致 super 訊息的斷裂。因此,最好不要覆蓋原 始類中的方法。

11、簡述記憶體管理基本原則
答:(1)如果使用alloc、copy(mutableCopy)或者 retian 一個物件時,你就 有義務,向它傳送一條 release 或者autorelease 訊息。其他方法建立的物件,不 需要由你來管理記憶體。
(2)向一個物件傳送一條 autorelease 訊息,這個物件並不會立即銷燬,而是將這個物件放入了自動釋放池,待池子釋放時,它會向池中每一個物件傳送 一條 release 訊息,以此來釋放物件。
(3)向一個物件傳送 release 訊息,並不意味著這個物件被銷燬了,而是 當這個物件的引用計數為 0 時,系統才會呼叫 dealloc 方法,釋放該物件和物件 本身它所擁有的例項。

12、在 objective c中是否支援垃圾回收機制? 答:OC是支援垃圾回收機制的(Garbagecollection簡稱GC),但是apple的
移動終端中,是不支援 GC 的,Mac 桌面系統開發中是支援的。 13、什麼是**ARC 技術?與GC **是否相同?
答:ARC 是 AutomaticReference Counting 的簡稱,我們稱之為自動引用計數,
是在IOS 5之後推出的新技術,它與GC的機制是不同的。我們在編寫程式碼時, 不需要向物件傳送 release 或者 autorelease 方法,也不可以呼叫 delloc 方法, 編譯器會在合適的位置自動給使用者生成release 訊息(autorelease),ARC 的特點是自動引用技術簡化了記憶體管理的難度。

14、什麼是retain count答:每一個物件都預設有一個 retainCount 的屬性,數值的多少表示現在有幾
個例項正在引用它。當它為 0 時,系統會自動呼叫 dealloc 方法,將記憶體回收。15、寫出*@property (nonatomic ,retain) Person person;
**@synthesize person **具體實現,並指出其中含義。
非原子性事物

  • (void)setPerson:(Person *)person {if (_person!= person){ [_person release]; _person = [person retain]; } }
  • (Person )person { return _person; } 原子性事物- (void)setPerson:(Person)person {@synchronized(self) { if (_person!= person){
    [_person release]; _person = [person retain]; }
    } }
  • (Person *)person {
    @synchronized(self) {
    return _person; }
    }

16、深、淺複製的基本概念以及他們的區別,可以用圖 來加以說明。

17、堆和棧的區別
答:(1)棧區(stack)由編譯器自動分配釋放 ,存放方法(函式)的引數值,區域性變數的值等。先進後出。
(2)堆區(heap)一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時由OS回收。
(3)全域性區(靜態區)(static),全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。程式結束後有系統釋放。
(4)文字常量區—常量字串就是放在這裡的。程式結束後由系統釋放。 (5)程式程式碼區—存放函式體的二進位制程式碼。

18、使用者自定義了一個物件,如何實現拷貝(可變和不可變拷貝)
答:必須實現 copying 和mutableCopying 協議,表示返回一個不可變和可變的物件。否則,程式將會出現異常。-(id)copyWithZone:(NSZone *)zone{
Person *person = [[self Class] allocWithZone:zone];person ->age = self.age;person ->name = self.name;return person;
}- (id)mutableCopyWithZone(NSZone *)zone;

19、以下程式碼有問題嗎?如果有,會出現什麼問題

  • (void) setName:(NSString *)name {
    self.name = name; }
    答:引起重複呼叫(自己呼叫自己)。

20、定義屬性時,什麼時候用 assignretain、**copy **以及它們的之間的區別
答:(1)assign:普通賦值,一般常用於基本資料型別,常見委託設計模式,以此來防止迴圈引用。(我們稱之為弱引用,weak)
(2)retain:保留計數,獲得到了物件的所有權。引用計數在原有基礎上 加1。
(3)copy:一般認為,是在記憶體中重新開闢了一個新的記憶體空間,用來

儲存新的物件,和原來的物件是兩個不同的地址,引用計數分別 1。但是當 copy 物件為不可變物件時,那麼 copy 的作用相當於 retain。因為,這樣可以節約內 存空間。

21、解釋以下關鍵字,staticselfsuper用例項說明
答static: 靜態全域性變數,永續性作用、儲存區域在靜態區域,它的生命週期 和應用進行繫結。程式結束時,由系統自動回收。
self:當前訊息的接收者。 super:向父類傳送訊息。

22、解釋 self = [super init]方法
答:容錯處理,當父類初始化失敗,會返回一個 nil,表示初始化失敗。由於繼承的關係,子類是需要擁有父類的例項和行為的,因此,我們必須先初始化父 類,然後再初始化子類。

23、當我們釋放物件時,為什麼需要呼叫[super dealloc]方法?
答:(1)因為,子類是繼承自父類,那麼子類中有一些例項變數(物件),是繼承子父類的,因此,我們需要呼叫父類方法,將父類所擁有的例項進行釋放。
(2)先將子類所擁有的例項進行釋放,然後再釋放父類的。 24objective-c有私方法麼?私有變數呢?
答:是有的,我們稱之為延展。私有變數也是有的(@private)。25、以下每行程式碼執行後,person物件的retain count
別是多少?Person *person =[[Person alloc] init]; // 1

[person retain]; [person release]; [personrelease];
// 2 // 1
// 0

26、在某個方法中 self.name = _namename = _name他 們有區別嗎,為什麼?
答:是有區別的,前者是存在記憶體管理的,它會對_name 物件進行保留或者拷 貝操作,而後者是普通賦值。

27、假設我們寫了一個類的合成存取器,@property(nonatomic, copy) NSString name;@synthesizename;*
(1)NSStringaName = [NSString stringWithFormat:@”a”];person.name = aName 此時 name 的引用計數是幾,為什麼,這麼做
有什麼好處?答:它的引用技術是 2,相當於 retain 操作。
(
2
)
NSMutableStri
ngaName = [NSMutableString stringWithFormat:@”a”];同上
答:它的引用技術是 1,真正意義上的拷貝。(3)返回這一個字串的型別,是可變的嗎?如果不是,為什麼,我們 又如何做?
答:不可變,因為合成存取器中用的 copy。如果,我們需要返回一個可變 的字串時,那麼必須自己實現 setter 和getter 方法。

28、自動釋放池是什麼,如何工作
答:自動釋放池是 NSAutorelease 類的一個例項,當向一個物件傳送 autorelease 訊息時,該物件會自動入池,待池銷燬時,將會向池中所有物件傳送一條 release 訊息,釋放物件。[pool release]; [pool drain]表示的是池本身

不會銷燬,而是池子中的臨時物件都被髮送release,從而將物件銷燬。 29、為什麼delegate(代理)屬性都是assign 而不是retain
的? 答:防止迴圈引用,以至物件無法得到正確的釋放。

30、**iOS **開發中資料永續性,有哪幾種。 答:檔案寫入、物件歸檔、sqlite3資料庫、coredata

31、物件歸檔的基本概念,以及它的特點是什麼?
答:歸檔為物件的資料持久化提供了一種解決方法,它特點是給歸檔的物件進行加密,增強了資料的安全性。此外,自定義類的物件歸檔必須實現 NSCoding 協議。

32、什麼是謂詞?答:cocoa 中提供了一個 NSPredicate 的類,該類主要用於指定過濾器的條件,
每一個物件通過謂詞進行篩選,判斷條件是否匹配。33、什麼是 KVC KVO?以及它們之間的關係是什麼
答:(1)KVC(鍵值編碼)是一種間接訪問物件例項變數的機制,該機制可以 不通過存取方法就可以訪問物件的例項變數。非物件型別的變數將被自動封裝或 者解封成物件。此外,使用KVC 能夠簡化程式碼。我們需要注意 KVC 有兩個較為 明顯的缺點,一旦使用 KVC 你的編譯器無法檢查出錯誤,即不會對設定的鍵、 鍵路徑進行錯誤檢查,且執行效率要低於(雖然效率已經很高,你已經感覺不到)合成存取器方法和自定的 setter 和 getter 方法。因為使用 KVC 鍵值編碼,它必 須先解析字串,然後在設定或者訪問物件的例項變數。
(2)KVO(鍵值觀察)是一種能使得物件獲取到其他物件屬性變化的通知

機制。(3)實現 KVO 鍵值觀察模式,被觀察的物件必須使用KVC 鍵值編碼來修
改它的例項變數,這樣才能被觀察者觀察到。因此,KVC 是KVO 的基礎或者說 KVO 的實現是建立在 KVC 的基礎之上的。

34、在 objective c中如何實現KVO
答:(1)註冊觀察者(這裡我們需要注意,觀察者和被觀察者不會被保留也不 會被釋放)

  • (void)addObserver:(NSObject *)observerforKeyPath:(NSString *)keyPath
    options:(NSKeyValueObservingOptions)options
    context:(void )context;
    (2)接收變更通知- (void)observeValueForKeyPath:(NSString
    )keyPath
    ofObject:(id)object change:(NSDictionary *)changecontext:(void *)context;
    (3)移除物件的觀察者身份-(void)removeObserver:(NSObject *)observer
    forKeyPath:(NSString *)keyPath;

35、當我們釋放我們的物件時,為什麼需要呼叫[super dealloc]方法,它的位置又是如何的呢?
答:因為子類的某些例項是繼承自父類的,因此需要呼叫[super dealloc]方法, 來釋放父類擁有的例項,其實也就是子類本身的。一般來說我們優先釋放子類擁 有的例項,最後釋放父類所擁有的例項。

36、以下程式碼會出項問題嗎?如果有,我們又該如何修 改?
@property (nonatomic, copy) NSMutableString *name;@synthesize name = _name;
self.name = [NSMutableStringstringWithFormat:@"..xyz"]; [self.name insertString:@"abc"atIndex:0];
答:不可變字串不可以被修改,可以通過自定義 set 方法,將字串的拷貝 改為可變的拷貝。

37、當我們將一個物件加入自動釋放池時,該物件何時 被銷燬
答:我們在 application kit 應用程式中,自動釋放池中的臨時物件被銷燬的時間時,一個事件迴圈結束後。注意自動釋放池沒有被釋放,而是被排空了,向池傳送了 drain 訊息。

38、當我們呼叫一個靜態方法時,需要對物件進行release嗎?
答:不需要,靜態方法(類方法)建立一個物件時,物件已被放入自動釋放池。在池被釋放時,很有可能被銷燬

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

40、以下程式碼存在記憶體洩露嗎?如果有,如何去修改
self.object = [NSObject alloc] init]; self.object =[NSObject object] retain]; self.object = [NSObject object];

  • (void)dealloc {
    self.object = nil;
    [super dealloc]; }

41、迴圈引用是什麼,如何解決這樣的問題
答:物件 a 建立並引用到了物件 b;物件 b 建立並引用到了物件 c;物件 c 建立並引用到了物件 b。這時候 b 和 c 的引用計數分別是 2 和1。
當a 不再使用b,呼叫 release 釋放對b 的所有權,因為 c 還引用了b,所以 b 的引用計數為 1,b 不會被釋放。
b 不釋放,c 的引用計數就是 1,c 也不會被釋放。從此,b 和c 永遠留在記憶體 中。
這種情況,必須打斷迴圈引用,通過其他規則來維護引用關係。我們常見的 delegate 往往是 assign 方式的屬性而不是 retain 方式的屬性, 賦值不會增加引用計數,就是為了防止 delegation 兩端產生不必要的迴圈引用。

42isMemberOfClassisKindOfClass聯絡與區別
答:兩者都能檢測一個物件是否是某個類的成員, 兩者之間的區別是:
isKindOfClass 不但可以用來確定一個物件是否是一個類的成員,也可以用來確 定一個物件是否是派生自該類的類的成員 ,而 isMemberOfClass 做不到後一點。
如 ClassA 派 生 自 NSObject 類 , ClassA*a = [ClassA alloc] init]; [a isKindOfClass:[NSObject class]] 可以檢查出 a是否是 NSObject派生類 的成員,但 isMemberOfClass 做不到。

2.面試題
1.簡述OC中記憶體管理機制
1.1 OC的記憶體管理機制是自動引用計數,記憶體管理的原則是誰開闢誰釋放,有retain的地方就要有release
1.2 記憶體管理分為ARC和MRC,在MRC下我們需要手動管理記憶體,需要使用到retain/copy/release/autorelease等方法實現記憶體管理。ARC下則一般不需要我們手動管理,系統會在適當的位置加上記憶體管理關鍵字。
1.3 retain是引用計數+1,在記憶體管理中,要記得記憶體管理原則:誰開闢誰釋放,有retain就要有release. release是引用計數-1.alloc匹配的是dealloc,alloc是開闢記憶體空間,dealloc是銷燬所開闢的記憶體,有開闢就要有 銷燬.

2.readwrite,readonly,assign,retain,copy,nonatomic、atomic、strong、weak屬性的作用?
readWrite讀寫特性,可讀可寫.
readonly只讀,只有getter,沒有setter.
assign一般用於基本資料型別和ID型別.
copy拷貝,一般用於 NSString.分為深拷貝和淺拷貝,深拷貝拷貝的是物件,淺拷貝拷貝的是指標.nonatomic非原子性,不考慮執行緒安全,優點是效率高.
atomic原子性,有點是執行緒安全,缺點是效率低.
strong強引用,和MRC下的retain一樣.weak弱引用,類似MRC下的assign.但是要注意的是strong和weak都是修飾物件型別的屬性的,不能修飾基本資料型別.ARC下仍然使用assign修飾基本資料型別.

3.關於iOS多執行緒問題
仔細閱讀:http://www.cocoachina.com/ios/20150731/12819.html

4.提升UITableView效能的幾點建議
仔細閱讀:http://www.cocoachina.com/ios/20150729/12795.html

  1. 執行緒同步和非同步的區別?
    同步:一個執行緒要等待上一個執行緒執行完之後才能執行當前的執行緒,生活中的例子(上廁所)。
    非同步:同時去做兩件或者多件事。比如邊聽歌邊看報。

7.堆和棧的區別?
棧區(stack)--由編譯器自動分配釋放,存放函式的引數值、區域性變數的值。先進後出
堆區(heap)--一般由程式設計師分配釋放。先進先出
全域性區(靜態區)(static)--全域性變數和靜態變數。程式結束後由系統釋放。
文字常量區--常量字串存放在這裡。程式結束後由系統釋放。
程式程式碼區—存放函式體的二進位制檔案。

  1. iOS類是否可以多繼承?
    不可以,可以通過delegate和protocol和類別來實現類似多繼承。

9.iOS本地資料儲存都有哪幾種方式?iOS如何實現複雜物件的儲存?

  1. Write寫入方式:永久儲存在磁碟中。但是隻支援NSString、NSData、NSArray、NSDictionary。 2.NSKeyedArchiver(歸檔)採用歸檔的形式來儲存資料,該資料物件需要遵守NSCod-ing協議,並且該物件對應的類必須提供 encodeWithCoder:和initWithCoder:方法。
    3.SQLite(FMDB)注意FMDB不是資料庫,而是一個SQLITE管理框架.
    4.CoreData切記coredata不是資料庫,他的儲存核心思想是託管物件,只是我們們經常用的儲存檔案為SQLite.還可以用XML,二進位制等方式.

10.iOS的動態性
1.動態型別。如id型別。實際上靜態型別因為其固定性和可預知性而使用得更加廣泛。靜態型別是強型別,而動態型別屬於弱型別。執行時決定接收者。

  1. 動態繫結。讓程式碼在執行時判斷需要呼叫什麼方法,而不是在編譯時。與其他面嚮物件語言一樣,方法呼叫和程式碼並沒有在編譯時連線在一起,而是在訊息傳送時才進行連線。執行時決定呼叫哪個方法。
  2. 動態載入。讓程式在執行時新增程式碼模組以及其他資源。使用者可以根據需要載入一些可執行程式碼和資源,而不是在啟動時就載入所有元件。可執行程式碼中可以含有和程式執行時整合的新類。

11.深拷貝和淺拷貝的理解?
深拷貝拷貝的是內容,淺拷貝拷貝的是指標。深拷貝和淺拷貝最大的區別就是子類物件的地址是否改變,如果子類物件的地址改變那麼就是深拷貝。

12.什麼是安全釋放
在物件dealloc中release之後再把指標置為nil

13.怎樣實現一個singleton。
+(ZMYSingleton)sharedInstance{
staticLOSingleton
sharedInstance=nil;
staticdispatch_once_tonceToken; //鎖
dispatch_once(&onceToken,^{
//最多呼叫一次
sharedInstance=[[ZMYSingletonalloc]init];
});
return sharedInstance;
}

13.RunLoop是什麼?
一個RunLoop就是一個事件處理的迴圈,用來不停的調 度工作以及處理輸入時間。使用runloop的目的是讓你的執行緒在有工作的時候忙於工作,而沒工作的時候處於休眠狀態。runloop的設計是為了減少 cpu無謂的空轉。每個開闢的執行緒都有一個Runloop,主執行緒的Runloop時預設開啟的,我們們手動開闢的子執行緒Runloop是預設不開啟 的,如果需要開啟,需要呼叫API[[NSRunloopcurrentRunloop]run]開啟.最常見的需要開啟Runloop的是在 子執行緒裡面呼叫計時器(NSTimer),如果不開啟runloop迴圈方法就不能正常執行.

14.寫一個標準巨集MIN,這個巨集輸入兩個引數並返回較小的一個?

definekMIN(X,Y)((X)>(Y))?(Y):(X)

15.簡述應用程式按Home鍵進入後臺時的生命週期,以及從後臺回到前臺時的生命週期?
進入後臺生命週期走:
-(void)applicationWillResignActive:(UIApplication)application;
-(void)applicationDidEnterBackground:(UIApplication
)application;
回到前臺生命週期走:
-(void)applicationWillEnterForeground:(UIApplication)application;
-(void)applicationDidBecomActive:(UIApplication
)application;

16.ViewController的loadView,viewDidLoad,viewWillAppear,viewDidUnload,dealloc、init分別是在什麼時候調 用的?在自定義ViewController的時候這幾個函式裡面應該做什麼工作?
loadView:沒有正在使用nib檢視頁面,子類將會建立自己的自定義檢視層
viewDidLoad:試圖被載入後呼叫
viewWillAppear:試圖即將出現的時候呼叫
viewDidUnload:當系統記憶體吃緊的時候會呼叫該方法,釋放掉當前未在window中顯示的試圖和對應的控制器

17.描述應用程式的啟動順序。
1、程式入口main函式建立UIApplication例項和UIApplication代理例項
2、在UIApplication代理例項中重寫啟動方法,設定第一ViewController
3、在第一ViewController中新增控制元件,實現對應的程式介面。

18.為什麼寫代理的屬性都是assign而不是retain?請舉例說明。
防止迴圈引用,
Teacherteacher=[[Teacheralloc]init];
Student
student=[[Studentalloc]init];t
eacher.delegate=student;
student.delegate=teacher;
在teacher中dealloc會release當前的Delegate,就會觸發student物件release,繼而也會導致student執行dealloc,在student中也會release自己的delegate,產生迴圈了。

19.UIImage初始化一張圖片有幾種方法?簡述各自的優缺點。
1、從資源讀取,這個方法的圖片是從快取裡面獲取 的,先在快取裡面檢視是不是有這個圖片,沒有的話將圖片新增進快取再使用.有的話直接使用快取裡面的.如果這張圖片用的次數比較多的話,建議使 用這種方式.缺點是效率低下.UIImageimage=[UIImageimageNamed:@”1.png”];
2.從手機本地讀取,比較第一種方式,這個事直接加 載圖片的.所以建議在圖片使用率低的圖片時使用這個方法. //讀取本地圖片非resourceNSString
aPath3=[NSStringstringWithFormat:@"%@/Documents/%@.jpg",NSHomeDirectory(),@"test"];[UIImageimageWithContentsOfFile:aPath3]

20.這段程式碼有什麼問題嗎:
@implementationPerson
-(void)setAge:(int)newAge{
self.age=newAge;
}
@end
死迴圈

21.用OC寫一個氣泡排序
NSMutableArray*array = [NSMutableArrayarrayWithArray:@[@"3",@"1",@"10",@"5",@"2",@"7",@"12",@"4",@"8"]];
for (int i =0; i < array.count;i ++) {
for (intj =0; j < array.count-1 - i; j++) {
if([[arrayobjectAtIndex:j]integerValue] > [[arrayobjectAtIndex:j +1]integerValue]) {
[arrayexchangeObjectAtIndex:jwithObjectAtIndex:j +1];
}
}
}
NSLog(@"%@",array);

22.簡述你對UIView、UIWindow和CALayer的理解
UIView繼承於UIResponder,UIResponder繼承於NSObject,UIView可以響應使用者事件。
CALayer繼承於NSObject,所以 CALayer不能響應事件。 UIView構建介面,UIView側重於對內容的管理,CALayer側重於對內容的繪製。 UIView是用來顯示內容的,可以處理使用者事件;CALayer是用來繪製內容的,對內容進行動畫處理,依賴與UIView來進行顯示,不能處理使用者事 件。

23.frame和bounds區別:
仔細閱讀:http://blog.csdn.net/mad1989/article/details/8711697

24.寫一個完整的代理

25.分析json、xml的區別?json、xml解析方式的底層是如何處理的?
XML是標準通用標記語言(SGML)的子集,非常適合Web傳輸。XML提供統一的方法來描述和交換獨立於應用程式或供應商的結構化資料。
JSON(JavaScriptObjectNotation)一種輕量級的資料交換格式,具有良好的可讀 和便於快速編寫的特性。可在不同平臺之間進行資料交換。JSON採用相容性很高的、完全獨立於語言文字格式,同時也具備類似於C語言的習慣(包括C, C++,C#,Java,JavaScript,Perl,Python等)體系的行為。這些特性使JSON成為理想 的資料交換語言。

26.ViewController的didReceiveMemoryWarning是在什麼時候被呼叫的?預設的操作是什麼?
didReceiveMemoryWarning在出現記憶體警告的時候執行該方法,在該方法裡面釋放掉暫時沒使用的可重用的物件。這個方法不能手動呼叫.

27.物件導向的三大特徵,並作簡單的介紹
封裝、繼承、多型。
封裝:是把客觀事物封裝成抽象的類,隱藏內部的實現,對外部提供介面。
繼承:可以使用現有類的所有功能,並且在無需重新編寫原來的類的情況下對這些功能進行擴充套件。
多型:不同的物件以自己的方式響應相同的的訊息的能力叫做 多型,或者說父類指標指向子類物件<如UITableView的,cellForRow方法,返回值型別是UITbaleViewCell,但是你 返回的cell可以是你自定義的cell,在比如多個類裡面都有同一個方法>

28.簡單說一下懶載入
懶載入,又稱為延遲載入。通常用法,你有一個UITextField型別的property,簡單定義為userNameTextField,但是你不在初始化方法裡為其alloc/init,它 就只是一個指標,不會佔用記憶體。在訪問器裡判斷此property的指標是否為空,若為空,就alloc/init,這時才真正生成這個物件除非這個對 象被使用,否則它永遠不會真正生成,也就不會佔用記憶體。

29.分別描述類目(categories)和延展(extensions)是什麼?以及兩者的區別?繼承和類目在實現中有何區別?為什麼Category只能為物件新增方法,卻不能新增成員變數?
category類目:在不知道原始碼的情況下為一個類擴充套件方法,
extension:為一個類宣告私有方法和變數。 繼承是建立了一個新的類,而類別只是對類的一個擴充套件,還是之前的類。 類目的作用就是為已知的類新增方法。

  1. import、#include和@class有什麼區別

includec語言中引入一個標頭檔案,但是可能出現交叉編譯,

OC裡面已經沒有這個方式引入標頭檔案了,統一使用#import

import在OC中引入自己建立的標頭檔案

import””是引入自己建立類的標頭檔案

import<>是引入系統類的標頭檔案

import不會出現交叉編譯

@class對一個類進行宣告,告訴編譯器有這個類,但是類的定義什麼的都不知道.

31.談談你對MVC的理解?為什麼要用MVC?在Cocoa中MVC是怎麼實現的?你還熟悉其他的OC設計模式或別的設計模式嗎?
MVC是Model-VIew-Controller,就 是模型-檢視-控制器,MVC把軟體系統分為三個部分:Model,View,Controller。在cocoa中,你的程式中的每一個 object(物件)都將明顯地僅屬於這三部分中的一個,而完全不屬於另外兩個。model資料模型,view是對這些資料的顯 示,viewcontroller就是把model拿到view中顯示,起到model和view之間橋樑的作用。MVC可以幫助確保幫助實現程式最大程 度的可重用性。各MVC元素彼此獨立運作,通過分開這些元素,可以構建可維護,可獨立更新的程式組建,提高程式碼的重用性.
單例模式,delegate設計模式,target-action設計模式

32.字串替換方法:
[stringstringByReplacingOccurrencesOfString:@"png"withString:@""]

33.對於語句NSString*testObject=[[NSDataalloc]init]; testObject在編譯時和執行時分別是什麼型別的物件?
編譯的時候是NSString型別,執行的時候是NSData型別

34.什麼是沙盒(sandbox)?沙盒包含哪些檔案,描述每個檔案的使用場景。如何獲取這些檔案的路徑?如何獲取應用程式包中檔案的路徑?
iOS應用程式只能在為該改程式建立的檔案系統中讀取文 件,不可以去其它地方訪問,此區域被成為沙盒,所以所有的非程式碼檔案都要儲存在此,例如影像,圖示,聲音,映像,屬性列表,文字檔案等。 預設情況下,每個沙盒含有3個資料夾:Documents,Library和tmp。 Documents:蘋果建議將程式中建立的或在程式中瀏覽到的檔案資料儲存在該目錄下,iTunes備份和恢復的時候會包括此目錄 Library:儲存程式的預設設定或其它狀態資訊;
Library/Caches:存放快取檔案,iTunes不會備份此目錄,此目錄下檔案不會在應用退出刪除
tmp:提供一個即時建立臨時檔案的地方。
iTunes在與iPhone同步時,備份所有的Documents和Library檔案。
iPhone在重啟時,會丟棄所有的tmp檔案。

  1. isKindOfClass、isMemberOfClass作用分別是什麼?
    -(BOOL)isKindOfClass:classObj判斷是否是這個類或者是這個類子類的例項
    -(BOOL)isMemberOfClass:classObj判斷是否是這個類的例項
    36.http://blog.csdn.net/huifeidexin_1/article/details/7566226
  2. UITableView –UIScrollView –UIView – UIResponder - NSObject

答:Grand CentralDispatch簡稱GCD解決多核並行運算的一種方案
看程式碼就行:
// Grand CentralDispatch簡稱GCD技術

// Do any additional setup afterloading the view.

//dispatch_queue_tnewDispath =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//dispatch_async(newDispath,^{
//[selfdownloadImage];
// });

//#defineDISPATCH_QUEUE_PRIORITY_HIGH2
//#defineDISPATCH_QUEUE_PRIORITY_DEFAULT 0
//#defineDISPATCH_QUEUE_PRIORITY_LOW(-2)
//#defineDISPATCH_QUEUE_PRIORITY_BACKGROUNDINT16_MIN

/*dispatch queue分為下面三種:

  • Serial:又稱為private dispatch queues,同時只執行一個任務。Serial queue通常用於同步訪問特定的資源或資料。當你建立多 個Serial queue時,雖然它們各自是同步執行的,但Serial queue與Serial queue之間是併發執行的。
  • Concurrent: 又稱為global dispatch queue,可以併發地執行多個任務,但是執行完成的順序是隨機的。
  • Maindispatchqueue它是全域性可用的serial queue,它是在應用程式主執行緒上執行任務的
    */

// 一般GCD 可以如下操作

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
// 耗時的操作
dispatch_async(dispatch_get_main_queue(),^{
// 更新介面
});
});

[selfexampleDispatch];

/*
*系統給每一個應用程式提供了三個concurrent dispatch queues。
*這三個併發排程佇列是全域性的,它們只有優先順序的不同。
*因為是全域性的,我們不需要去建立。我們只需要通過使用函式dispath_get_global_queue去得到佇列
*/

dispatch_queue_tglobalQ =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

NSLog(@"global:%p",globalQ);
dispatch_queue_tmainQ =dispatch_get_main_queue();
NSLog(@"mainQ:%p",mainQ);
/*
*雖然dispatch queue是引用計數的物件,但是以上兩個都是全域性的佇列,不用retain或release。
*/

/*
*dispatch_group_async可以實現監聽一組任務是否完成,完成後得到通知執行其他的操作。
*這個方法很有用,比如你執行三個下載任務,當三個任務都下載完成後你才通知介面說完成的了。
*/
timeInt = 0;
[NSTimerscheduledTimerWithTimeInterval:1
target:self
selector:@selector(checkingTime)
userInfo:nil
repeats:YES];
[selfexampleDispath_group];

/*dispatch_barrier_async的使用
*dispatch_barrier_async是在前面的任務執行結束後它才執行,而且它後面的任務等它執行完成之後才會執行
*/

[selfexampleDispatch_barrier];

/*dispatch_apply
*執行某個程式碼片段N次。
*/
dispatch_apply(5,globalQ, ^(size_t index) {
// 執行5次
});

  1. 該問題涉及編譯器的“記憶體對齊”問題:
    現代計算機中記憶體空間都是按照byte(位元組)劃分的,從 理論上講似乎對任何型別的變數的訪問可以從任何地址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體地址訪問,這就需要各型別資料按照一定的規則 在空間上排列,而不是順序的一個接一個的排放,這就是對齊。
    對齊的作用和原因:各個硬體平臺對儲存空間的處理上有很大 的不同。一些平臺對某些特定型別的資料只能從某些特定地址開始存取。其他平臺可能沒有這種情況,但是最常見的是如果不按照適合其平臺的要求對資料存放進行 對齊,會在存取效率上帶來損失。比如有些平臺每次讀都是從偶地址開始,如果一個int型(假設為32位)如果存放在偶地址開始的地方,那麼一個讀週期就 可以讀出,而如果存放在奇地址開始的地方,就可能會需要2個讀週期,並對兩次讀出的結果的高低位元組進行拼湊才能得到該int資料。顯然在讀取效率上下降很 多。這也是空間和時間的博弈。
    通常,我們寫程式的時候,不需要考慮對齊問題。編譯器會替我們選擇適合目標平臺的對齊策略。當然,我們也可以通知給編譯器傳遞預編譯指令而改變對指定資料的對齊方法。
    但是,正因為我們一般不需要關心這個問題,所以因為編輯器對資料存放做了對齊,而我們不瞭解的話,常常會對一些問題感到迷惑。最常見的就是struct資料結構的sizeof結果,出乎意料。
    對於結構體來說,按成員中所佔位元組最大的是float型別,佔用4個位元組,一共有3個成員,所以總的佔用位元組為:4*3=12.可通過編譯器命令來設定:

progmapack(2)

40.TCP:TransmissionControlProtocol傳 輸控制協議TCP是一種面向連線(連線導向)的、可靠的、基於位元組流的運輸層(Transportlayer)通訊協議,由IETF的RFC793說 明(specified)。UDP是UserDatagramProtocol的簡稱,中文名是使用者資料包協議,是OSI參考模型中一種無連線 的傳輸層協議,提供面向事務的簡單不可靠資訊傳送服務,IETFRFC768是UDP的正式規範。
面向連線:是指通訊雙方在通訊時,要事先建立一條通訊線路,其有三個過程:建立連線、使用連線和釋放連線。電話系統是一個面向連線的模式,撥號、通話、掛機;TCP協議就是一種面向連線的協議。
面向無連線:是指通訊雙方不需要事先建立一條通訊線路,而是把每個帶有目的地址的包(報文分組)送到線路上,由系統自主選定路線進行傳輸。郵政系統是一個無連線的模式,天羅地網式的選擇路線,天女散花式的傳播形式;IP、UDP協議就是一種無連線協議。

  1. 注意問的是應用層協議,有些同學直接答了七層模型。
    在開放系統互連(OSI)模型中的最高層,為應用程式提供服務以保證通訊,但不是進行通訊的應用程式本身。
    Telnet協議是TCP/IP協議族中的一員,是Internet遠端登陸服務的標準協議和主要方式。它為使用者提供了在本地計算機上完成遠端主機工作的能力。
    FTP檔案傳輸協議是TCP/IP網路上兩臺計算機傳送檔案的協議,FTP是在TCP/IP網路和INTERNET上最早使用的協議之一,它屬於網路協議組的應用層。
    超文字傳輸協議(HTTP-Hypertexttransferprotocol)是分散式,協作式,超媒體系統應用之間的通訊協議。是全球資訊網(worldwideweb)交換資訊的基礎。
    SMTP(SimpleMailTransferProtocol)即簡單郵件傳輸協議,它是一組用於由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式,它幫助每臺計算機在傳送或中轉信件時找到下一個目的地。
    時間協議(TIMEprotocol)是一個在RFC868內定義的網路協議。它用作提供機器可讀的日期時間資訊。

DNS是域名系統 (Domain Name System) 的縮寫,是因特網的一項核心服務,它作為可以將域名和IP地址相互對映的一個分散式資料庫。
SNMP(Simple Network ManagementProtocol,簡單網路管理協議)的前身是簡單閘道器監控協議(SGMP),用來對通訊線路進行管理。
TFTP(Trivial File Transfer Protocol,簡單檔案傳輸協議)是TCP/IP協議族中的一個用來在客戶機與伺服器之間進行簡單檔案傳輸的協議,提供不復雜、開銷不大的檔案傳輸服務。埠號為69。

42.static關鍵字的作用
靜態全域性變數
優點:
1、節省記憶體。靜態變數只儲存一處,但供所有物件使用。
2、它的值是可以更新的。
3、可提高時間效率。只要某個物件對靜態變數更新一次,所有的物件都能訪問更新後的值。

43.iOS系統框架分為幾層,分別是什麼


1663804-595a655b11e58575.jpg
n塊ズB⒎嶫#抝��偄窉z燴q�

程式開發提供了各種有用的框架,並且大部分與使用者介面有關,本質上來說它負責使用者在iOS裝置上的觸控互動操作。

相關文章