iOS面試

循環引用:
http://ios.jobbole.com/82077/
類別的作用
功能:
1.擴充現有類的功能
2.對現有類進行模塊化的設計
3.聲明非正式的協議
4.匿名分類(@interface 類名 () @end),一般在依賴類的.m文件的最上面生成匿名分類,專門用來聲明私有的屬性和方法
5.調用私有方法
延展的功能
為自己添加私有的方法,可以不用創建文件,直接在m文件中申明,但是必須實現,即使創建文件也只有h文件
類別與延展的關系
1.延展是匿名的類別
2.延展添加的是私有方法,延展的方法必須在對應的m文件中實現,而類別不用
3.延展可以添加屬性,分類不行
類別使用注意:
1.類別可以訪問原始類的實例變量,但是不能添加實例變量,如果想添加只有通過繼承創建子類來實現。
2.類別可以重載原始類方法,這樣會覆蓋原始類的方法,不推薦使用,即使要實現,可以通過繼承創建子類實現
3.類別的方法,只要你不掉用他,可以不用實現
什么是延遲加載(懶加載)?
懶加載即重寫get方法,此方法多用于已有的數據加載方法,加載數據后賦值給數組.
char const p
如果const位于的左側,則const就是用來修飾指針所指向的變量,即指針指向為常量;
如果const位于*的右側,const就是修飾指針本身,即指針本身是常量。
數據的持久性存儲
1.屬性列表 主要涉及到NSUserDefaults 用于存儲配置信息
2.對象歸檔 使用基本對象類型定制個性化緩存
3數據庫存儲(SQLite) 用于存儲查詢需求較多的數據
4Core Data 。 用于規劃應用中的對象
數據請求方法:
NSURLConnection 系統的,常用的方式
NSURLSession 系統的,ios7.0之后出現的,使用了Block,提高了效率
ASIHttpRequest 第三方的,原來經常使用的數據請求庫,缺點:環境是mrc,要進行ARC與MRC之間的轉化,沒有使用block
AFNetworking 第三方的,現在被經常使用,內部集成了NSURLConnection和NSURLSession,環境是ARC,使用了Block,提高了效率,不用系統庫的支撐
程序的生命周期
application didFinishLaunchingWithOptions:開始
applicationWillResignActive:變成不活躍
applicationDidEnterBackground:進入后臺
applicationWillEnterForeground:進入前臺
applicationDidBecomeActive:變成活躍
applicationWillTerminate:即將關閉

視圖控制器的生命周期
1.initWithNibName: //初始化方法(一次初始化) 通常用xib創建對象時進行的初始化工作放在這里
2.init //初始化方法(一次初始化方法) 通常用純代碼創建對象的時候調用
loadView //加載視圖(初始化方法)
viewDidLoad //二次初始化方法(純代碼,xib創建對象都要調用)
viewWillAppear:(BOOL)animated //視圖將要出現
viewDidAppear:(BOOL)animated //視圖已經出現
viewWillDisappear:(BOOL)animated//視圖將要消失
viewDidDisappear:(BOOL)animated //視圖已經消失
堆和棧的區別:
  一、堆棧空間分配區別:
  1、棧(操作系統):由操作系統自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的棧;
  2、堆(操作系統): 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收,分配方式倒是類似于鏈表。
  二、堆棧緩存方式區別:
  1、棧使用的是一級緩存, 他們通常都是被調用時處于存儲空間中,調用完畢立即釋放;
  2、堆是存放在二級緩存中,生命周期由虛擬機的垃圾回收算法來決定(并不是一旦成為孤兒對象就能被回收)。所以調用這些對象的速度要相對來得低一些。
  三、堆棧數據結構區別:
  堆(數據結構):堆可以被看成是一棵樹,如:堆排序;
  棧(數據結構):一種先進后出的數據結構。
1.static靜態變量的作用
答:1.表示全局靜態,用來修飾成員變量和成員方法

2.被修飾的變量和方法獨立于該類的任何對象,即它不依賴類特定實例,被類的所有實例共享

3.靜態方法可以直接通過類名調用,任何實例也可調用。
4.靜態變量可以不進行外置聲明,直接調用,使用靜態方法,不用實例化,創建類的對象,使方法調用方便,節省空間
5.static成員是不能被其所在class創建的實例訪問的,其默認值是0,只要執行一次,運行時開辟全局內存空間,存儲上一次數據,便于下次調用,對于實例變量,沒創建一個實例,就會為實例變量分配一次內存,實例變量可以在內存中有多個拷貝,互不影響(靈活)。
2.get和post使用時的區別
答:1.get是從服務器上去獲取數據,post是向服務器傳輸數據(一般是用于圖片的傳輸)
2.. get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應,在URL中可以看到。post是通過HTTP post機制,將表單內各個字段與其內容放置在HTML HEADER內一起傳送到ACTION屬性所指的URL地址。用戶看不到這個過程。

  1. 對于get方式,服務器端用Request.QueryString獲取變量的值,對于post方式,服務器端用Request.Form獲取提交的數據。

  2. get傳送的數據量較小。post傳送的數據量較大,一般被默認為不受限制。

  3. get安全性非常低,post安全性較高。但是執行效率卻比Post方法好。

建議:
1、get方式的安全性較Post方式要差些,包含機密信息的話,建議用Post數據提交方式;
2、在做數據查詢時,建議用Get方式;而在做數據添加、修改或刪除時,建議用Post方式;
3.@class和#import的區別
1.#import包含被引用類所有的信息,被引用類的變量和方法;@class是前向聲明,只是告訴編譯器在某一個類的.h文件中聲明另一個類,沒有聲明具體信息。
2.使用@class只需要被引用類的名稱,在.m文件使用#import來包含被引用類的頭文件,因為實現類時需要用到被引用類的實體變量和方法。

bundle(沙盒):一個應用只能在自己的沙盒中讀取或存儲文件,而不能操作其他沙盒中的文件。好處:保護應用的隱私不受侵犯,保護系統文件的安排,應用刪除后相關文件也能被全部清除。
每個應用都有自己的沙盒,沙盒的根目錄的獲取方法是NSHomeDirectory()。
根目錄下的內容:
-.app文件,實際上是一個文件夾,包含了可執行文件、Nib文件、圖片資源、plist等。XCode中能看到的資源,及編譯后的可執行文件,都封裝在app中。
-Documents文件夾,用于存放你的應用所產生的數據,該文件夾可通過iTunes備份,可以存儲游戲進度等。
-Library文件夾,用于存放用戶偏好和臨時文件。
-tmp文件夾是系統的中轉站。
自動釋放池是什么,如何工作
當您向一個對象發送一個autorelease 消息時,Cocoa就會將該對象的一個引用放入到最新的自動釋放池。它仍然是個正當的對象,因此自動釋放池定義的作用域內的其它對象可以向它發送消息。當 程序執行到作用域結束的位置時,自動釋放池就會被釋放,池中的所有對象也就被釋放。
ojc-c 是 通過一種"referring counting"(引用計數)的方式來管理內存的, 對象在開始分配內存(alloc)的時候引用計數為一,以后每當碰到有copy,retain的時候引用計數都會加一, 每當碰到release和autorelease的時候引用計數就會減一,如果此對象的計數變為了0, 就會被系統銷毀.
NSAutoreleasePool 就是用來做引用計數的管理工作的,這個東西一般不用你管的. 3. autorelease和release沒什么區別,只是引用計數減一的時機不同而已,autorelease會在對象的使用真正結束的時候才做引用計數減一.
obj-c的優缺點
objc優點: 1) Cateogies 2) Posing 3) 動態識別 4) 5)彈性消息傳遞 6) 不是一個過度復雜的 C 衍生語言 7) Objective-C 與 C++ 可混合編程 缺點: 1) 不支持命名空間 2) 不支持運算符重載
3) 不支持多重繼承
4) 使用動態運行時類型,所有的方法都是函數調用,所以很多編譯時優化方法都用不到。(如內聯函數等),性能低劣。
readwrite,readonly,assign,retain,copy,nonatomic屬性的作用
@property是一個屬性訪問聲明,擴號內支持以下幾個屬性: 1,getter=getterName,setter=setterName,設置setter與getter的方法名 2,readwrite,readonly,設置可供訪問級別 2,assign,setter方法直接賦值,不進行任何retain操作,為了解決原類型與環循引用問題 3,retain,setter方法對參數進行release舊值再retain新值,所有實現都是這個順序(CC上有相關資料) 4,copy,setter方法進行Copy操作,與retain處理流程一樣,先舊值release,再Copy出新的對象,retainCount為1。這是為了減少對上下文的依賴而引入的機制。 5,nonatomic,非原子性訪問,不加同步,多線程并發訪問會提高性能。注意,如果不加此屬性,則默認是兩個訪問方法都為原子型事務訪問。鎖被加到所屬對象實例級。
1。assign和retain,copy的區別
assign就是和普通語言的賦值一樣
retain 在一個對象中保存該對象需要擁有的對象
對該對象進行應用計數+1
@property (retain) 為了寫程序方便
copy主要是賦值
一般 代理的申明都是assign 為什么
原因有2個,
1 根本就沒有必要把代理的計數器+1
主要是為了避免引用技術嵌套,遞歸
2。如何持久保存數據
NSUserDefaults, Plist, SQLite3, file
3。網絡方面得 比如如何檢測聯網 http xml等
ASIHTTPRequest Reacheable.[hm]
原理是ifconfig 是不是有ip地址
Reachability
來判斷是否有網絡3G Wifi
4。類之間得繼承關系 比如UIview得父類是哪一個等等?
UIResponder,處理觸摸,
touchBegin, touchEnd, nextResponder
5。異常處理
都是自己判斷 錯誤信息
longjmp
char *p = malloc(100);
if (p == NULL) {
}
區分frame與bounds
//都是表示位置
//區別 frame:它的參考坐標系是(世界坐標系)(父視圖),設置坐標時以父類的左上角為坐標原點(參考點)
//bounds:參考坐標系(本地坐標系)(自身),設置坐標時以自己的左上角為坐標原點(參考點)
//當先給視圖設置了frame,再設置bouns時,視圖會以frame的中心點為中心,去設置bounds時的視圖的位置
//注意:bounds的坐標是不起作用的.
//當直接給視圖用bounds設置位置時,視圖會以父視圖的左上角為中心點設置自己的大小

//注意:在使用時,如果需要坐標點就使用frame 如果只是用大小就使用bounds
1—Autorelease pool
  自動釋放池(Autorelease pool)是OC的一種內存自動回收機制,可以將一些臨時變量通過自動釋放池來回收統一釋放
  自動釋放池本事銷毀的時候,池子里面所有的對象都會做一次release操作
(1)在自動釋放池@autoreleasepool{}中alloc一個對象后(如p1),仍然需要用[p1 autorelease];只是這個語句和[p1 release];不同,后者表示把p1的retainCount-1,而前者僅僅表示把p1放到自動釋放池中返回一個self,自動釋放池結束銷毀時, 統一對里面的對象引用計數retainCount-1。
(2)@autoreleasepool{}可以隨意創建,也可以嵌套使用。
(3)不管這個對象是在自動釋放池內還是外創建的,只要在自動釋放池內寫一個[p1 autorelease];p1就會被放到自動釋放池中。注意autorelease是一個方法,且只有在自動釋放池中使用才有效。
(4)如果把一個對象重復加到自動釋放池如[p1 autorelease];[p1 autorelease];,那么會出錯。原因是:加載幾次,屆時自動釋放池就會用[p1 release];釋放幾次,但是由于這兩個加載的對象其實是一個對象同樣地址,所以第一次自動釋放正確,第二次自動釋放時發現已經被釋放了,所以p1就 變成了野指針
2??4??
2—簡述內存分區情況
(1)代碼區:存放函數二進制代碼
(2)數據區:系統運行時申請內存并初始化,系統退出時由系統釋放。存放全局變量、靜態變量、常量
(3)堆區:通過malloc等函數或new等操作符動態申請得到,需程序員手動申請和釋放
(4)棧區:函數模塊內申請,函數結束時由系統自動釋放。存放局部變量、函數參數
另一種說法:代碼區,靜態區,常量區,堆區。棧區
3---視圖的生命周期
當一個視圖控制器被創建,并在屏幕上顯示的時候。 代碼的執行順序
1、 alloc 創建對象,分配空間
2、init (initWithNibName) 初始化對象,初始化數據
3、loadView 從nib載入視圖 ,通常這一步不需要去干涉。除非你沒有使用xib文件創建視圖
4、viewDidLoad 載入完成,可以進行自定義數據以及動態創建其他控件
5、viewWillAppear 視圖將出現在屏幕之前,馬上這個視圖就會被展現在屏幕上了
6、viewDidAppear 視圖已在屏幕上渲染完成
當一個視圖被移除屏幕并且銷毀的時候的執行順序,這個順序差不多和上面的相反
1、viewWillDisappear 視圖將被從屏幕上移除之前執行
2、viewDidDisappear 視圖已經被從屏幕上移除,用戶看不到這個視圖了
3、dealloc 視圖被銷毀,此處需要對你在init和viewDidLoad中創建的對象進行釋放
在同一個類A中,有方法a和方法b,方法b如何調用方法a?
[self a];
有A、B兩個類,B類繼承于A類,都實現了方法xx。創建B類實例b,如何讓b調用A類?
[super a];
const和Volatile分別代表什么意思?
Volatile表示每次都從內存取數據
類型id代表什么意思?
面向對象包含哪些元素?
繼承和分類的區別?
Catogory
Catogory實現起來麻煩一些,但是使用方便
NSSet類的作用是什么?
集合
編寫一個完整程序,在控制臺打印字符串“HelloWorld!”
用遞歸實現計算n的階乘。(用objective-c語法實現)
//
static全局變量與普通的全局變量有什么區別?static局部變量和普通局部變量有什么區別?static函數與普通函數有什么區別?
C語言中講講static變量和static函數有什么作用
static關鍵字有兩種意思,你看上下文來判斷
1,表示變量是靜態存儲變量
表示變量存放在靜態存儲區.
2,表示該變量是內部連接
(這種情況是指該變量不在任何{}之內,就象全局變量那樣,這時候加上static)
,也就是說在其它的.cpp文件中,該變量是不可見的(你不能用).
當static加在函數前面的時候
表示該函數是內部連接,之在本文件中有效,別的文件中不能應用該函數.
不加static的函數默認為是全局的.
也就是說在其他的.cpp中只要申明一下這個函數,就可以使用它.
1、static全局變量與普通的全局變量有什么區別?static局部變量和普通局部變量有什么區別?static函數與普通函數有什么區別?
答:全局變量(外部變量)的說明之前再冠以static 就構成了靜態的全局變量。全局變量本身就是靜態存儲方式, 靜態全局變量當然也是靜態存儲方式。 這兩者在存儲方式上并無不同。這兩者的區別雖在于非靜態全局變量的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。 而靜態全局變量則限制了其作用域, 即只在定義該變量的源文件內有效, 在同一源程序的其它源文件中不能使用它。由于靜態全局變量的作用域局限于一個源文件內,只能為該源文件內的函數公用, 因此可以避免在其它源文件中引起錯誤。
從以上分析可以看出, 把局部變量改變為靜態變量后是改變了它的存儲方式即改變了它的生存期。把全局變量改變為靜態變量后是改變了它的作用域, 限制了它的使用范圍。
static函數與普通函數作用域不同。static函數僅在本文件中使用。只在當前源文件中使用的函數應該說明為內部函數(static),內部函數應該在當前源文件中說明和定義。對于可在當前源文件以外使用的函數,應該在一個頭文件中說明,要使用這些函數的源文件要包含這個頭文件
static全局變量與普通的全局變量有什么區別:static全局變量只初使化一次,防止在其他文件單元中被引用;
static局部變量和普通局部變量有什么區別:static局部變量只被初始化一次,下一次依據上一次結果值;
static函數與普通函數有什么區別:static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝
2、如何引用一個已經定義過的全局變量?
答:extern
可以用引用頭文件的方式,也可以用extern關鍵字,如果用引用頭文件方式來引用某個在頭文件中聲明的全局變理,假定你將那個變寫錯了,那么在編譯期間 會報錯,如果你用extern方式引用時,假定你犯了同樣的錯誤,那么在編譯期間不會報錯,而在連接期間報錯。
3、全局變量可不可以定義在可被多個.C文件包含的頭文件中?為什么?
答:可以,在不同的C文件中以static形式來聲明同名全局變量。
可以在不同的C文件中聲明同名的全局變量,前提是其中只能有一個C文件中對此變量賦初值,此時連接不會出錯。
什么是UDP和TCP的區別是什么?
TCP的全稱為傳輸控制協議。這種協議可以提供面向連接的、可靠的、點到點的通信。
UDP的全稱為用戶數據報協議,它可以提供非連接的不可靠的點到多點的通信。
用TCP還是UDP,那要看你的程序注重哪一個方面?可靠還是快速?
TCP/IP 建立連接的過程
在TCP/IP協議中,TCP協議提供可靠的連接服務,采用三次握手建立一個連接。
第一次握手:建立連接時,客戶端發送連接請求到服務器,并進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器收到客戶端連接請求,向客戶端發送允許連接應答,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的允許連接應答,向服務器發送確認,客戶端和服務器進入通信狀態,完成三次握手。
(所謂的三次握手就是要有三次連接信息的發送/接收過程。TCP連接的建立需要進行三次連接信息的發送/接收。)
-(void) print:(NSString*) msg
{
NSLog(@"%@",msg);
}
printf("%d,%c\n",i,c)
char str[10]=",str2[]={"China"};
strcpy(str1,str2);
printf("%d",max(a,b));
把 max(a,b)作為printf函數的一個參數。
obj-c有多重繼承么?不是的話有什么替代方法?
cocoa 中所有的類都是NSObject 的子類,多繼承在這里是用protocol 委托代理來實現的。你不用去考慮繁瑣的多繼承,虛基類的概念。多態特性在 obj-c 中通過委托來實現。
線程與進程的區別和聯系?
進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的并發性。
程和線程的主要差別在于它們是不同的操作系統資源管理方式。進程有獨立的地址空間,一個進程崩潰后,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對于一些要求同時進行并且又要共享某些變量的并發操作,只能用線程,不能用進程。
自動釋放池是什么,如何工作?
當您向一個對象發送一個autorelease消息時,Cocoa就會將該對象的一個引用放入到最新的自動釋放池。它仍然是個正當的對象,因此自動釋放池定義的作用域內的其它對象可以向它發送消息。當程序執行到作用域結束的位置時,自動釋放池就會被釋放,池中的所有對象也就被釋放。
ojc-c 是通過一種"referring counting"(引用計數)的方式來管理內存的, 對象在開始分配內存(alloc)的時候引用計數為一,以后每當碰到有copy,retain的時候引用計數都會加一, 每當碰到release和autorelease的時候引用計數就會減一,如果此對象的計數變為了0, 就會被系統銷毀.
NSAutoreleasePool 就是用來做引用計數的管理工作的,這個東西一般不用你管的.
autorelease和release沒什么區別,只是引用計數減一的時機不同而已,autorelease會在對象的使用真正結束的時候才做引用計數減一。
什么是KVC和KVO?答:KVC(Key-Value-Coding)內部的實現:一個對象在調用setValue的時候,(1)首先根據方法名找到運行方法的時候所需要的環境參數。(2)他會從自己isa指針結合環境參數,找到具體的方法實現的接口。(3)再直接查找得來的具體的方法實現。KVO(Key-Value-Observing):當觀察者為一個對象的屬性進行了注冊,被觀察對象的isa指針被修改的時候,isa指針就會指向一個中間類,而不是真實的類。所以isa指針其實不需要指向實例對象真實的類。所以我們的程序最好不要依賴于isa指針。在調用類的方法的時候,最好要明確對象實例的類名。
kvc 就是一種通過字符串去間接操作對象屬性的機制。
iphone中,自定義協議?
Protocol , 看代理 viewController
協議在oc中主要用在代理中
綁定的概念?
代理的概念?對它怎么理解?
為了模塊之間的松耦合
網絡編程中協議的概念。
NetworkDataDelegate;
3個函數理解 didReceive,
蘋果上架流程?
數據持久化存儲的方式 應用的場景
C語言中講講static變量和static函數有什么作用
static關鍵字有兩種意思,你看上下文來判斷
1,表示變量是靜態存儲變量
表示變量存放在靜態存儲區.
2,表示該變量是內部連接
(這種情況是指該變量不在任何{}之內,就象全局變量那樣,這時候加上static)
,也就是說在其它的.cpp文件中,該變量是不可見的(你不能用).
當static加在函數前面的時候
表示該函數是內部連接,之在本文件中有效,別的文件中不能應用該函數.
不加static的函數默認為是全局的.
也就是說在其他的.cpp中只要申明一下這個函數,就可以使用它.
13.列舉幾種進程的同步機制,并比較其優缺點。答案: 原子操作 信號量機制 自旋鎖 管程,會合,分布式系統
1.進程之間通信的途徑答案:共享存儲系統消息傳遞系統管道:以文件系統為基礎
2.進程死鎖的原因答案:資源競爭及進程推進順序非法
3.死鎖的4個必要條件答案:互斥、請求保持、不可剝奪、環路
4.死鎖的處理答案:鴕鳥策略、預防策略、避免策略、檢測與解除死鎖
14.堆和棧的區別管理方式:對于棧來講,是由編譯器自動管理,無需我們手工控制;對于堆來說,釋放工作由程序員控制,容易產生memory leak。1.申請大小:棧: 在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在 WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩余空間時,將提示 overflow。因此,能從棧獲得的空間較小。
堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由于系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。2.碎片問題:對于堆來講,頻繁的new/delete勢必會造成內存空間的不連續,從而造成大量的碎片,使程序效率降低。對于棧來講,則不會存在這個問題,因為棧是先進后出的隊列,他們是如此的一一對應,以至于永遠都不可能有一個內存塊從棧中間彈出3.分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如局部變量的分配。動態分配由 alloca函數進行分配,但是棧的動態分配和堆是不同的,他的動態分配是由編譯器進行釋放,無需我們手工實現。4.分配效率:棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函數庫提供的,它的機制是很復雜的。 15.什么是鍵-值,鍵路徑是什么模型的性質是通過一個簡單的鍵(通常是個字符串)來指定的。視圖和控制器通過鍵來查找相應的屬性值。
在一個給定的實體中,同一個屬性的所有值具有相同的數據類型。
鍵-值編碼技術用于進行這樣的查找—它是一種間接訪問對象屬性的機制。鍵路徑是一個由用點作分隔符的鍵組成的字符串,用于指定一個連接在一起的對象性質序列。第一個鍵的性質是由先前的性質決定的,接下來每個鍵的值也是相對于其前面的性質。鍵路徑使您可以以獨立于模型實現的方式指定相關對象的性質。通過鍵路徑,您可以指定對象圖中的一個任意深度的路徑,使其指向相關對象的特定屬性。16.c和obj-c如何混用1)obj-c的編譯器處理后綴為m的文件時,可以識別obj-c和c的代碼,處理mm文件可以識別obj-c,c,c++代碼,
但cpp文件必須只能用c/c++代碼,而且cpp文件include的頭文件中,也不能出現obj- c的代碼,因為cpp只是cpp。2) 在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是問題3)在cpp中混用obj- c其實就是使用obj-c編寫的模塊是我們想要的。如果模塊以類實現,那么要按照cpp class的標準寫類的定義,頭文件中不能出現obj-c的東西,包括#import cocoa的。
實現文件中,即類的實現代碼中可以使用obj-c的東西,可以import,只是后綴是mm。如果模塊以函數實現,那么頭文件要按 c的格式聲明函數,實現文件中,c++函數內部可以用obj-c,但后綴還是mm或m。總結:只要cpp文件和cpp include的文件中不包含obj-c的東西就可以用了,cpp混用obj-c的關鍵是使用接口,
而不能直接使用實現代碼,實際上cpp混用的是 obj-c編譯后的o文件,這個東西其實是無差別的,所以可以用。obj-c的編譯器支持cpp.
17.cocoa touch框架iPhone OS 應用程序的基礎 Cocoa Touch 框架重用了許多 Mac 系統的成熟模式,但是它更多地專注于觸摸的接口和優化。
UIKit 為您提供了在 iPhone OS 上實現圖形,事件驅動程序的基本工具,其建立在和 Mac OS X 中一樣的 Foundation 框架上,
包括文件處理,網絡,字符串操作等。 Cocoa Touch 具有和 iPhone 用戶接口一致的特殊設計。有了 UIKit,您可以使用 iPhone OS 上的獨特的圖形接口控件,按鈕,
以及全屏視圖的功能,您還可以使用加速儀和多點觸摸手勢來控制您的應用。各色俱全的框架 除了 UIKit 外,Cocoa Touch 包含了創建世界一流 iPhone 應用程序需要的所有框架,從三維圖形,到專業音效,
甚至提供設備訪問 API 以控制攝像頭,或通過 GPS 獲知當前位置。
Cocoa Touch 既包含只需要幾行代碼就可以完成全部任務的強大的 Objective-C 框架,也在需要時提供基礎的 C 語言 API 來直接訪問系統。這些框架包括:Core Animation:通過 Core Animation,您就可以通過一個基于組合獨立圖層的簡單的編程模型來創建豐富的用戶體驗。Core Audio:Core Audio 是播放,處理和錄制音頻的專業技術,能夠輕松為您的應用程序添加強大的音頻功能。Core Data:提供了一個面向對象的數據管理解決方案,它易于使用和理解,甚至可處理任何應用或大或小的數據模型。功能列表:框架分類下面是 Cocoa Touch 中一小部分可用的框架:音頻和視頻:Core Audio ,OpenAL ,Media Library ,AV Foundation數據管理 :Core Data ,SQLite圖形和動畫 :Core Animation ,OpenGL ES ,Quartz 2D網絡:Bonjour ,WebKit ,BSD Sockets用戶應用:Address Book ,Core Location ,Map Kit ,Store Kit
18.自動釋放池是什么,如何工作 當您向一個對象發送一個autorelease消息時,Cocoa就會將該對象的一個引用放入到最新的自動釋放池。
它仍然是個正當的對象,因此自動釋放池定義的作用域內的其它對象可以向它發送消息。
當程序執行到作用域結束的位置時,自動釋放池就會被釋放,池中的所有對象也就被釋放。1. ojc-c 是通過一種"referring counting"(引用計數)的方式來管理內存的, 對象在開始分配內存(alloc)的時候引用計數為一,
以后每當碰到有copy,retain的時候引用計數都會加一, 每當碰到release和autorelease的時候引用計數就會減一,如果此
對象的計數變為了0, 就會被系統銷毀.2. NSAutoreleasePool 就是用來做引用計數的管理工作的,這個東西一般不用你管的.3. autorelease和release沒什么區別,只是引用計數減一的時機不同而已,autorelease會在對象的使用真正結束的時候才做引用計數減一.
19.objc優點: 1) Cateogies 2) Posing 3) 動態識別 4) 指標計算 5)彈性訊息傳遞 6) 不是一個過度復雜的 C 衍生語言 7) Objective-C 與 C++ 可混合編程 objc缺點: 1) 不支援命名空間 2) 不支持運算符重載 3) 不支持多重繼承 4) 使用動態運行時類型,所有的方法都是函數調用,所以很多編譯時優化方法都用不到。(如內聯函數等),性能低劣。
20.sprintf,strcpy,memcpy使用上有什么要注意的地方 strcpy是一個字符串拷貝的函數,它的函數原型為strcpy(char dst, const char src);將src開始的一段字符串拷貝到dst開始的內存中去,結束的標志符號為 '\0',由于拷貝的長度不是由我們自己控制的,
所以這個字符串拷貝很容易出錯。具備字符串拷貝功能的函數有memcpy,這是一個內存拷貝函數,它的函數原型
為memcpy(char dst, const char src, unsigned int len);將長度為len的一段內存,從src拷貝到dst中去,這個函數的長度可控。但是會有內存疊加的問題。sprintf是格式化函數。將一段數據通過特定的格式,格式化到一個字符串緩沖區中去。sprintf格式化的函數的長度不可控,
有可能格式化后的字符串會超出緩沖區的大小,造成溢出。21. 用變量a給出下面的定義a) 一個整型數(An integer) b)一個指向整型數的指針( A pointer to an integer) c)一個指向指針的的指針,它指向的指針是指向一個整型數( A pointer to a pointer to an intege)r d)一個有10個整型數的數組( An array of 10 integers) e) 一個有10個指針的數組,該指針是指向一個整型數的。(An array of 10 pointers to integers) f) 一個指向有10個整型數數組的指針( A pointer to an array of 10 integers) g) 一個指向函數的指針,該函數有一個整型參數并返回一個整型數(A pointer to a function that takes an integer as an argument and returns an integer) h) 一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數并返回一個整型數( An array of ten pointers to functions that take an integer argument and return an integer ) 答案是: a) int a; // An integer b) int a; // A pointer to an integer c) int *a; // A pointer to a pointer to an integer d) int a[10]; // An array of 10 integers e) int a[10]; // An array of 10 pointers to integers f) int (a)[10]; // A pointer to an array of 10 integers g) int (a)(int); // A pointer to a function a that takes an integer argument and returns an integer h) int (a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer
22.readwrite,readonly,assign,retain,copy,nonatomic 屬性的作用@property是一個屬性訪問聲明,擴號內支持以下幾個屬性:1,getter=getterName,setter=setterName,設置setter與 getter的方法名2,readwrite,readonly,設置可供訪問級別2,assign,setter方法直接賦值,不進行任何retain操作,為了解決原類型與環循引用問題3,retain,setter方法對參數進行release舊值再retain新值,所有實現都是這個順序(CC上有相關資料)4,copy,setter方法進行Copy操作,與retain處理流程一樣,先舊值release,再 Copy出新的對象,retainCount為1。
這是為了減少對上下文的依賴而引入的機制。5,nonatomic,非原子性訪問,不加同步,多線程并發訪問會提高性能。注意,如果不加此屬性,則默認是兩個訪問方法
都為原子型事務訪問。鎖被加到所屬對象實例級(我是這么理解的...)。
23.http和scoket通信的區別。
http是客戶端用http協議進行請求,發送請求時候需要封裝http請求頭,并綁定請求的數據,服務器一般有web服務器配合(當然也非絕 對)。 http請求方式為客戶端主動發起請求,服務器才能給響應,一次請求完畢后則斷開連接,以節省資源。服務器不能主動給客戶端響應(除非采取http長連接 技術)。iphone主要使用類是NSUrlConnection。
scoket是客戶端跟服務器直接使用socket“套接字”進行連接,并沒有規定連接后斷開,所以客戶端和服務器可以保持連接通道,雙方 都可以主動發送數據。一般在游戲開發或股票開發這種要求即時性很強并且保持發送數據量比較大的場合使用。主要使用類是CFSocketRef。
TCP全稱是Transmission Control Protocol,中文名為傳輸控制協議,它可以提供可靠的、面向連接的網絡數據傳遞服務。傳輸控制協議主要包含下列任務和功能: 確保IP數據報的成功傳遞。 對程序發送的大塊數據進行分段和重組。 確保正確排序及按順序傳遞分段的數據。 通過計算校驗和,進行傳輸數據的完整性檢查。
6、TCP和UDP的區別 TCP提供的是面向連接的、可靠的數據流傳輸,而UDP提供的是非面向連接的、不可靠的數據流傳輸。 簡單的說,TCP注重數據安全,而UDP數據傳輸快點,但安全性一般
24.mvc設計模式是什么? 你還熟悉什么設計模式?設計模式:并不是一種新技術,而是一種編碼經驗,使用比如java中的接口,iphone中的協議,繼承關系等基本手段,
用比較成熟的邏輯去處理某一種類型的事情,總結為所謂設計模式。面向對象編程中,java已經歸納了23中設計模式。mvc設計模式 ,模型,視圖,控制器,可以將整個應用程序在思想上分成三大塊,對應是的數據的存儲或處理,前臺的顯示,
業務邏輯的控制。 Iphone本身的設計思想就是遵循mvc設計模式。其不屬于23中設計模式范疇。代理模式:代理模式給某一個對象提供一個代理對象,并由代理對象控制對源對象的引用.比如一個工廠生產了產品,
并不想直接賣給用戶,而是搞了很多代理商,用戶可以直接找代理商買東西,代理商從工廠進貨.常見的如QQ的自動回復就屬于代理攔截,代理模式在iphone中得到廣泛應用.單例模式:說白了就是一個類不通過alloc方式創建對象,而是用一個靜態方法返回這個類的對象。系統只需要擁有一個的全局對象,
這樣有利于我們協調系統整體的行為,比如想獲得[UIApplication sharedApplication];任何地方調用都可以得到 UIApplication的對象,
這個對象是全局唯一的。觀察者模式: 當一個物體發生變化時,會通知所有觀察這個物體的觀察者讓其做出反應。實現起來無非就是把所有觀察者的對象給這個物體,
當這個物體的發生改變,就會調用遍歷所有觀察者的對象調用觀察者的方法從而達到通知觀察者的目的。工廠模式:
public class Factory{  public static Sample creator(int which){   if (which==1) return new SampleA();  else if (which==2) return new SampleB(); } }25.你了解svn,cvs等版本控制工具么?版本控制 svn,cvs 是兩種版控制的器,需要配套相關的svn,cvs服務器。scm是xcode里配置版本控制的地方。版本控制的原理就是a和b同時開發一個項目,a寫完當天的代碼之后把代碼提交給服務器,
b要做的時候先從服務器得到最新版本,就可以接著做。 如果a和b都要提交給服務器,并且同時修改了同一個方法,就會產生代碼沖突,
如果a先提交,那么b提交時,服務器可以提示沖突的代碼,b可以清晰的看到,并做出相應的修改或融合后再提交到服務器。
26.什么是push(了解一下)。
客戶端程序留下后門端口,客戶端總是監聽針對這個后門的請求,于是 服務器可以主動像這個端口推送消息。
27.靜態鏈接庫(了解一下)
(此為.a文件,相當于java里的jar包,把一些類編譯到一個包中,在不同的工程中如果導入此文件就可以使用里面的類,
具體使用依然是#import “ xx.h”)。
28.fmmpeg框架(了解一下)
(音視頻編解碼框架,內部使用UDP協議針對流媒體開發,內部開辟了六個端口來接受流媒體數據,完成快速接受之目的).
29.fmdb框架(了解一下)
(數據庫框架,對sqllite的數據操作進行了封裝,使用著可把精力都放在sql語句上面)。
30.320框架(了解一下)
(ui框架,導入320工程作為框架包如同添加一個普通框架一樣)。
cover(open) flower框架 (2d 仿射技術),內部核心類是CATransform3D.
31.什么是沙箱模型?哪些操作是屬于私有api范疇?
某個iphone工程進行文件操作有此工程對應的指定的位置,不能逾越。iphone沙箱模型的有四個文件夾,分別是什么,永久數據存儲一般放在什么位置,得到模擬器的路徑的簡單方式是什么.
documents,tmp,app,Library。
(NSHomeDirectory()),
手動保存的文件在documents文件里
Nsuserdefaults保存的文件在tmp文件夾里
Documents 目錄:您應該將所有de應用程序數據文件寫入到這個目錄下。這個目錄用于存儲用戶數據或其它應該定期備份的信息。
AppName.app 目錄:這是應用程序的程序包目錄,包含應用程序的本身。由于應用程序必須經過簽名,
所以您在運行時不能對這個目錄中的內容進行修改,否則可能會使應用程序無法啟動。
Library 目錄:這個目錄下有兩個子目錄:Caches 和 Preferences
Preferences 目錄包含應用程序的偏好設置文件。您不應該直接創建偏好設置文件,而是應該使用NSUserDefaults類來取得和設置應用程序的偏好.
Caches 目錄用于存放應用程序專用的支持文件,保存應用程序再次啟動過程中需要的信息。

tmp 目錄:這個目錄用于存放臨時文件,保存應用程序再次啟動過程中不需要的信息。
獲取這些目錄路徑的方法:
1,獲取家目錄路徑的函數:
NSString homeDir = NSHomeDirectory();
2,獲取Documents目錄路徑的方法:
NSArray paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString docDir = [paths objectAtIndex:0];
3,獲取Caches目錄路徑的方法:
NSArray paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString cachesDir = [paths objectAtIndex:0];
4,獲取tmp目錄路徑的方法:
NSString tmpDir = NSTemporaryDirectory();
5,獲取應用程序程序包中資源文件路徑的方法:
例如獲取程序包中一個圖片資源(apple.png)路徑的方法:
NSString imagePath = [[NSBundle mainBundle] pathForResource:@”apple” ofType:@”png”];
UIImage appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];
代碼中的mainBundle類方法用于返回一個代表應用程序包的對象。

文件IO寫入
1,將數據寫到Documents目錄:

  • (BOOL)writeApplicationData:(NSData )data toFile:(NSString )fileName {

NSArray paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString docDir = [paths objectAtIndex:0];
if (!docDir) {
NSLog(@”Documents directory not found!”); return NO;
}
NSString filePath = [docDir stringByAppendingPathComponent:fileName];
return [data writeToFile:filePath atomically:YES];
}

2,從Documents目錄讀取數據:

  • (NSData )applicationDataFromFile:(NSString )fileName {
    NSArray paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString docDir = [paths objectAtIndex:0];
    NSString filePath = [docDir stringByAppendingPathComponent:fileName];
    NSData data = [[[NSData alloc] initWithContentsOfFile:filePath] autorelease];
    return data;
    }
    NSSearchPathForDirectoriesInDomains這個主要就是返回一個絕對路徑用來存放我們需要儲存的文件。

  • (NSString )dataFilePath {

NSArray paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString documentsDirectory = [paths objectAtIndex:0];
return [documentsDirectory stringByAppendingPathComponent:@"shoppingCar.plist"];
}

NSFileManager fm=[NSFileManager defaultManager];
if(![fm fileExistsAtPath:[self dataFilePath]]){

//下面是對該文件進行制定路徑的保存
[fm createDirectoryAtPath:[self dataFilePath] withIntermediateDirectories:YES attributes:nil error:nil];

//取得一個目錄下得所有文件名
NSArray files = [fm subpathsAtPath: [self dataFilePath] ];

//讀取某個文件
NSData data = [fm contentsAtPath:[self dataFilePath]];

//或者
NSData data = [NSData dataWithContentOfPath:[self dataFilePath]];
}
iphone常見私有api的應用(比如直接發送短信,訪問沙箱之外的磁盤文件).32.你在開發項目中時,用到了哪些數據存儲方式,iphone中常見的方式有哪些,各有什么區別?
數據存儲五種形式的應用范圍和性能區別
(core data, sqllite,對象序列化,文件直接讀寫,NSUserDefault(保存數據到temp文件夾中))文件直接讀寫 >core data> 對象序列化> sqllite>NSUserDefault.
33.線程的常見方法有哪些,你是如何處理多線程的,多線程同步問題你了解么?線程創建的幾種方式,線程的加鎖,休眠,喚醒,解鎖,退出,
多線程要考慮同步問題,解決同步問題的方式就是對某一資源加鎖,當一個線程操作本資源時,其他線程不能操作 。 系統自帶線程池(NSOpertionQueue)的作用:
凡是需要啟動多個線程的地方都可以使用NSOpertionQueue,加入到NSOpertionQueue中的對象都需要繼承NSOpertion。 NSOpertionQueue會在系統內部啟動一個獨立線程去執行這個被加入對象的main方法。
常用的地方是用nsoprationqueue 下載圖片,文件。如果是自己創建一個線程池,無非就是啟動多個線程的時候,
把這些線程對象放到一個大數組中,如果需要啟動線程的時候,先從數組中找空閑線程來使用。
自己管理線程池最大的難題是不好處理當啟動多個線程后,用戶在多個界面的跳轉的時候,對線程方法的回調管理。
而NSOpertionQueue可以很好的處理他。
34.init和initwithobject區別(語法)?
init創建的對象不帶自動釋放
35.你連接服務器用的是什么方法,如果請求過程中,網絡出了問題這么辦?NSUrlConnection 連接后,有一系列委托方法來接受來自服務器的響應和數據,
其中接受相應的方法回得到服務器要傳回的數據有多大,接受數據的方法會反復調用來不斷接受服務器數據,
如果網絡出了問題了,會調用一個方法讓你來做相關處理。
36.你使用過json解析方式么,他們的底層是如何處理的你了解么?
json解析的用法,用框架的用法簡單介紹:
底層原理遍歷字符串中的字符,最終根據格式規定的特殊字符,比如{}號,[]號, : 號 等進行區分, {}號是一個字典的開始,[]號是一個數組的開始, : 號是字典的鍵和值的分水嶺,最終乃是將json數據轉化為字典,
字典中值可能是字典,數組,或字符串而已。
37.xml解析的原理是什么,你還用過其他解析方式么?NSXMLParser, 其他解析方式有自定義二進制解析,就是按字節去解析,電話會談就是如此,
還可以是字符串之間用特殊符號連接的數據,將此數據用特殊符號可以分割成所用數據。
38.協議是什么,有什么作用.?
協議很像java中的接口,某個類實現協議后,就必須實現協議中規定的@require的方法,比如一個類A, 一個類B都實現某“協議”后,
這個類A的對象和B的對象都可以賦值給這個協議的類型變量,比如 id<協議> 變量名 = A類或B類的對象,
于是這個變量就完成了能夠指向多個不同的類的對象并調用對象中的實現協議的方法。39.類別有什么作用?類別的使用 。 類別有三大作用,
可以使本來需要在.h中聲明的方法放到.m文件中聲明,達到了可以使方法不對外公開。
可以方便的擴展類,甚至系統類都可以輕易擴展,維護了代碼原本的結構不受影響。
類別可以寫到不同的.h或.m文件中,可以分散代碼到跟類別的擴展功能想關聯的地方,方便查看。40.分線程回調主線程方法是什么,有什么作用?[self performSelectorOnMainThread:@selector(buttonGo2) withObject:nil waitUntilDone:YES];[self performSelector:@selector(buttonGo2) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES];需要即時刷新ui控件的時候,經常使用。41.iphone閱讀器,如果要讀取一個文本文件,請問你是如何處理編碼問題的?另外像pdf格式的文件,你如何讀取。?
iphone手機閱讀器中對于PDF格式的閱讀,可以直接用UIWebView控件顯示,也可以從網上下到很多直接讀取pdf格式的代碼
直接從pdf中得到數據。復雜表格動畫- (void)insertRowsAtIndexPaths:(NSArray )indexPaths withRowAnimation:(UITableViewRowAnimation)animation; -(void)deleteRowsAtIndexPaths:(NSArray )indexPaths withRowAnimation:(UITableViewRowAnimation)animation;- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
42.你在開發大型項目的時候,如何進行內存泄露檢測的? 可以通過xcode的自帶工具run---start with performance tool里有instruments下有個leaks工具,
啟動此工具后,運行項目,工具里可以顯示內存泄露的情況,雙擊可找到源碼位置,可以幫助進行內存泄露的處理。
43.你做iphone開發時候,有哪些傳值方式,view和view之間是如何傳值的?
壓棧。
44.讓一個物體從界面中的一點運動到另外一點,有哪些方法?四種方式:1. beginAnimation
2. 線程
3. NSTimer
4. 圖層動畫(路徑)
45.你了解哪些加密方式? Base64, MD5, 循環右移位等.
46.地圖定位
CLLocationManager位置管理器 使用Core Location框架來確定iphone的位置(GPS,蜂窩基站三角網,wps三種方式)
MKMapView提供了一套可植入的地圖接口,可以讓我們在應用中展示地圖,并對其進行相關的操作。一般來說,我們可以指定一個展示區域,放一些標記在上面,還可以加蓋一些層在上面。
MKMapView依賴Google map里面相關服務(如Google Earth API等),所以地圖的左下角會有Google字樣。
47.打開url
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://8004664411"]];mailto:// sms://
http網絡通信
ASIHTTPRequest 是一個直接在CFNetwork上做的開源項目:提供直接提交(HTTP POST)文件的API,異步請求與隊列,自動管理上傳與下載隊列管理機,ASIFormDataRequest用于適合上傳文件,圖片數據。
圖片瀏覽
UIImagePickerController可以從相冊,相機,膠卷里獲得圖片。
對像序列化
NSCoding encodeWithCoder initWithCoder
NSKeyedUnarchiver NSKeyedArchiver
各種picker
UIDatePicker UIPickerView
電影播放
MPMoviePlayerController
音樂播放
MPMusicPlayerController
53.線程 ?
a. 線程的創建和使用規則?
答:NSThread
三種方法
(id)init; // designated initializer
(id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;
(void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument
(void)start;
b. 主分線程
答:啟動分線程,上面已提到!加到主線程方法performSelector!
//加到主線程addData()是主線程的方法!只有加到主線程后,才能調用主線程的方法
[target performSelector:@selector(addData:) onThread:[NSThread mainThread] withObject:item waitUntilDone:YES];
//[target addData:item];//沒有加到主線程后,調用主線程的方法!一定會崩!

c.線程鎖
答:NSCondition
方法:
[thread lock];//加鎖
sleep(n);//線程休眠
[thread singnal];//相當于通知,線程啟動
[thread unlock];//解鎖
[thread exit];//線程退出
54.各種 排序算法?
希爾排序、快速排序、冒泡排序、
55.通信底層原理
答:OSI七層模型
7 應用層: ftp,smtp,http,telnet,tftp(通過各種協議,最終還是包裝成TCP數據包,發送到網絡中!)
6 表現層:
5 會話層:
4 傳輸層: tcp udp
3 網絡層: ip,ICMP,IGRP,EIGRP,OSPF,ARP
2 數據鏈路層: STP,VT
1 物理層:
為什么很多內置類如UITableViewController的delegate屬性都是assign而不是retain的?
答:
會引起循環引用
所有的引用計數系統,都存在循環應用的問題。例如下面的引用關系:

  • 對象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兩端產生不必要的循環引用。
    如果一個UITableViewController 對象a通過retain獲取了UITableView對象b的所有權,這個UITableView對象b的delegate又是a,
    如果這個delegate是retain方式的,那基本上就沒有機會釋放這兩個對象了。自己在設計使用delegate模式時,也要注意這點。
    以下每行代碼執行后,person對象的retain count分別是多少?
    Person person = [[Person alloc] init]; count 1
    [person retain]; retain count 2
    [person release];retain count 1
    [person release];retain count = 0
    58.在一個對象的方法里面:
    self.name = “object”;

    name =”object”
    有什么不同嗎?
    答:self.name = "object"會調用對象的setName()方法,會使object引用計數加1,name = "object"會直接把object賦值給當前對象的name 屬性,引用計數不增加。
    59.readwrite,readonly,assign,retain,copy,nonatomic屬性的作用?
    @property是一個屬性訪問聲明,擴號內支持以下幾個屬性:1,getter=getterName,setter=setterName,設置setter與getter的方法名2,readwrite,readonly,設置可供訪問級別
    3,assign,setter方法直接賦值,不進行任何retain操作,為了解決原類型與環循引用問題4,retain,setter方法對參數進行release舊值再retain新值,所有實現都是這個順序(CC上有相關資料)
    5,copy,setter方法進行Copy操作,與retain處理流程一樣,先舊值release,再Copy出新的對象,retainCount為1。這是為了減少對上下文的依賴而引入的機制。
    6,nonatomic,非原子性訪問,不加同步,多線程并發訪問會提高性能。注意,如果不加此屬性,則默認是兩個訪問方法都為原子型事務訪問。鎖被加到所屬對象實例級(我是這么理解的…)。
    7,@synthesize xxx; 來實現實際代碼
    60.1.main()
    {
    int a[5]={1,2,3,4,5};
    int ptr=(int )(&a+1);
    printf("%d,%d",(a+1),(ptr-1));
    }
    答:2,5
    (a+1)就是a[1],(ptr-1)就是a[4],執行結果是2,5
      &a+1不是首地址+1,系統會認為加一個a數組的偏移,是偏移了一個數組的大小(本例是5個int)
      int ptr=(int )(&a+1);
      則ptr實際是&(a[5]),也就是a+5
    原因如下:
      &a是數組指針,其類型為 int ()[5];
      而指針加1要根據指針類型加上一定的值,不同類型的指針+1之后增加的大小不同。
      a是長度為5的int數組指針,所以要加 5sizeof(int)
      所以ptr實際是a[5]
      但是prt與(&a+1)類型是不一樣的(這點很重要)
      所以prt-1只會減去sizeof(int
    )
      a,&a的地址是一樣的,但意思不一樣
    a是數組首地址,也就是a[0]的地址,&a是對象(數組)首地址,
    a+1是數組下一元素的地址,即a[1],&a+1是下一個對象的地址,即a[5].

文/孫國慶(簡書作者)
原文鏈接:http://www.lxweimin.com/p/c6062811f32a
著作權歸作者所有,轉載請聯系作者獲得授權,并標注“簡書作者”。

C:
C語言中,內存中的棧是什么?如果我要創建一個大數組,應該如何創建?
鏈表和數組的區別
如何根據函數參數動態創建一個數組,并將數組中的元素全部設為0?
野指針是什么,如何避免

OC:
屬性中copy這個關鍵字
KVO用過嗎,什么時候用,如何手動觸發KVO
類目和繼承有哪些區別,它們在重寫一個方法的時候有怎樣的區別
同時重寫一個屬性的getter和setter會有怎樣的問題?

OC高級
解釋一下GCD中的同步和異步有什么區別?
說一個你遇到過的內存泄漏的例子,你是如何發現并解決的?
如何用GCD實現:5個任務并行執行,然后在5個都結束的時候執行一個新的任務
說一下MVVM的工作原理,它解決了什么問題?
autorelease什么時候釋放的

runtime:
如何為類目添加屬性
isKindOfClass和isMemberOfClass有什么區別?
解釋一下isa指針和IMP指針
什么是method swizzling,用它來解決什么問題

runloop:
以+ scheduledTimerWithTimeInterval...的方式觸發的timer,在滑動頁面上的列表時,timer會暫定回調,為什么?如何解決?

UI:
addChildViewController用過嗎,一般什么時候會用?需要注意哪些問題?
viewDidLoad什么時候調用?
UIScrollView的contentOffset可不可以停在超出contentSize大小限制的地方?
bounds和frame的區別
響應者鏈是什么東西?如何工作的?如何處理手勢沖突?

動畫和繪圖:
CALayer和持有它的那個UIView之間是怎樣的關系?
modelLayer和presentationLayer是如何工作的?
使用動畫移動一個UIButton,在動畫的過程中,這個Button可以被點擊嗎?如果要實現Button在動畫的過程中可以隨時被點擊,應該怎樣實現?
CADisplayLink有什么用?它和NSTimer在Runloop中的表現有無區別?有什么區別?
UITableView的優化

數據持久化:
沙盒中的三個文件夾分別是什么,分別用來存放什么東西,分別說明一下里面的數據在:1、應用退出;2、iPhone重啟;3、應用更新 以后會出現怎樣的變化
如果你要保存類似QQ會話列表和聊天記錄的信息,你準備使用哪種數據持久化方式?簡要說明一下原因和如何實現

網絡:
簡要描述一下TCP和UDP的區別
TCP的三次握手是怎樣進行的
為什么我們的網絡請求基本上使用HTTP而不用TCP

其他:
簡要描述一下即時通信的原理
SD的圖片緩存機制是如何實現的
APNs推送流程和原理

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,211評論 30 472
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 2,014評論 0 7
  • 多線程、特別是NSOperation 和 GCD 的內部原理。運行時機制的原理和運用場景。SDWebImage的原...
    LZM輪回閱讀 2,039評論 0 12
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,434評論 0 35
  • 本來是想去看《健忘村》的,但因為拍片太少,唯一的一場看完就到凌晨,最后看了一部不需要等太久的電影《功夫瑜伽》...
    弋子尤閱讀 3,553評論 1 0