當前位置:成語大全網 - 新華字典 - ios oc的動態識別是指什麽

ios oc的動態識別是指什麽

1、Objective-C的類可以多重繼承麽?可以采用多個協議麽?

答:不可以多重繼承,可以采用多個協議。

2、#import和#include的區別是什麽?#import<> 跟 #import""有什麽區別?

#import能避免頭文件被重復包含的問題:

1) 壹般來說,導入objective c的頭文件時用#import,包含c/c++頭文件時用#include。

使用include要註意重復引用的問題:

class A,class B都引用了class C,class D若引用class A與class B,就會報重復引用的錯誤。

2)#import 確定壹個文件只能被導入壹次,這使妳在遞歸包含中不會出現問題。

所以,#import比起#include的好處就是它避免了重復引用的問題。所以在OC中我們基本用的都是import。

#import<> 包含iOS框架類庫裏的類,#import""包含項目裏自定義的類。

3、Category是什麽?擴展壹個類的方式用繼承好還是類目好?為什麽?

答:Category是類目。用類目好,因為繼承要滿足a is a b的關系,而類目只需要滿足a has a b的關系,局限性更小,妳不用定義子類就能擴展壹個類的功能,還能將類的定義分開放在不同的源文件裏, 用Category去重寫類的方法,僅對本Category有效,不會影響到其他類與原有類的關系。

4、延展是什麽?作用是什麽?

答:延展(extension):在自己類的實現文件中添加類目來聲明私有方法。

5、類實例(成員)變量的@protected,@private,@public聲明各有什麽含義?

@protected:受保護的,該實例變量只能在該類和其子類內訪問,其他類內不能訪問。

@private:私有的,該實例變量只能在該類內訪問,其他類內不能訪問。

@public:***有的,該實例變量誰都可以訪問。

6、id聲明的對象有什麽特性?

沒有 * 號

動態數據類型

可以指向任何類的對象(設置是nil),而不關心其具體類型

在運行時檢查其具體類型

可以對其發送任何(存在的)消息

7、委托是什麽?委托和委托方雙方的property聲明用什麽屬性?為什麽?

委托:壹個對象保存另外壹個對象的引用,被引用的對象實現了事先確定的協議,該協議用於將引用對象中的變化通知給被引用對象。

委托和委托方雙方的property聲明屬性都是assign而不是retain

為了避免循環引用造成的內存泄露。

循環引用的問題這樣理解:

比如在main函數中創建了兩個類的對象A和B,現在引用計數都是1。現在讓A和B互相引用(A有壹個屬性是B對象,屬性說明是retain;B有壹個屬性是A對象,屬性說明是retain),現在兩個對象的引用計數都增加了1,都變成了2。

現在執行[A release]; [B release]; 此時創建對象的main函數已經釋放了自己對對象的所有權,但是此時A和B的引用計數都還是1,因為他們互相引用了。

這時妳發現A和B將無法釋放,因為要想釋放A必須先釋放B,在B的dealloc方法中再釋放A。同理,要想釋放B必須先釋放A,在A的dealloc方法中再釋放B。所以這兩個對象將壹直存在在內存中而不釋放。這就是所謂的循環引用的問題。要想解決這個問題,壹般的方法可以將引用的屬性設置為assign,而不是retain來處理。

8、淺拷貝和深拷貝區別是什麽?

淺層復制:只復制指向對象的指針,而不復制引用對象本身。

深層復制:復制引用對象本身。

意思就是說我有個A對象,復制壹份後得到A_copy對象後,對於淺復制來說,A和A_copy指向的是同壹個內存資源,復制的只不過是是壹個指針,對象本身資源還是只有壹份,那如果我們對A_copy執行了修改操作,那麽發現A引用的對象同樣被修改,這其實違背了我們復制拷貝的壹個思想。深復制就好理解了,內存中存在了兩份獨立對象本身。

用網上壹哥們通俗的話將就是:

淺復制好比妳和妳的影子,妳完蛋,妳的影子也完蛋

深復制好比妳和妳的克隆人,妳完蛋,妳的克隆人還活著。

9、內存管理的幾條原則是什麽?按照默認法則,哪些關鍵字生成的對象需要手動釋放?哪些情況下不需要手動釋放,會直接進入自動釋放池?

當使用new、alloc或copy方法創建壹個對象時,該對象引用計數器為1。如果不需要使用該對象,可以向其發送release或autorelease消息,在其使用完畢時被銷毀。

如果通過其他方法獲取壹個對象,則可以假設這個對象引用計數為1,並且被設置為autorelease,不需要對該對象進行清理,如果確實需要retain這個對象,則需要使用完畢後release。

如果retain了某個對象,需要release或autorelease該對象,保持retain方法和release方法使用次數相等。

使用new、alloc、copy關鍵字生成的對象和retain了的對象需要手動釋放。設置為autorelease的對象不需要手動釋放,會直接進入自動釋放池。

10、怎樣實現壹個單例模式的類,給出思路,不寫代碼。

首先必須創建壹個全局實例,通常存放在壹個全局變量中,此全局變量設置為nil

提供工廠方法對該全局實例進行訪問,檢查該變量是否為nil,如果nil就創建壹個新的實例,最後返回全局實例

全局變量的初始化在第壹次調用工廠方法時會在+allocWithZone:中進行,所以需要重寫該方法,防止通過標準的alloc方式創建新的實例

為了防止通過copy方法得到新的實例,需要實現-copyWithZone方法

只需在此方法中返回本身對象即可,引用計數也不需要進行改變,因為單例模式下的對象是不允許銷毀的,所以也就不用保留

因為全局實例不允許釋放,所以retain,release,autorelease方法均需重寫

11、@class的作用是什麽?

答:在頭文件中, 壹般只需要知道被引用的類的名稱就可以了。 不需要知道其內部的實體變量和方法,所以在頭文件中壹般使用@class來聲明這個名稱是類的名稱。 而在實現類裏面,因為會用到這個引用類的內部的實體變量和方法,所以需要使用#import來包含這個被引用類的頭文件。

@class的作用是告訴編譯器,有這麽壹個類,用吧,沒有問題

@class還可以解決循環依賴的問題,例如A.h導入了B.h,而B.h導入了A.h,每壹個頭文件的編譯都要讓對象先編譯成功才行

使用@class就可以避免這種情況的發生

12、KVC是什麽?KVO是什麽?有什麽特點?

KVC是鍵值編碼,特點是通過指定表示要訪問的屬性名字的字符串標識符,可以進行類的屬性讀取和設置

KVO是鍵值觀察,特點是利用鍵值觀察可以註冊成為壹個對象的觀察者,在該對象的某個屬性變化時收到通知

13、MVC是什麽?有什麽特性?

– MVC是壹種設計模式,由模型、視圖、控制器3部分組成。

– 模型:保存應用程序數據的類,處理業務邏輯的類

– 視圖:窗口,控件和其他用戶能看到的並且能交互的元素

– 控制器:將模型和試圖綁定在壹起,確定如何處理用戶輸入的類

14、定義屬性時,什麽情況使用copy、assign、retain?

使用assign: 對基礎數據類型 (NSInteger,CGFloat)和C數據類型(int, float,double, char, 等等)

使用copy: 希望獲得源對象的副本而不改變源對象內容時,對NSString

使用retain: 希望獲得源對象的所有權時,對其他NSObject和其子類

15.屬性readwrite,readonly,assign,retain,copy,nonatomic 各是什麽作用,在那種情況下用?

assign用於簡單數據類型,如NSInteger,double,bool,

retain和copy用於對象,

readwrite是可讀可寫特性;需要生成getter方法和setter方法時

readonly是只讀特性 只會生成getter方法 不會生成setter方法 ;不希望屬性在類外改變

assign是賦值特性,setter方法將傳入參數賦值給實例變量;僅設置變量時;

retain表示持有特性,setter方法將傳入參數先保留,再賦值,傳入參數的retaincount會+1;

copy表示賦值特性,setter方法將傳入對象復制壹份;需要完全壹份新的變量時。

nonatomic非原子操作,決定編譯器生成的setter getter是否是原子操作,atomic表示多線程安全,壹般使用nonatomic

16.id 聲明的對象有什麽特性?

答:Id聲明的對象具有運行時的特性,即可以指向任意類型的objcetive-c的對象;

17.Objective-C如何對內存管理的,說說妳的看法和解決方法?

答:Objective-C的內存管理主要有三種方式ARC(自動內存計數)、手動內存計數、內存池。

18.內存管理的幾條原則時什麽?

誰申請,誰釋放

遵循Cocoa Touch的使用原則;

內存管理主要要避免“過早釋放”和“內存泄漏”,對於“過早釋放”需要註意@property設置特性時,壹定要用對特性關鍵字,對於“內存泄漏”,壹定要申請了要負責釋放,要細心。

19.那些關鍵字生成的對象 需要手動釋放?

答:關鍵字alloc 或new 生成的對象需要手動釋放

20在和property結合的時候怎樣有效的避免內存泄露?

答:設置正確的property屬性,對於retain需要在合適的地方釋放

21.如何對iOS設備進行性能測試?

Profile-> Instruments ->Time Profiler

22.Object-c的類可以多重繼承麽?可以實現多個接口麽?

答:Object-c的類不可以多重繼承;可以實現多個接口,通過實現多個接口可以完成C++的多重繼承;

23.Category是什麽?重寫壹個類的方式用繼承好還是分類好?為什麽?

答:Category是類別,壹般情況用分類好,用Category去重寫類的方法,僅對本Category有效,不會影響到其他類與原有類的關系。

24.描述壹下iOS SDK中如何實現MVC的開發模式

MVC是模型、試圖、控制開發模式,對於iOS SDK,所有的View都是視圖層的,它應該獨立於模型層,由視圖控制層來控制。所有的用戶數據都是模型層,它應該獨立於視圖。所有的ViewController都是控制層,由它負責控制視圖,訪問模型數據

25. Object C中創建線程的方法是什麽?如果在主線程中執行代碼,方法是什麽?如果想延時執行代碼、方法又是什麽?

線程創建有三種方法:使用NSThread創建、使用 GCD的dispatch、使用子類化的NSOperation,然後將其加入NSOperationQueue;在主線程執行代碼,方法是 performSelectorOnMainThread,如果想延時執行代碼可以用performSelector:onThread:withObject:waitUntilDone

26、iPhone5 的屏幕分辨率大小為 1136* 640 ?

答:屏幕分辨率:用於量度位圖圖像內數據量多少的壹個參數。通常表示成ppi(每英寸像素Pixel per inch)。屏幕物理尺寸不變,分辨率越高,每單位面積內包含的細節(像素點)越多。