1. #import 跟#include 又什麼差異,@class呢, #import<> 跟 #import」」又什麼差異?java
答:#import是Objective-C導入頭文件的keyword。#include是C/C++導入頭文件的keyword,使用#import頭文件會本身主動僅僅導入一次,不會反覆導入,至關於#include和#pragma once;@class告訴編譯器某個類的聲明,當運行時,纔去查看類的實現文件,可以解決頭文件的相互包括;#import<>用來包括系統的頭文件,#import」」用來包括用戶頭文件。
2. 屬性readwrite。readonly,assign。retain。copy,nonatomic 各是什麼做用。在那種狀況下用?
1. readwrite 是可讀可寫特性;需要生成getter方法和setter方法時
2. readonly 是僅僅讀特性 僅僅會生成getter方法 不會生成setter方法 ;不但願屬性在類外改變
3. assign 是賦值特性,setter方法將傳入參數賦值給實例變量;僅設置變量時;
4. retain 表示持有特性。setter方法將傳入參數先保留。再賦值,傳入參數的retaincount會+1;
5. copy 表示賦值特性,setter方法將傳入對象複製一份;需要全然一份新的變量時。
6. nonatomic 非原子操做,決定編譯器生成的setter getter是不是原子操做。atomic表示多線程安全,通常使用nonatomic 數組
3. Object-c的類可以多重繼承麼?可以實現多個接口麼?Category是什麼?重寫一個類的方式用繼承好仍是分類好?爲何?安全
答: Object-c的類不可以多重繼承;可以實現多個接口,經過實現多個接口可以完畢C++的多重繼承;Category是類別,普通狀況用分類好,用Category去重寫類的方法,僅對本Category有效。不會影響到其它類與原有類的關係。
如:NSInteger和int
object-c的數據類型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等。這些都是class,建立後即是對象,而C語言的基本數據類型int,僅僅是必定字節的內存空間。用於存放數值;NSInteger是基本數據類型,並不是NSNumber的子類。固然也不是NSObject的子類。NSInteger是基本數據類型Int或者Long的別名(NSInteger的定義typedef long NSInteger),它的差異在於。NSInteger會依據系統是32位仍是64位來決定是自己是int仍是Long。
7.id 聲明的對象有什麼特性?多線程
Id 聲明的對象具備執行時的特性。即可以指向隨意類型的objcetive-c的對象;
8.Objective-C怎樣對內存管理的,說說你的見解和解決方法?app
Objective-C的內存管理主要有三種方式ARC(本身主動內存計數)、手動內存計數、內存池。框架
1. (Garbage Collection)本身主動內存計數:這樣的方式和java相似,在你的程序的運行過程當中。始終有一個高人在背後準確地幫你收拾垃圾。你不用考慮它何時開始工做。如何工做。你僅僅需要明確。我申請了一段內存空間。當我再也不使用從而這段內存成爲垃圾的時候,我就完全的把它忘記掉。反正那個高人會幫我收拾垃圾。遺憾的是。那個高人需要消耗必定的資源,在攜帶設備裏面。資源是緊俏商品因此iPhone不支持這個功能。函數
因此「Garbage Collection」不是本入門指南的範圍,對「Garbage Collection」內部機制感興趣的同窗可以參考一些其它的資料。只是說老實話「Garbage Collection」不大適合適剛開始學習的人研究。
解決: 經過alloc – initial方式建立的, 建立後引用計數+1, 此後每retain一次引用計數+1, 那麼在程序中作對應次數的release就行了.
2. (Reference Counted)手動內存計數:就是說。從一段內存被申請以後。就存在一個變量用於保存這段內存被使用的次數,咱們臨時把它稱爲計數器。當計數器變爲0的時候,那麼就是釋放這段內存的時候。post
比方說,當在程序A裏面一段內存被成功申請完畢以後。那麼這個計數器就從0變成1(咱們把這個過程叫作alloc),而後程序B也需要使用這個內存。那麼計數器就從1變成了2(咱們把這個過程叫作retain)。緊接着程序A再也不需要這段內存了,那麼程序A就把這個計數器減1(咱們把這個過程叫作release);程序B也再也不需要這段內存的時候,那麼也把計數器減1(這個過程仍是release)。當系統(也就是Foundation)發現這個計數器變成了0。那麼就會調用內存回收程序把這段內存回收(咱們把這個過程叫作dealloc)。順便提一句。假設沒有Foundation,那麼維護計數器,釋放內存等等工做需要你手工來完畢。
解決:一般是由類的靜態方法建立的, 函數名中不會出現alloc或init字樣, 如[NSString string]和[NSArray arrayWithObject:], 建立後引用計數+0, 在函數出棧後釋放, 即至關於一個棧上的局部變量. 固然也可以經過retain延長對象的生存期.
3. (NSAutoRealeasePool)內存池:可以經過建立和釋放內存池控制內存申請和回收的時機.
解決:是由autorelease增長系統內存池, 內存池是可以嵌套的, 每個內存池都需要有一個建立釋放對, 就像main函數中寫的同樣. 使用也很是easy, 比方[[[NSString alloc]initialWithFormat:@」Hey you!」] autorelease], 即將一個NSString對象增長到最內層的系統內存池, 當咱們釋放這個內存池時, 當中的對象都會被釋放.
9. 原子(atomic)跟非原子(non-atomic)屬性有什麼差異?
1. atomic提供多線程安全。性能
是防止在寫未完畢的時候被另一個線程讀取。形成數據錯誤
2. non-atomic:在本身管理內存的環境中。解析的訪問器保留並本身主動釋放返回的值,假設指定了 nonatomic ,那麼訪問器僅僅是簡單地返回這個值。
10. 看如下的程序,第一個NSLog會輸出什麼?學習
這時str的retainCount是多少?
第二個和第三個呢? 爲何?
=======================================================
NSMutableArray* ary = [[NSMutableArray array] retain];
NSString *str = [NSString stringWithFormat:@"test"];
[str retain];
[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
11. 內存管理的幾條原則時什麼?依照默認法則.那些keyword生成的對象
需要手動釋放?在和property結合的時候如何有效的避免內存泄露?
誰申請,誰釋放
遵循Cocoa Touch的使用原則;
內存管理主要要避免「過早釋放」和「內存泄漏」,對於「過早釋放」需要注意@property設置特性時,必定要用對特性keyword。對於「內存泄漏」,必定要申請了要負責釋放,要細心。
keywordalloc 或new 生成的對象需要手動釋放;
設置正確的property屬性,對於retain需要在合適的地方釋放。
12.怎樣對iOS設備進行性能測試?
Profile-> Instruments ->Time Profiler
13. Object C中建立線程的方法是什麼?
假設在主線程中運行代碼。方法是什麼?假設想延時運行代碼、方法又是什麼?
線程建立有三種方法:使用NSThread建立、使用GCD的dispatch、使用子類化的NSOperation,而後將其增長NSOperationQueue;在主線程運行代碼,方法是performSelectorOnMainThread,假設想延時運行代碼可以用performSelector:onThread:withObject:waitUntilDone:
14.描寫敘述一下iOS SDK中怎樣實現MVC的開發模式
MVC是Model-VIew-Controller,就是模型-視圖-控制器, MVC把軟件系統分爲三個部分:Model,View,Controller。
在cocoa中,你的程序中的每一個object(對象)都將明顯地僅屬於這三部分中的一個。而全然不屬於另外兩個。model數據模型。view是對這些數據的顯示,viewcontroller就是把model拿到view中顯示。起到model和view之間橋樑的做用。MVC可以幫助確保幫助實現程序最大程度的可重用性。
各MVC元素彼此獨立運做,經過分開這些元素,可以構建可維護。可獨立更新的程序組建, 提升代碼的重用性.
答案:淺層複製:僅僅複製指向對象的指針。而不復制引用對象自己。
深層複製:複製引用對象自己。
意思就是說我有個A對象。複製一份後獲得A_copy對象後,對於淺複製來講。A和A_copy指向的是同一個內存資源,複製的僅僅只是是是一個指針,對象自己資源
仍是僅僅有一份。那假設咱們對A_copy運行了改動操做,那麼發現A引用的對象相同被改動,這事實上違背了咱們複製拷貝的一個思想。深複製就好理解了,內存中存在了
兩份獨立對象自己。
16. 類別的做用?繼承和類別在實現中有何差異?
答案:category 可以在不獲悉,不改變原來代碼的狀況下往裏面加入新的方法,僅僅能加入,不能刪除改動。
並且假設類別和原來類中的方法產生名稱衝突,則類別將覆蓋原來的方法。因爲類別具備更高的優先級。
類別主要有3個做用:
(1)將類的實現分散到多個不一樣文件或多個不一樣框架中。
(2)建立對私有方法的前向引用。
(3)向對象加入非正式協議。
繼承可以添加,改動或者刪除方法,並且可以添加屬性。
17. 類別和類擴展的差異。
答案:category和extensions的不一樣在於 後者可以加入屬性。
另外後者加入的方法是必須要實現的。
extensions可以以爲是一個私有的Category。
18. 什麼是KVO和KVC?
答案:kvc:鍵 – 值編碼是一種間接訪問對象的屬性使用字符串來標識屬性。而不是經過調用存取方法。直接或經過實例變量訪問的機制。
很是多狀況下可以簡化程序代碼。apple文檔事實上給了一個很是好的樣例。
kvo:鍵值觀察機制。他提供了觀察某一屬性變化的方法,極大的簡化了代碼。
詳細用看到嗯哼用到過的一個地方是對於button點擊變化狀態的的監控。
比方我本身定義的一個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];
}
}
對於系統是依據keypath去取的到對應的值發生改變。理論上來講是和kvc機制的道理是同樣的。
對於kvc機制怎樣經過key尋找到value:
「當經過KVC調用對象時。比方:[self valueForKey:@」someKey」]時,程序會本身主動試圖經過幾種不一樣的方式解析這個調用。首先查找對象是否帶有 someKey 這種方法,假設沒找到。會繼續查找對象是否帶有someKey這個實例變量(iVar),假設尚未找到,程序會繼續試圖調用 -(id) valueForUndefinedKey:這種方法。假設這種方法仍是沒有被實現的話,程序會拋出一個NSUndefinedKeyException異常錯誤。
(cocoachina.com注:Key-Value Coding查找方法的時候。不僅會查找someKey這種方法。還會查找getsomeKey這種方法,前面加一個get。或者_someKey以及_getsomeKey這幾種形式。
同一時候。查找實例變量的時候也會不僅查找someKey這個變量,也會查找_someKey這個變量是否存在。)
設計valueForUndefinedKey:方法的主要目的是當你使用-(id)valueForKey方法從對象中請求值時。對象能夠在發生錯誤前。有最後的機會響應這個請求。這樣作有很是多優勢。如下的兩個樣例說明了這樣作的優勢。
「
來至cocoa,這個說法應該挺有道理。
因爲咱們知道button倒是存在一個highlighted實例變量.所以爲什麼上面咱們僅僅是add一個相關的keypath便可了。
可以依照kvc查找的邏輯理解,就說的過去了。
19. 代理的做用?
答案:代理的目的是改變或傳遞控制鏈。
贊成一個類在某些特定時刻通知到其它類,而不需要獲取到那些類的指針。
可以下降框架複雜度。
另一點。代理可以理解爲java中的回調監聽機制的一種相似。
20. oc中可改動和不可以改動類型。
答案:可改動不可改動的集合類。
這個我我的簡單理解就是可動態加入改動和不可動態加入改動同樣。
比方NSArray和NSMutableArray。前者在初始化後的內存控件就是固定不可變的。後者可以加入等,可以動態申請新的內存空間。