1、簡答題c++
一、Objective-C的類能夠多重繼承麼?能夠採用多個協議麼?設計模式
不能夠多重繼承,能夠採用多個協議。數組
二、#import和#include的區別是什麼?#import<> 跟 #import""有什麼區別?框架
1.
使用include要注意重複引用的問題:性能
class A,class B都引用了class C,class D若引用class A與class B,就會報重複引用的錯誤。測試
2. #import肯定一個文件只能被導入一次,這使你在遞歸包含中不會出現問題。編碼
因此,#import比起#include的好處就是它避免了重複引用的問題。因此在OC中咱們基本用的都是import。spa
#import<> 包含iOS框架類庫裏的類,#import""包含項目裏自定義的類。
三、Category是什麼?擴展一個類的方式用繼承好仍是類目好?爲何?
四、延展是什麼?做用是什麼?
五、類實例(成員)變量的@protected ,@private,@public聲明各有什麼含義?
@protected:受保護的,該實例變量只能在該類和其子類內訪問,其餘類內不能訪問。
@private:私有的,該實例變量只能在該類內訪問,其餘類內不能訪問。
@public:共有的,該實例變量誰均可以訪問。
六、id聲明的對象有什麼特性?
Ø
Ø
Ø
Ø
Ø
七、委託是什麼?委託和委託方雙方的property聲明用什麼屬性?爲何?
委託:一個對象保存另一個對象的引用,被引用的對象實現了事先肯定的協議,該協議用於將引用對象中的變化通知給被引用對象。
爲了不循環引用形成的內存泄露。
八、淺拷貝和深拷貝區別是什麼?
深層複製:複製引用對象自己。
意思就是說我有個A對象,複製一份後獲得A_copy對象後,對於淺複製來講,A和A_copy指向的是同一個內存資源,複製的只不過是是一個指針,對象自己資源仍是隻有一份,那若是咱們對A_copy執行了修改操做,那麼發現A引用的對象一樣被修改,這其實違背了咱們複製拷貝的一個思想。深複製就好理解了,內存中存在了兩份獨立對象自己。
用網上一哥們通俗的話將就是:
淺複製比如你和你的影子,你完蛋,你的影子也完蛋
深複製比如你和你的克隆人,你完蛋,你的克隆人還活着。
九、內存管理的幾條原則是什麼?按照默認法則,哪些關鍵字生成的對象須要手動釋放?哪些狀況下不須要手動釋放,會直接進入自動釋放池?
•
•
•
使用new、alloc、copy關鍵字生成的對象和retain了的對象須要手動釋放。設置爲autorelease的對象不須要手動釋放,會直接進入自動釋放池。
十、怎樣實現一個單例模式的類,給出思路,不寫代碼。
•
•
•
•
•
•
十一、@class的做用是什麼?
•
•
•
十二、KVC是什麼?KVO是什麼?有什麼特色?
•
•
1三、MVC是什麼?有什麼特性?
–
–
–
–
1四、定義屬性時,什麼狀況使用copy、assign、retain?
使用assign:對基礎數據類型(NSInteger,CGFloat)和C數據類型(int, float, double, char,等等)
使用copy:但願得到源對象的副本而不改變源對象內容時,對NSString
使用retain:但願得到源對象的全部權時,對其餘NSObject和其子類
5.對於語句NSString*obj = [[NSData alloc] init]; obj在編譯時和運行時分別時什麼類型的對象?
編譯時是NSString的類型;運行時是NSData類型的對象
6.常見的object-c的數據類型有那些, 和C的基本數據類型有什麼區別?如:NSInteger和int
object-c的數據類型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等,這些都是class,建立後即是對象,而C語言的基本數據類型int,只是必定字節的內存空間,用於存放數值;而object-c的NSNumber包含有父類NSObject的方法和NSNumber本身的方法,能夠完成複雜的操做。
7.id 聲明的對象有什麼特性?
Id 聲明的對象具備運行時的特性,便可以指向任意類型的objcetive-c的對象;
8.Objective-C如何對內存管理的,說說你的見解和解決方法?
Objective-C的內存管理主要有三種方式ARC(自動內存計數)、手動內存計數、內存池。
9.內存管理的幾條原則時什麼?按照默認法則.那些關鍵字生成的對象
須要手動釋放?在和property結合的時候怎樣有效的避免內存泄露?
誰申請,誰釋放
遵循Cocoa Touch的使用原則;
內存管理主要要避免「過早釋放」和「內存泄漏」,對於「過早釋放」須要注意@property設置特性時,必定要用對特性關鍵字,對於「內存泄漏」,必定要申請了要負責釋放,要細心。
關鍵字alloc 或new 生成的對象須要手動釋放;
設置正確的property屬性,對於retain須要在合適的地方釋放,
10.如何對iOS設備進行性能測試?
Profile-> Instruments ->Time Profiler
11.看下面的程序,第一個NSLog會輸出什麼?這時str的retainCount是多少?第二個和第三個呢? 爲何?
=======================================================
NSMutableArray* ary = [[NSMutableArray array] retain];
NSString *str = [NSString stringWithFormat:@"test"];
[strretain];
[aryaddObject:str];
NSLog(@"%@%d",str,[str retainCount]);
[strretain];
[strrelease];
[strrelease];
NSLog(@"%@%d",str,[str retainCount]);
[aryremoveAllObjects];
NSLog(@"%@%d",str,[str retainCount]);
=======================================================
str的retainCount建立+1,retain+1,加入數組自動+1
3
retain+1,release-1,release-1
2
數組刪除全部對象,全部數組內的對象自動-1
1
12. Object C中建立線程的方法是什麼?若是在主線程中執行代碼,方法是什麼?若是想延時執行代碼、方法又是什麼?
線程建立有三種方法:使用NSThread建立、使用GCD的dispatch、使用子類化的NSOperation,而後將其加入NSOperationQueue;在主線程執行代碼,方法是performSelectorOnMainThread,若是想延時執行代碼能夠用performSelector:onThread:withObject:waitUntilDone:
13.描述一下iOS SDK中如何實現MVC的開發模式
MVC是模型、試圖、控制開發模式,對於iOS SDK,全部的View都是視圖層的,它應該獨立於模型層,由視圖控制層來控制。全部的用戶數據都是模型層,它應該獨立於視圖。全部的ViewController都是控制層,由它負責控制視圖,訪問模型數據。
靜態區 常量區 代碼區 堆 棧