循環(huán)引用:
http://ios.jobbole.com/82077/
類(lèi)別的作用
功能:
1.擴(kuò)充現(xiàn)有類(lèi)的功能
2.對(duì)現(xiàn)有類(lèi)進(jìn)行模塊化的設(shè)計(jì)
3.聲明非正式的協(xié)議
4.匿名分類(lèi)(@interface 類(lèi)名 () @end),一般在依賴(lài)類(lèi)的.m文件的最上面生成匿名分類(lèi),專(zhuān)門(mén)用來(lái)聲明私有的屬性和方法
5.調(diào)用私有方法
延展的功能
為自己添加私有的方法,可以不用創(chuàng)建文件,直接在m文件中申明,但是必須實(shí)現(xiàn),即使創(chuàng)建文件也只有h文件
類(lèi)別與延展的關(guān)系
1.延展是匿名的類(lèi)別
2.延展添加的是私有方法,延展的方法必須在對(duì)應(yīng)的m文件中實(shí)現(xiàn),而類(lèi)別不用
3.延展可以添加屬性,分類(lèi)不行
類(lèi)別使用注意:
1.類(lèi)別可以訪問(wèn)原始類(lèi)的實(shí)例變量,但是不能添加實(shí)例變量,如果想添加只有通過(guò)繼承創(chuàng)建子類(lèi)來(lái)實(shí)現(xiàn)。
2.類(lèi)別可以重載原始類(lèi)方法,這樣會(huì)覆蓋原始類(lèi)的方法,不推薦使用,即使要實(shí)現(xiàn),可以通過(guò)繼承創(chuàng)建子類(lèi)實(shí)現(xiàn)
3.類(lèi)別的方法,只要你不掉用他,可以不用實(shí)現(xiàn)
什么是延遲加載(懶加載)?
懶加載即重寫(xiě)get方法,此方法多用于已有的數(shù)據(jù)加載方法,加載數(shù)據(jù)后賦值給數(shù)組.
char const p
如果const位于的左側(cè),則const就是用來(lái)修飾指針?biāo)赶虻淖兞?,即指針指向?yàn)槌A浚?br>
如果const位于*的右側(cè),const就是修飾指針本身,即指針本身是常量。
數(shù)據(jù)的持久性存儲(chǔ)
1.屬性列表 主要涉及到NSUserDefaults 用于存儲(chǔ)配置信息
2.對(duì)象歸檔 使用基本對(duì)象類(lèi)型定制個(gè)性化緩存
3數(shù)據(jù)庫(kù)存儲(chǔ)(SQLite) 用于存儲(chǔ)查詢(xún)需求較多的數(shù)據(jù)
4Core Data 。 用于規(guī)劃應(yīng)用中的對(duì)象
數(shù)據(jù)請(qǐng)求方法:
NSURLConnection 系統(tǒng)的,常用的方式
NSURLSession 系統(tǒng)的,ios7.0之后出現(xiàn)的,使用了Block,提高了效率
ASIHttpRequest 第三方的,原來(lái)經(jīng)常使用的數(shù)據(jù)請(qǐng)求庫(kù),缺點(diǎn):環(huán)境是mrc,要進(jìn)行ARC與MRC之間的轉(zhuǎn)化,沒(méi)有使用block
AFNetworking 第三方的,現(xiàn)在被經(jīng)常使用,內(nèi)部集成了NSURLConnection和NSURLSession,環(huán)境是ARC,使用了Block,提高了效率,不用系統(tǒng)庫(kù)的支撐
程序的生命周期
application didFinishLaunchingWithOptions:開(kāi)始
applicationWillResignActive:變成不活躍
applicationDidEnterBackground:進(jìn)入后臺(tái)
applicationWillEnterForeground:進(jìn)入前臺(tái)
applicationDidBecomeActive:變成活躍
applicationWillTerminate:即將關(guān)閉
視圖控制器的生命周期
1.initWithNibName: //初始化方法(一次初始化) 通常用xib創(chuàng)建對(duì)象時(shí)進(jìn)行的初始化工作放在這里
2.init //初始化方法(一次初始化方法) 通常用純代碼創(chuàng)建對(duì)象的時(shí)候調(diào)用
loadView //加載視圖(初始化方法)
viewDidLoad //二次初始化方法(純代碼,xib創(chuàng)建對(duì)象都要調(diào)用)
viewWillAppear:(BOOL)animated //視圖將要出現(xiàn)
viewDidAppear:(BOOL)animated //視圖已經(jīng)出現(xiàn)
viewWillDisappear:(BOOL)animated//視圖將要消失
viewDidDisappear:(BOOL)animated //視圖已經(jīng)消失
堆和棧的區(qū)別:
一、堆棧空間分配區(qū)別:
1、棧(操作系統(tǒng)):由操作系統(tǒng)自動(dòng)分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類(lèi)似于數(shù)據(jù)結(jié)構(gòu)中的棧;
2、堆(操作系統(tǒng)): 一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時(shí)可能由OS回收,分配方式倒是類(lèi)似于鏈表。
二、堆棧緩存方式區(qū)別:
1、棧使用的是一級(jí)緩存, 他們通常都是被調(diào)用時(shí)處于存儲(chǔ)空間中,調(diào)用完畢立即釋放;
2、堆是存放在二級(jí)緩存中,生命周期由虛擬機(jī)的垃圾回收算法來(lái)決定(并不是一旦成為孤兒對(duì)象就能被回收)。所以調(diào)用這些對(duì)象的速度要相對(duì)來(lái)得低一些。
三、堆棧數(shù)據(jù)結(jié)構(gòu)區(qū)別:
堆(數(shù)據(jù)結(jié)構(gòu)):堆可以被看成是一棵樹(shù),如:堆排序;
棧(數(shù)據(jù)結(jié)構(gòu)):一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)。
1.static靜態(tài)變量的作用
答:1.表示全局靜態(tài),用來(lái)修飾成員變量和成員方法
2.被修飾的變量和方法獨(dú)立于該類(lèi)的任何對(duì)象,即它不依賴(lài)類(lèi)特定實(shí)例,被類(lèi)的所有實(shí)例共享
3.靜態(tài)方法可以直接通過(guò)類(lèi)名調(diào)用,任何實(shí)例也可調(diào)用。
4.靜態(tài)變量可以不進(jìn)行外置聲明,直接調(diào)用,使用靜態(tài)方法,不用實(shí)例化,創(chuàng)建類(lèi)的對(duì)象,使方法調(diào)用方便,節(jié)省空間
5.static成員是不能被其所在class創(chuàng)建的實(shí)例訪問(wèn)的,其默認(rèn)值是0,只要執(zhí)行一次,運(yùn)行時(shí)開(kāi)辟全局內(nèi)存空間,存儲(chǔ)上一次數(shù)據(jù),便于下次調(diào)用,對(duì)于實(shí)例變量,沒(méi)創(chuàng)建一個(gè)實(shí)例,就會(huì)為實(shí)例變量分配一次內(nèi)存,實(shí)例變量可以在內(nèi)存中有多個(gè)拷貝,互不影響(靈活)。
2.get和post使用時(shí)的區(qū)別
答:1.get是從服務(wù)器上去獲取數(shù)據(jù),post是向服務(wù)器傳輸數(shù)據(jù)(一般是用于圖片的傳輸)
2.. get是把參數(shù)數(shù)據(jù)隊(duì)列加到提交表單的ACTION屬性所指的URL中,值和表單內(nèi)各個(gè)字段一一對(duì)應(yīng),在URL中可以看到。post是通過(guò)HTTP post機(jī)制,將表單內(nèi)各個(gè)字段與其內(nèi)容放置在HTML HEADER內(nèi)一起傳送到ACTION屬性所指的URL地址。用戶(hù)看不到這個(gè)過(guò)程。
對(duì)于get方式,服務(wù)器端用Request.QueryString獲取變量的值,對(duì)于post方式,服務(wù)器端用Request.Form獲取提交的數(shù)據(jù)。
get傳送的數(shù)據(jù)量較小。post傳送的數(shù)據(jù)量較大,一般被默認(rèn)為不受限制。
get安全性非常低,post安全性較高。但是執(zhí)行效率卻比Post方法好。
建議:
1、get方式的安全性較Post方式要差些,包含機(jī)密信息的話,建議用Post數(shù)據(jù)提交方式;
2、在做數(shù)據(jù)查詢(xún)時(shí),建議用Get方式;而在做數(shù)據(jù)添加、修改或刪除時(shí),建議用Post方式;
3.@class和#import的區(qū)別
1.#import包含被引用類(lèi)所有的信息,被引用類(lèi)的變量和方法;@class是前向聲明,只是告訴編譯器在某一個(gè)類(lèi)的.h文件中聲明另一個(gè)類(lèi),沒(méi)有聲明具體信息。
2.使用@class只需要被引用類(lèi)的名稱(chēng),在.m文件使用#import來(lái)包含被引用類(lèi)的頭文件,因?yàn)閷?shí)現(xiàn)類(lèi)時(shí)需要用到被引用類(lèi)的實(shí)體變量和方法。
bundle(沙盒):一個(gè)應(yīng)用只能在自己的沙盒中讀取或存儲(chǔ)文件,而不能操作其他沙盒中的文件。好處:保護(hù)應(yīng)用的隱私不受侵犯,保護(hù)系統(tǒng)文件的安排,應(yīng)用刪除后相關(guān)文件也能被全部清除。
每個(gè)應(yīng)用都有自己的沙盒,沙盒的根目錄的獲取方法是NSHomeDirectory()。
根目錄下的內(nèi)容:
-.app文件,實(shí)際上是一個(gè)文件夾,包含了可執(zhí)行文件、Nib文件、圖片資源、plist等。XCode中能看到的資源,及編譯后的可執(zhí)行文件,都封裝在app中。
-Documents文件夾,用于存放你的應(yīng)用所產(chǎn)生的數(shù)據(jù),該文件夾可通過(guò)iTunes備份,可以存儲(chǔ)游戲進(jìn)度等。
-Library文件夾,用于存放用戶(hù)偏好和臨時(shí)文件。
-tmp文件夾是系統(tǒng)的中轉(zhuǎn)站。
自動(dòng)釋放池是什么,如何工作
當(dāng)您向一個(gè)對(duì)象發(fā)送一個(gè)autorelease 消息時(shí),Cocoa就會(huì)將該對(duì)象的一個(gè)引用放入到最新的自動(dòng)釋放池。它仍然是個(gè)正當(dāng)?shù)膶?duì)象,因此自動(dòng)釋放池定義的作用域內(nèi)的其它對(duì)象可以向它發(fā)送消息。當(dāng) 程序執(zhí)行到作用域結(jié)束的位置時(shí),自動(dòng)釋放池就會(huì)被釋放,池中的所有對(duì)象也就被釋放。
ojc-c 是 通過(guò)一種"referring counting"(引用計(jì)數(shù))的方式來(lái)管理內(nèi)存的, 對(duì)象在開(kāi)始分配內(nèi)存(alloc)的時(shí)候引用計(jì)數(shù)為一,以后每當(dāng)碰到有copy,retain的時(shí)候引用計(jì)數(shù)都會(huì)加一, 每當(dāng)碰到release和autorelease的時(shí)候引用計(jì)數(shù)就會(huì)減一,如果此對(duì)象的計(jì)數(shù)變?yōu)榱?, 就會(huì)被系統(tǒng)銷(xiāo)毀.
NSAutoreleasePool 就是用來(lái)做引用計(jì)數(shù)的管理工作的,這個(gè)東西一般不用你管的. 3. autorelease和release沒(méi)什么區(qū)別,只是引用計(jì)數(shù)減一的時(shí)機(jī)不同而已,autorelease會(huì)在對(duì)象的使用真正結(jié)束的時(shí)候才做引用計(jì)數(shù)減一.
obj-c的優(yōu)缺點(diǎn)
objc優(yōu)點(diǎn): 1) Cateogies 2) Posing 3) 動(dòng)態(tài)識(shí)別 4) 5)彈性消息傳遞 6) 不是一個(gè)過(guò)度復(fù)雜的 C 衍生語(yǔ)言 7) Objective-C 與 C++ 可混合編程 缺點(diǎn): 1) 不支持命名空間 2) 不支持運(yùn)算符重載
3) 不支持多重繼承
4) 使用動(dòng)態(tài)運(yùn)行時(shí)類(lèi)型,所有的方法都是函數(shù)調(diào)用,所以很多編譯時(shí)優(yōu)化方法都用不到。(如內(nèi)聯(lián)函數(shù)等),性能低劣。
readwrite,readonly,assign,retain,copy,nonatomic屬性的作用
@property是一個(gè)屬性訪問(wèn)聲明,擴(kuò)號(hào)內(nèi)支持以下幾個(gè)屬性: 1,getter=getterName,setter=setterName,設(shè)置setter與getter的方法名 2,readwrite,readonly,設(shè)置可供訪問(wèn)級(jí)別 2,assign,setter方法直接賦值,不進(jìn)行任何retain操作,為了解決原類(lèi)型與環(huán)循引用問(wèn)題 3,retain,setter方法對(duì)參數(shù)進(jìn)行release舊值再retain新值,所有實(shí)現(xiàn)都是這個(gè)順序(CC上有相關(guān)資料) 4,copy,setter方法進(jìn)行Copy操作,與retain處理流程一樣,先舊值release,再Copy出新的對(duì)象,retainCount為1。這是為了減少對(duì)上下文的依賴(lài)而引入的機(jī)制。 5,nonatomic,非原子性訪問(wèn),不加同步,多線程并發(fā)訪問(wèn)會(huì)提高性能。注意,如果不加此屬性,則默認(rèn)是兩個(gè)訪問(wèn)方法都為原子型事務(wù)訪問(wèn)。鎖被加到所屬對(duì)象實(shí)例級(jí)。
1。assign和retain,copy的區(qū)別
assign就是和普通語(yǔ)言的賦值一樣
retain 在一個(gè)對(duì)象中保存該對(duì)象需要擁有的對(duì)象
對(duì)該對(duì)象進(jìn)行應(yīng)用計(jì)數(shù)+1
@property (retain) 為了寫(xiě)程序方便
copy主要是賦值
一般 代理的申明都是assign 為什么
原因有2個(gè),
1 根本就沒(méi)有必要把代理的計(jì)數(shù)器+1
主要是為了避免引用技術(shù)嵌套,遞歸
2。如何持久保存數(shù)據(jù)
NSUserDefaults, Plist, SQLite3, file
3。網(wǎng)絡(luò)方面得 比如如何檢測(cè)聯(lián)網(wǎng) http xml等
ASIHTTPRequest Reacheable.[hm]
原理是ifconfig 是不是有ip地址
Reachability
來(lái)判斷是否有網(wǎng)絡(luò)3G Wifi
4。類(lèi)之間得繼承關(guān)系 比如UIview得父類(lèi)是哪一個(gè)等等?
UIResponder,處理觸摸,
touchBegin, touchEnd, nextResponder
5。異常處理
都是自己判斷 錯(cuò)誤信息
longjmp
char *p = malloc(100);
if (p == NULL) {
}
區(qū)分frame與bounds
//都是表示位置
//區(qū)別 frame:它的參考坐標(biāo)系是(世界坐標(biāo)系)(父視圖),設(shè)置坐標(biāo)時(shí)以父類(lèi)的左上角為坐標(biāo)原點(diǎn)(參考點(diǎn))
//bounds:參考坐標(biāo)系(本地坐標(biāo)系)(自身),設(shè)置坐標(biāo)時(shí)以自己的左上角為坐標(biāo)原點(diǎn)(參考點(diǎn))
//當(dāng)先給視圖設(shè)置了frame,再設(shè)置bouns時(shí),視圖會(huì)以frame的中心點(diǎn)為中心,去設(shè)置bounds時(shí)的視圖的位置
//注意:bounds的坐標(biāo)是不起作用的.
//當(dāng)直接給視圖用bounds設(shè)置位置時(shí),視圖會(huì)以父視圖的左上角為中心點(diǎn)設(shè)置自己的大小
//注意:在使用時(shí),如果需要坐標(biāo)點(diǎn)就使用frame 如果只是用大小就使用bounds
1—Autorelease pool
自動(dòng)釋放池(Autorelease pool)是OC的一種內(nèi)存自動(dòng)回收機(jī)制,可以將一些臨時(shí)變量通過(guò)自動(dòng)釋放池來(lái)回收統(tǒng)一釋放
自動(dòng)釋放池本事銷(xiāo)毀的時(shí)候,池子里面所有的對(duì)象都會(huì)做一次release操作
(1)在自動(dòng)釋放池@autoreleasepool{}中alloc一個(gè)對(duì)象后(如p1),仍然需要用[p1 autorelease];只是這個(gè)語(yǔ)句和[p1 release];不同,后者表示把p1的retainCount-1,而前者僅僅表示把p1放到自動(dòng)釋放池中返回一個(gè)self,自動(dòng)釋放池結(jié)束銷(xiāo)毀時(shí), 統(tǒng)一對(duì)里面的對(duì)象引用計(jì)數(shù)retainCount-1。
(2)@autoreleasepool{}可以隨意創(chuàng)建,也可以嵌套使用。
(3)不管這個(gè)對(duì)象是在自動(dòng)釋放池內(nèi)還是外創(chuàng)建的,只要在自動(dòng)釋放池內(nèi)寫(xiě)一個(gè)[p1 autorelease];p1就會(huì)被放到自動(dòng)釋放池中。注意autorelease是一個(gè)方法,且只有在自動(dòng)釋放池中使用才有效。
(4)如果把一個(gè)對(duì)象重復(fù)加到自動(dòng)釋放池如[p1 autorelease];[p1 autorelease];,那么會(huì)出錯(cuò)。原因是:加載幾次,屆時(shí)自動(dòng)釋放池就會(huì)用[p1 release];釋放幾次,但是由于這兩個(gè)加載的對(duì)象其實(shí)是一個(gè)對(duì)象同樣地址,所以第一次自動(dòng)釋放正確,第二次自動(dòng)釋放時(shí)發(fā)現(xiàn)已經(jīng)被釋放了,所以p1就 變成了野指針
2??4??
2—簡(jiǎn)述內(nèi)存分區(qū)情況
(1)代碼區(qū):存放函數(shù)二進(jìn)制代碼
(2)數(shù)據(jù)區(qū):系統(tǒng)運(yùn)行時(shí)申請(qǐng)內(nèi)存并初始化,系統(tǒng)退出時(shí)由系統(tǒng)釋放。存放全局變量、靜態(tài)變量、常量
(3)堆區(qū):通過(guò)malloc等函數(shù)或new等操作符動(dòng)態(tài)申請(qǐng)得到,需程序員手動(dòng)申請(qǐng)和釋放
(4)棧區(qū):函數(shù)模塊內(nèi)申請(qǐng),函數(shù)結(jié)束時(shí)由系統(tǒng)自動(dòng)釋放。存放局部變量、函數(shù)參數(shù)
另一種說(shuō)法:代碼區(qū),靜態(tài)區(qū),常量區(qū),堆區(qū)。棧區(qū)
3---視圖的生命周期
當(dāng)一個(gè)視圖控制器被創(chuàng)建,并在屏幕上顯示的時(shí)候。 代碼的執(zhí)行順序
1、 alloc 創(chuàng)建對(duì)象,分配空間
2、init (initWithNibName) 初始化對(duì)象,初始化數(shù)據(jù)
3、loadView 從nib載入視圖 ,通常這一步不需要去干涉。除非你沒(méi)有使用xib文件創(chuàng)建視圖
4、viewDidLoad 載入完成,可以進(jìn)行自定義數(shù)據(jù)以及動(dòng)態(tài)創(chuàng)建其他控件
5、viewWillAppear 視圖將出現(xiàn)在屏幕之前,馬上這個(gè)視圖就會(huì)被展現(xiàn)在屏幕上了
6、viewDidAppear 視圖已在屏幕上渲染完成
當(dāng)一個(gè)視圖被移除屏幕并且銷(xiāo)毀的時(shí)候的執(zhí)行順序,這個(gè)順序差不多和上面的相反
1、viewWillDisappear 視圖將被從屏幕上移除之前執(zhí)行
2、viewDidDisappear 視圖已經(jīng)被從屏幕上移除,用戶(hù)看不到這個(gè)視圖了
3、dealloc 視圖被銷(xiāo)毀,此處需要對(duì)你在init和viewDidLoad中創(chuàng)建的對(duì)象進(jìn)行釋放
在同一個(gè)類(lèi)A中,有方法a和方法b,方法b如何調(diào)用方法a?
[self a];
有A、B兩個(gè)類(lèi),B類(lèi)繼承于A類(lèi),都實(shí)現(xiàn)了方法xx。創(chuàng)建B類(lèi)實(shí)例b,如何讓b調(diào)用A類(lèi)?
[super a];
const和Volatile分別代表什么意思?
Volatile表示每次都從內(nèi)存取數(shù)據(jù)
類(lèi)型id代表什么意思?
面向?qū)ο蟀男┰兀?br>
繼承和分類(lèi)的區(qū)別?
Catogory
Catogory實(shí)現(xiàn)起來(lái)麻煩一些,但是使用方便
NSSet類(lèi)的作用是什么?
集合
編寫(xiě)一個(gè)完整程序,在控制臺(tái)打印字符串“HelloWorld!”
用遞歸實(shí)現(xiàn)計(jì)算n的階乘。(用objective-c語(yǔ)法實(shí)現(xiàn))
//
static全局變量與普通的全局變量有什么區(qū)別?static局部變量和普通局部變量有什么區(qū)別?static函數(shù)與普通函數(shù)有什么區(qū)別?
C語(yǔ)言中講講static變量和static函數(shù)有什么作用
static關(guān)鍵字有兩種意思,你看上下文來(lái)判斷
1,表示變量是靜態(tài)存儲(chǔ)變量
表示變量存放在靜態(tài)存儲(chǔ)區(qū).
2,表示該變量是內(nèi)部連接
(這種情況是指該變量不在任何{}之內(nèi),就象全局變量那樣,這時(shí)候加上static)
,也就是說(shuō)在其它的.cpp文件中,該變量是不可見(jiàn)的(你不能用).
當(dāng)static加在函數(shù)前面的時(shí)候
表示該函數(shù)是內(nèi)部連接,之在本文件中有效,別的文件中不能應(yīng)用該函數(shù).
不加static的函數(shù)默認(rèn)為是全局的.
也就是說(shuō)在其他的.cpp中只要申明一下這個(gè)函數(shù),就可以使用它.
1、static全局變量與普通的全局變量有什么區(qū)別?static局部變量和普通局部變量有什么區(qū)別?static函數(shù)與普通函數(shù)有什么區(qū)別?
答:全局變量(外部變量)的說(shuō)明之前再冠以static 就構(gòu)成了靜態(tài)的全局變量。全局變量本身就是靜態(tài)存儲(chǔ)方式, 靜態(tài)全局變量當(dāng)然也是靜態(tài)存儲(chǔ)方式。 這兩者在存儲(chǔ)方式上并無(wú)不同。這兩者的區(qū)別雖在于非靜態(tài)全局變量的作用域是整個(gè)源程序,當(dāng)一個(gè)源程序由多個(gè)源文件組成時(shí),非靜態(tài)的全局變量在各個(gè)源文件中都是有效的。 而靜態(tài)全局變量則限制了其作用域, 即只在定義該變量的源文件內(nèi)有效, 在同一源程序的其它源文件中不能使用它。由于靜態(tài)全局變量的作用域局限于一個(gè)源文件內(nèi),只能為該源文件內(nèi)的函數(shù)公用, 因此可以避免在其它源文件中引起錯(cuò)誤。
從以上分析可以看出, 把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲(chǔ)方式即改變了它的生存期。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域, 限制了它的使用范圍。
static函數(shù)與普通函數(shù)作用域不同。static函數(shù)僅在本文件中使用。只在當(dāng)前源文件中使用的函數(shù)應(yīng)該說(shuō)明為內(nèi)部函數(shù)(static),內(nèi)部函數(shù)應(yīng)該在當(dāng)前源文件中說(shuō)明和定義。對(duì)于可在當(dāng)前源文件以外使用的函數(shù),應(yīng)該在一個(gè)頭文件中說(shuō)明,要使用這些函數(shù)的源文件要包含這個(gè)頭文件
static全局變量與普通的全局變量有什么區(qū)別:static全局變量只初使化一次,防止在其他文件單元中被引用;
static局部變量和普通局部變量有什么區(qū)別:static局部變量只被初始化一次,下一次依據(jù)上一次結(jié)果值;
static函數(shù)與普通函數(shù)有什么區(qū)別:static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個(gè)被調(diào)用中維持一份拷貝
2、如何引用一個(gè)已經(jīng)定義過(guò)的全局變量?
答:extern
可以用引用頭文件的方式,也可以用extern關(guān)鍵字,如果用引用頭文件方式來(lái)引用某個(gè)在頭文件中聲明的全局變理,假定你將那個(gè)變寫(xiě)錯(cuò)了,那么在編譯期間 會(huì)報(bào)錯(cuò),如果你用extern方式引用時(shí),假定你犯了同樣的錯(cuò)誤,那么在編譯期間不會(huì)報(bào)錯(cuò),而在連接期間報(bào)錯(cuò)。
3、全局變量可不可以定義在可被多個(gè).C文件包含的頭文件中?為什么?
答:可以,在不同的C文件中以static形式來(lái)聲明同名全局變量。
可以在不同的C文件中聲明同名的全局變量,前提是其中只能有一個(gè)C文件中對(duì)此變量賦初值,此時(shí)連接不會(huì)出錯(cuò)。
什么是UDP和TCP的區(qū)別是什么?
TCP的全稱(chēng)為傳輸控制協(xié)議。這種協(xié)議可以提供面向連接的、可靠的、點(diǎn)到點(diǎn)的通信。
UDP的全稱(chēng)為用戶(hù)數(shù)據(jù)報(bào)協(xié)議,它可以提供非連接的不可靠的點(diǎn)到多點(diǎn)的通信。
用TCP還是UDP,那要看你的程序注重哪一個(gè)方面?可靠還是快速?
TCP/IP 建立連接的過(guò)程
在TCP/IP協(xié)議中,TCP協(xié)議提供可靠的連接服務(wù),采用三次握手建立一個(gè)連接。
第一次握手:建立連接時(shí),客戶(hù)端發(fā)送連接請(qǐng)求到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn);
第二次握手:服務(wù)器收到客戶(hù)端連接請(qǐng)求,向客戶(hù)端發(fā)送允許連接應(yīng)答,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài);
第三次握手:客戶(hù)端收到服務(wù)器的允許連接應(yīng)答,向服務(wù)器發(fā)送確認(rèn),客戶(hù)端和服務(wù)器進(jìn)入通信狀態(tài),完成三次握手。
(所謂的三次握手就是要有三次連接信息的發(fā)送/接收過(guò)程。TCP連接的建立需要進(jìn)行三次連接信息的發(fā)送/接收。)
-(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函數(shù)的一個(gè)參數(shù)。
obj-c有多重繼承么?不是的話有什么替代方法?
cocoa 中所有的類(lèi)都是NSObject 的子類(lèi),多繼承在這里是用protocol 委托代理來(lái)實(shí)現(xiàn)的。你不用去考慮繁瑣的多繼承,虛基類(lèi)的概念。多態(tài)特性在 obj-c 中通過(guò)委托來(lái)實(shí)現(xiàn)。
線程與進(jìn)程的區(qū)別和聯(lián)系?
進(jìn)程和線程都是由操作系統(tǒng)所體會(huì)的程序運(yùn)行的基本單元,系統(tǒng)利用該基本單元實(shí)現(xiàn)系統(tǒng)對(duì)應(yīng)用的并發(fā)性。
程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。進(jìn)程有獨(dú)立的地址空間,一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對(duì)其它進(jìn)程產(chǎn)生影響,而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量,但線程之間沒(méi)有單獨(dú)的地址空間,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健壯,但在進(jìn)程切換時(shí),耗費(fèi)資源較大,效率要差一些。但對(duì)于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程,不能用進(jìn)程。
自動(dòng)釋放池是什么,如何工作?
當(dāng)您向一個(gè)對(duì)象發(fā)送一個(gè)autorelease消息時(shí),Cocoa就會(huì)將該對(duì)象的一個(gè)引用放入到最新的自動(dòng)釋放池。它仍然是個(gè)正當(dāng)?shù)膶?duì)象,因此自動(dòng)釋放池定義的作用域內(nèi)的其它對(duì)象可以向它發(fā)送消息。當(dāng)程序執(zhí)行到作用域結(jié)束的位置時(shí),自動(dòng)釋放池就會(huì)被釋放,池中的所有對(duì)象也就被釋放。
ojc-c 是通過(guò)一種"referring counting"(引用計(jì)數(shù))的方式來(lái)管理內(nèi)存的, 對(duì)象在開(kāi)始分配內(nèi)存(alloc)的時(shí)候引用計(jì)數(shù)為一,以后每當(dāng)碰到有copy,retain的時(shí)候引用計(jì)數(shù)都會(huì)加一, 每當(dāng)碰到release和autorelease的時(shí)候引用計(jì)數(shù)就會(huì)減一,如果此對(duì)象的計(jì)數(shù)變?yōu)榱?, 就會(huì)被系統(tǒng)銷(xiāo)毀.
NSAutoreleasePool 就是用來(lái)做引用計(jì)數(shù)的管理工作的,這個(gè)東西一般不用你管的.
autorelease和release沒(méi)什么區(qū)別,只是引用計(jì)數(shù)減一的時(shí)機(jī)不同而已,autorelease會(huì)在對(duì)象的使用真正結(jié)束的時(shí)候才做引用計(jì)數(shù)減一。
什么是KVC和KVO?答:KVC(Key-Value-Coding)內(nèi)部的實(shí)現(xiàn):一個(gè)對(duì)象在調(diào)用setValue的時(shí)候,(1)首先根據(jù)方法名找到運(yùn)行方法的時(shí)候所需要的環(huán)境參數(shù)。(2)他會(huì)從自己isa指針結(jié)合環(huán)境參數(shù),找到具體的方法實(shí)現(xiàn)的接口。(3)再直接查找得來(lái)的具體的方法實(shí)現(xiàn)。KVO(Key-Value-Observing):當(dāng)觀察者為一個(gè)對(duì)象的屬性進(jìn)行了注冊(cè),被觀察對(duì)象的isa指針被修改的時(shí)候,isa指針就會(huì)指向一個(gè)中間類(lèi),而不是真實(shí)的類(lèi)。所以isa指針其實(shí)不需要指向?qū)嵗龑?duì)象真實(shí)的類(lèi)。所以我們的程序最好不要依賴(lài)于isa指針。在調(diào)用類(lèi)的方法的時(shí)候,最好要明確對(duì)象實(shí)例的類(lèi)名。
kvc 就是一種通過(guò)字符串去間接操作對(duì)象屬性的機(jī)制。
iphone中,自定義協(xié)議?
Protocol , 看代理 viewController
協(xié)議在oc中主要用在代理中
綁定的概念?
代理的概念?對(duì)它怎么理解?
為了模塊之間的松耦合
網(wǎng)絡(luò)編程中協(xié)議的概念。
NetworkDataDelegate;
3個(gè)函數(shù)理解 didReceive,
蘋(píng)果上架流程?
數(shù)據(jù)持久化存儲(chǔ)的方式 應(yīng)用的場(chǎng)景
C語(yǔ)言中講講static變量和static函數(shù)有什么作用
static關(guān)鍵字有兩種意思,你看上下文來(lái)判斷
1,表示變量是靜態(tài)存儲(chǔ)變量
表示變量存放在靜態(tài)存儲(chǔ)區(qū).
2,表示該變量是內(nèi)部連接
(這種情況是指該變量不在任何{}之內(nèi),就象全局變量那樣,這時(shí)候加上static)
,也就是說(shuō)在其它的.cpp文件中,該變量是不可見(jiàn)的(你不能用).
當(dāng)static加在函數(shù)前面的時(shí)候
表示該函數(shù)是內(nèi)部連接,之在本文件中有效,別的文件中不能應(yīng)用該函數(shù).
不加static的函數(shù)默認(rèn)為是全局的.
也就是說(shuō)在其他的.cpp中只要申明一下這個(gè)函數(shù),就可以使用它.
13.列舉幾種進(jìn)程的同步機(jī)制,并比較其優(yōu)缺點(diǎn)。答案: 原子操作 信號(hào)量機(jī)制 自旋鎖 管程,會(huì)合,分布式系統(tǒng)
1.進(jìn)程之間通信的途徑答案:共享存儲(chǔ)系統(tǒng)消息傳遞系統(tǒng)管道:以文件系統(tǒng)為基礎(chǔ)
2.進(jìn)程死鎖的原因答案:資源競(jìng)爭(zhēng)及進(jìn)程推進(jìn)順序非法
3.死鎖的4個(gè)必要條件答案:互斥、請(qǐng)求保持、不可剝奪、環(huán)路
4.死鎖的處理答案:鴕鳥(niǎo)策略、預(yù)防策略、避免策略、檢測(cè)與解除死鎖
14.堆和棧的區(qū)別管理方式:對(duì)于棧來(lái)講,是由編譯器自動(dòng)管理,無(wú)需我們手工控制;對(duì)于堆來(lái)說(shuō),釋放工作由程序員控制,容易產(chǎn)生memory leak。1.申請(qǐng)大小:棧: 在Windows下,棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的,在 WINDOWS下,棧的大小是2M(也有的說(shuō)是1M,總之是一個(gè)編譯時(shí)就確定的常數(shù)),如果申請(qǐng)的空間超過(guò)棧的剩余空間時(shí),將提示 overflow。因此,能從棧獲得的空間較小。
堆:堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來(lái)存儲(chǔ)的空閑內(nèi)存地址的,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計(jì)算機(jī)系統(tǒng)中有效的虛擬內(nèi)存。由此可見(jiàn),堆獲得的空間比較靈活,也比較大。2.碎片問(wèn)題:對(duì)于堆來(lái)講,頻繁的new/delete勢(shì)必會(huì)造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低。對(duì)于棧來(lái)講,則不會(huì)存在這個(gè)問(wèn)題,因?yàn)闂J窍冗M(jìn)后出的隊(duì)列,他們是如此的一一對(duì)應(yīng),以至于永遠(yuǎn)都不可能有一個(gè)內(nèi)存塊從棧中間彈出3.分配方式:堆都是動(dòng)態(tài)分配的,沒(méi)有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動(dòng)態(tài)分配。靜態(tài)分配是編譯器完成的,比如局部變量的分配。動(dòng)態(tài)分配由 alloca函數(shù)進(jìn)行分配,但是棧的動(dòng)態(tài)分配和堆是不同的,他的動(dòng)態(tài)分配是由編譯器進(jìn)行釋放,無(wú)需我們手工實(shí)現(xiàn)。4.分配效率:棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)會(huì)在底層對(duì)棧提供支持:分配專(zhuān)門(mén)的寄存器存放棧的地址,壓棧出棧都有專(zhuān)門(mén)的指令執(zhí)行,這就決定了棧的效率比較高。堆則是C/C++函數(shù)庫(kù)提供的,它的機(jī)制是很復(fù)雜的。 15.什么是鍵-值,鍵路徑是什么模型的性質(zhì)是通過(guò)一個(gè)簡(jiǎn)單的鍵(通常是個(gè)字符串)來(lái)指定的。視圖和控制器通過(guò)鍵來(lái)查找相應(yīng)的屬性值。
在一個(gè)給定的實(shí)體中,同一個(gè)屬性的所有值具有相同的數(shù)據(jù)類(lèi)型。
鍵-值編碼技術(shù)用于進(jìn)行這樣的查找—它是一種間接訪問(wèn)對(duì)象屬性的機(jī)制。鍵路徑是一個(gè)由用點(diǎn)作分隔符的鍵組成的字符串,用于指定一個(gè)連接在一起的對(duì)象性質(zhì)序列。第一個(gè)鍵的性質(zhì)是由先前的性質(zhì)決定的,接下來(lái)每個(gè)鍵的值也是相對(duì)于其前面的性質(zhì)。鍵路徑使您可以以獨(dú)立于模型實(shí)現(xiàn)的方式指定相關(guān)對(duì)象的性質(zhì)。通過(guò)鍵路徑,您可以指定對(duì)象圖中的一個(gè)任意深度的路徑,使其指向相關(guān)對(duì)象的特定屬性。16.c和obj-c如何混用1)obj-c的編譯器處理后綴為m的文件時(shí),可以識(shí)別obj-c和c的代碼,處理mm文件可以識(shí)別obj-c,c,c++代碼,
但cpp文件必須只能用c/c++代碼,而且cpp文件include的頭文件中,也不能出現(xiàn)obj- c的代碼,因?yàn)閏pp只是cpp。2) 在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是問(wèn)題3)在cpp中混用obj- c其實(shí)就是使用obj-c編寫(xiě)的模塊是我們想要的。如果模塊以類(lèi)實(shí)現(xiàn),那么要按照cpp class的標(biāo)準(zhǔn)寫(xiě)類(lèi)的定義,頭文件中不能出現(xiàn)obj-c的東西,包括#import cocoa的。
實(shí)現(xiàn)文件中,即類(lèi)的實(shí)現(xiàn)代碼中可以使用obj-c的東西,可以import,只是后綴是mm。如果模塊以函數(shù)實(shí)現(xiàn),那么頭文件要按 c的格式聲明函數(shù),實(shí)現(xiàn)文件中,c++函數(shù)內(nèi)部可以用obj-c,但后綴還是mm或m。總結(jié):只要cpp文件和cpp include的文件中不包含obj-c的東西就可以用了,cpp混用obj-c的關(guān)鍵是使用接口,
而不能直接使用實(shí)現(xiàn)代碼,實(shí)際上cpp混用的是 obj-c編譯后的o文件,這個(gè)東西其實(shí)是無(wú)差別的,所以可以用。obj-c的編譯器支持cpp.
17.cocoa touch框架iPhone OS 應(yīng)用程序的基礎(chǔ) Cocoa Touch 框架重用了許多 Mac 系統(tǒng)的成熟模式,但是它更多地專(zhuān)注于觸摸的接口和優(yōu)化。
UIKit 為您提供了在 iPhone OS 上實(shí)現(xiàn)圖形,事件驅(qū)動(dòng)程序的基本工具,其建立在和 Mac OS X 中一樣的 Foundation 框架上,
包括文件處理,網(wǎng)絡(luò),字符串操作等。 Cocoa Touch 具有和 iPhone 用戶(hù)接口一致的特殊設(shè)計(jì)。有了 UIKit,您可以使用 iPhone OS 上的獨(dú)特的圖形接口控件,按鈕,
以及全屏視圖的功能,您還可以使用加速儀和多點(diǎn)觸摸手勢(shì)來(lái)控制您的應(yīng)用。各色俱全的框架 除了 UIKit 外,Cocoa Touch 包含了創(chuàng)建世界一流 iPhone 應(yīng)用程序需要的所有框架,從三維圖形,到專(zhuān)業(yè)音效,
甚至提供設(shè)備訪問(wèn) API 以控制攝像頭,或通過(guò) GPS 獲知當(dāng)前位置。
Cocoa Touch 既包含只需要幾行代碼就可以完成全部任務(wù)的強(qiáng)大的 Objective-C 框架,也在需要時(shí)提供基礎(chǔ)的 C 語(yǔ)言 API 來(lái)直接訪問(wèn)系統(tǒng)。這些框架包括:Core Animation:通過(guò) Core Animation,您就可以通過(guò)一個(gè)基于組合獨(dú)立圖層的簡(jiǎn)單的編程模型來(lái)創(chuàng)建豐富的用戶(hù)體驗(yàn)。Core Audio:Core Audio 是播放,處理和錄制音頻的專(zhuān)業(yè)技術(shù),能夠輕松為您的應(yīng)用程序添加強(qiáng)大的音頻功能。Core Data:提供了一個(gè)面向?qū)ο蟮臄?shù)據(jù)管理解決方案,它易于使用和理解,甚至可處理任何應(yīng)用或大或小的數(shù)據(jù)模型。功能列表:框架分類(lèi)下面是 Cocoa Touch 中一小部分可用的框架:音頻和視頻:Core Audio ,OpenAL ,Media Library ,AV Foundation數(shù)據(jù)管理 :Core Data ,SQLite圖形和動(dòng)畫(huà) :Core Animation ,OpenGL ES ,Quartz 2D網(wǎng)絡(luò):Bonjour ,WebKit ,BSD Sockets用戶(hù)應(yīng)用:Address Book ,Core Location ,Map Kit ,Store Kit
18.自動(dòng)釋放池是什么,如何工作 當(dāng)您向一個(gè)對(duì)象發(fā)送一個(gè)autorelease消息時(shí),Cocoa就會(huì)將該對(duì)象的一個(gè)引用放入到最新的自動(dòng)釋放池。
它仍然是個(gè)正當(dāng)?shù)膶?duì)象,因此自動(dòng)釋放池定義的作用域內(nèi)的其它對(duì)象可以向它發(fā)送消息。
當(dāng)程序執(zhí)行到作用域結(jié)束的位置時(shí),自動(dòng)釋放池就會(huì)被釋放,池中的所有對(duì)象也就被釋放。1. ojc-c 是通過(guò)一種"referring counting"(引用計(jì)數(shù))的方式來(lái)管理內(nèi)存的, 對(duì)象在開(kāi)始分配內(nèi)存(alloc)的時(shí)候引用計(jì)數(shù)為一,
以后每當(dāng)碰到有copy,retain的時(shí)候引用計(jì)數(shù)都會(huì)加一, 每當(dāng)碰到release和autorelease的時(shí)候引用計(jì)數(shù)就會(huì)減一,如果此
對(duì)象的計(jì)數(shù)變?yōu)榱?, 就會(huì)被系統(tǒng)銷(xiāo)毀.2. NSAutoreleasePool 就是用來(lái)做引用計(jì)數(shù)的管理工作的,這個(gè)東西一般不用你管的.3. autorelease和release沒(méi)什么區(qū)別,只是引用計(jì)數(shù)減一的時(shí)機(jī)不同而已,autorelease會(huì)在對(duì)象的使用真正結(jié)束的時(shí)候才做引用計(jì)數(shù)減一.
19.objc優(yōu)點(diǎn): 1) Cateogies 2) Posing 3) 動(dòng)態(tài)識(shí)別 4) 指標(biāo)計(jì)算 5)彈性訊息傳遞 6) 不是一個(gè)過(guò)度復(fù)雜的 C 衍生語(yǔ)言 7) Objective-C 與 C++ 可混合編程 objc缺點(diǎn): 1) 不支援命名空間 2) 不支持運(yùn)算符重載 3) 不支持多重繼承 4) 使用動(dòng)態(tài)運(yùn)行時(shí)類(lèi)型,所有的方法都是函數(shù)調(diào)用,所以很多編譯時(shí)優(yōu)化方法都用不到。(如內(nèi)聯(lián)函數(shù)等),性能低劣。
20.sprintf,strcpy,memcpy使用上有什么要注意的地方 strcpy是一個(gè)字符串拷貝的函數(shù),它的函數(shù)原型為strcpy(char dst, const char src);將src開(kāi)始的一段字符串拷貝到dst開(kāi)始的內(nèi)存中去,結(jié)束的標(biāo)志符號(hào)為 '\0',由于拷貝的長(zhǎng)度不是由我們自己控制的,
所以這個(gè)字符串拷貝很容易出錯(cuò)。具備字符串拷貝功能的函數(shù)有memcpy,這是一個(gè)內(nèi)存拷貝函數(shù),它的函數(shù)原型
為memcpy(char dst, const char src, unsigned int len);將長(zhǎng)度為len的一段內(nèi)存,從src拷貝到dst中去,這個(gè)函數(shù)的長(zhǎng)度可控。但是會(huì)有內(nèi)存疊加的問(wèn)題。sprintf是格式化函數(shù)。將一段數(shù)據(jù)通過(guò)特定的格式,格式化到一個(gè)字符串緩沖區(qū)中去。sprintf格式化的函數(shù)的長(zhǎng)度不可控,
有可能格式化后的字符串會(huì)超出緩沖區(qū)的大小,造成溢出。21. 用變量a給出下面的定義a) 一個(gè)整型數(shù)(An integer) b)一個(gè)指向整型數(shù)的指針( A pointer to an integer) c)一個(gè)指向指針的的指針,它指向的指針是指向一個(gè)整型數(shù)( A pointer to a pointer to an intege)r d)一個(gè)有10個(gè)整型數(shù)的數(shù)組( An array of 10 integers) e) 一個(gè)有10個(gè)指針的數(shù)組,該指針是指向一個(gè)整型數(shù)的。(An array of 10 pointers to integers) f) 一個(gè)指向有10個(gè)整型數(shù)數(shù)組的指針( A pointer to an array of 10 integers) g) 一個(gè)指向函數(shù)的指針,該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)(A pointer to a function that takes an integer as an argument and returns an integer) h) 一個(gè)有10個(gè)指針的數(shù)組,該指針指向一個(gè)函數(shù),該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)( 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是一個(gè)屬性訪問(wèn)聲明,擴(kuò)號(hào)內(nèi)支持以下幾個(gè)屬性:1,getter=getterName,setter=setterName,設(shè)置setter與 getter的方法名2,readwrite,readonly,設(shè)置可供訪問(wèn)級(jí)別2,assign,setter方法直接賦值,不進(jìn)行任何retain操作,為了解決原類(lèi)型與環(huán)循引用問(wèn)題3,retain,setter方法對(duì)參數(shù)進(jìn)行release舊值再retain新值,所有實(shí)現(xiàn)都是這個(gè)順序(CC上有相關(guān)資料)4,copy,setter方法進(jìn)行Copy操作,與retain處理流程一樣,先舊值release,再 Copy出新的對(duì)象,retainCount為1。
這是為了減少對(duì)上下文的依賴(lài)而引入的機(jī)制。5,nonatomic,非原子性訪問(wèn),不加同步,多線程并發(fā)訪問(wèn)會(huì)提高性能。注意,如果不加此屬性,則默認(rèn)是兩個(gè)訪問(wèn)方法
都為原子型事務(wù)訪問(wèn)。鎖被加到所屬對(duì)象實(shí)例級(jí)(我是這么理解的...)。
23.http和scoket通信的區(qū)別。
http是客戶(hù)端用http協(xié)議進(jìn)行請(qǐng)求,發(fā)送請(qǐng)求時(shí)候需要封裝http請(qǐng)求頭,并綁定請(qǐng)求的數(shù)據(jù),服務(wù)器一般有web服務(wù)器配合(當(dāng)然也非絕 對(duì))。 http請(qǐng)求方式為客戶(hù)端主動(dòng)發(fā)起請(qǐng)求,服務(wù)器才能給響應(yīng),一次請(qǐng)求完畢后則斷開(kāi)連接,以節(jié)省資源。服務(wù)器不能主動(dòng)給客戶(hù)端響應(yīng)(除非采取http長(zhǎng)連接 技術(shù))。iphone主要使用類(lèi)是NSUrlConnection。
scoket是客戶(hù)端跟服務(wù)器直接使用socket“套接字”進(jìn)行連接,并沒(méi)有規(guī)定連接后斷開(kāi),所以客戶(hù)端和服務(wù)器可以保持連接通道,雙方 都可以主動(dòng)發(fā)送數(shù)據(jù)。一般在游戲開(kāi)發(fā)或股票開(kāi)發(fā)這種要求即時(shí)性很強(qiáng)并且保持發(fā)送數(shù)據(jù)量比較大的場(chǎng)合使用。主要使用類(lèi)是CFSocketRef。
TCP全稱(chēng)是Transmission Control Protocol,中文名為傳輸控制協(xié)議,它可以提供可靠的、面向連接的網(wǎng)絡(luò)數(shù)據(jù)傳遞服務(wù)。傳輸控制協(xié)議主要包含下列任務(wù)和功能: 確保IP數(shù)據(jù)報(bào)的成功傳遞。 對(duì)程序發(fā)送的大塊數(shù)據(jù)進(jìn)行分段和重組。 確保正確排序及按順序傳遞分段的數(shù)據(jù)。 通過(guò)計(jì)算校驗(yàn)和,進(jìn)行傳輸數(shù)據(jù)的完整性檢查。
6、TCP和UDP的區(qū)別 TCP提供的是面向連接的、可靠的數(shù)據(jù)流傳輸,而UDP提供的是非面向連接的、不可靠的數(shù)據(jù)流傳輸。 簡(jiǎn)單的說(shuō),TCP注重?cái)?shù)據(jù)安全,而UDP數(shù)據(jù)傳輸快點(diǎn),但安全性一般
24.mvc設(shè)計(jì)模式是什么? 你還熟悉什么設(shè)計(jì)模式?設(shè)計(jì)模式:并不是一種新技術(shù),而是一種編碼經(jīng)驗(yàn),使用比如java中的接口,iphone中的協(xié)議,繼承關(guān)系等基本手段,
用比較成熟的邏輯去處理某一種類(lèi)型的事情,總結(jié)為所謂設(shè)計(jì)模式。面向?qū)ο缶幊讨?,java已經(jīng)歸納了23中設(shè)計(jì)模式。mvc設(shè)計(jì)模式 ,模型,視圖,控制器,可以將整個(gè)應(yīng)用程序在思想上分成三大塊,對(duì)應(yīng)是的數(shù)據(jù)的存儲(chǔ)或處理,前臺(tái)的顯示,
業(yè)務(wù)邏輯的控制。 Iphone本身的設(shè)計(jì)思想就是遵循mvc設(shè)計(jì)模式。其不屬于23中設(shè)計(jì)模式范疇。代理模式:代理模式給某一個(gè)對(duì)象提供一個(gè)代理對(duì)象,并由代理對(duì)象控制對(duì)源對(duì)象的引用.比如一個(gè)工廠生產(chǎn)了產(chǎn)品,
并不想直接賣(mài)給用戶(hù),而是搞了很多代理商,用戶(hù)可以直接找代理商買(mǎi)東西,代理商從工廠進(jìn)貨.常見(jiàn)的如QQ的自動(dòng)回復(fù)就屬于代理攔截,代理模式在iphone中得到廣泛應(yīng)用.單例模式:說(shuō)白了就是一個(gè)類(lèi)不通過(guò)alloc方式創(chuàng)建對(duì)象,而是用一個(gè)靜態(tài)方法返回這個(gè)類(lèi)的對(duì)象。系統(tǒng)只需要擁有一個(gè)的全局對(duì)象,
這樣有利于我們協(xié)調(diào)系統(tǒng)整體的行為,比如想獲得[UIApplication sharedApplication];任何地方調(diào)用都可以得到 UIApplication的對(duì)象,
這個(gè)對(duì)象是全局唯一的。觀察者模式: 當(dāng)一個(gè)物體發(fā)生變化時(shí),會(huì)通知所有觀察這個(gè)物體的觀察者讓其做出反應(yīng)。實(shí)現(xiàn)起來(lái)無(wú)非就是把所有觀察者的對(duì)象給這個(gè)物體,
當(dāng)這個(gè)物體的發(fā)生改變,就會(huì)調(diào)用遍歷所有觀察者的對(duì)象調(diào)用觀察者的方法從而達(dá)到通知觀察者的目的。工廠模式:
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 是兩種版控制的器,需要配套相關(guān)的svn,cvs服務(wù)器。scm是xcode里配置版本控制的地方。版本控制的原理就是a和b同時(shí)開(kāi)發(fā)一個(gè)項(xiàng)目,a寫(xiě)完當(dāng)天的代碼之后把代碼提交給服務(wù)器,
b要做的時(shí)候先從服務(wù)器得到最新版本,就可以接著做。 如果a和b都要提交給服務(wù)器,并且同時(shí)修改了同一個(gè)方法,就會(huì)產(chǎn)生代碼沖突,
如果a先提交,那么b提交時(shí),服務(wù)器可以提示沖突的代碼,b可以清晰的看到,并做出相應(yīng)的修改或融合后再提交到服務(wù)器。
26.什么是push(了解一下)。
客戶(hù)端程序留下后門(mén)端口,客戶(hù)端總是監(jiān)聽(tīng)針對(duì)這個(gè)后門(mén)的請(qǐng)求,于是 服務(wù)器可以主動(dòng)像這個(gè)端口推送消息。
27.靜態(tài)鏈接庫(kù)(了解一下)
(此為.a文件,相當(dāng)于java里的jar包,把一些類(lèi)編譯到一個(gè)包中,在不同的工程中如果導(dǎo)入此文件就可以使用里面的類(lèi),
具體使用依然是#import “ xx.h”)。
28.fmmpeg框架(了解一下)
(音視頻編解碼框架,內(nèi)部使用UDP協(xié)議針對(duì)流媒體開(kāi)發(fā),內(nèi)部開(kāi)辟了六個(gè)端口來(lái)接受流媒體數(shù)據(jù),完成快速接受之目的).
29.fmdb框架(了解一下)
(數(shù)據(jù)庫(kù)框架,對(duì)sqllite的數(shù)據(jù)操作進(jìn)行了封裝,使用著可把精力都放在sql語(yǔ)句上面)。
30.320框架(了解一下)
(ui框架,導(dǎo)入320工程作為框架包如同添加一個(gè)普通框架一樣)。
cover(open) flower框架 (2d 仿射技術(shù)),內(nèi)部核心類(lèi)是CATransform3D.
31.什么是沙箱模型?哪些操作是屬于私有api范疇?
某個(gè)iphone工程進(jìn)行文件操作有此工程對(duì)應(yīng)的指定的位置,不能逾越。iphone沙箱模型的有四個(gè)文件夾,分別是什么,永久數(shù)據(jù)存儲(chǔ)一般放在什么位置,得到模擬器的路徑的簡(jiǎn)單方式是什么.
documents,tmp,app,Library。
(NSHomeDirectory()),
手動(dòng)保存的文件在documents文件里
Nsuserdefaults保存的文件在tmp文件夾里
Documents 目錄:您應(yīng)該將所有de應(yīng)用程序數(shù)據(jù)文件寫(xiě)入到這個(gè)目錄下。這個(gè)目錄用于存儲(chǔ)用戶(hù)數(shù)據(jù)或其它應(yīng)該定期備份的信息。
AppName.app 目錄:這是應(yīng)用程序的程序包目錄,包含應(yīng)用程序的本身。由于應(yīng)用程序必須經(jīng)過(guò)簽名,
所以您在運(yùn)行時(shí)不能對(duì)這個(gè)目錄中的內(nèi)容進(jìn)行修改,否則可能會(huì)使應(yīng)用程序無(wú)法啟動(dòng)。
Library 目錄:這個(gè)目錄下有兩個(gè)子目錄:Caches 和 Preferences
Preferences 目錄包含應(yīng)用程序的偏好設(shè)置文件。您不應(yīng)該直接創(chuàng)建偏好設(shè)置文件,而是應(yīng)該使用NSUserDefaults類(lèi)來(lái)取得和設(shè)置應(yīng)用程序的偏好.
Caches 目錄用于存放應(yīng)用程序?qū)S玫闹С治募?,保存?yīng)用程序再次啟動(dòng)過(guò)程中需要的信息。
tmp 目錄:這個(gè)目錄用于存放臨時(shí)文件,保存應(yīng)用程序再次啟動(dòng)過(guò)程中不需要的信息。
獲取這些目錄路徑的方法:
1,獲取家目錄路徑的函數(shù):
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,獲取應(yīng)用程序程序包中資源文件路徑的方法:
例如獲取程序包中一個(gè)圖片資源(apple.png)路徑的方法:
NSString imagePath = [[NSBundle mainBundle] pathForResource:@”apple” ofType:@”png”];
UIImage appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];
代碼中的mainBundle類(lèi)方法用于返回一個(gè)代表應(yīng)用程序包的對(duì)象。
文件IO寫(xiě)入
1,將數(shù)據(jù)寫(xiě)到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目錄讀取數(shù)據(jù):
(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這個(gè)主要就是返回一個(gè)絕對(duì)路徑用來(lái)存放我們需要儲(chǔ)存的文件。(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]]){
//下面是對(duì)該文件進(jìn)行制定路徑的保存
[fm createDirectoryAtPath:[self dataFilePath] withIntermediateDirectories:YES attributes:nil error:nil];
//取得一個(gè)目錄下得所有文件名
NSArray files = [fm subpathsAtPath: [self dataFilePath] ];
//讀取某個(gè)文件
NSData data = [fm contentsAtPath:[self dataFilePath]];
//或者
NSData data = [NSData dataWithContentOfPath:[self dataFilePath]];
}
iphone常見(jiàn)私有api的應(yīng)用(比如直接發(fā)送短信,訪問(wèn)沙箱之外的磁盤(pán)文件).32.你在開(kāi)發(fā)項(xiàng)目中時(shí),用到了哪些數(shù)據(jù)存儲(chǔ)方式,iphone中常見(jiàn)的方式有哪些,各有什么區(qū)別?
數(shù)據(jù)存儲(chǔ)五種形式的應(yīng)用范圍和性能區(qū)別
(core data, sqllite,對(duì)象序列化,文件直接讀寫(xiě),NSUserDefault(保存數(shù)據(jù)到temp文件夾中))文件直接讀寫(xiě) >core data> 對(duì)象序列化> sqllite>NSUserDefault.
33.線程的常見(jiàn)方法有哪些,你是如何處理多線程的,多線程同步問(wèn)題你了解么?線程創(chuàng)建的幾種方式,線程的加鎖,休眠,喚醒,解鎖,退出,
多線程要考慮同步問(wèn)題,解決同步問(wèn)題的方式就是對(duì)某一資源加鎖,當(dāng)一個(gè)線程操作本資源時(shí),其他線程不能操作 。 系統(tǒng)自帶線程池(NSOpertionQueue)的作用:
凡是需要啟動(dòng)多個(gè)線程的地方都可以使用NSOpertionQueue,加入到NSOpertionQueue中的對(duì)象都需要繼承NSOpertion。 NSOpertionQueue會(huì)在系統(tǒng)內(nèi)部啟動(dòng)一個(gè)獨(dú)立線程去執(zhí)行這個(gè)被加入對(duì)象的main方法。
常用的地方是用nsoprationqueue 下載圖片,文件。如果是自己創(chuàng)建一個(gè)線程池,無(wú)非就是啟動(dòng)多個(gè)線程的時(shí)候,
把這些線程對(duì)象放到一個(gè)大數(shù)組中,如果需要啟動(dòng)線程的時(shí)候,先從數(shù)組中找空閑線程來(lái)使用。
自己管理線程池最大的難題是不好處理當(dāng)啟動(dòng)多個(gè)線程后,用戶(hù)在多個(gè)界面的跳轉(zhuǎn)的時(shí)候,對(duì)線程方法的回調(diào)管理。
而NSOpertionQueue可以很好的處理他。
34.init和initwithobject區(qū)別(語(yǔ)法)?
init創(chuàng)建的對(duì)象不帶自動(dòng)釋放
35.你連接服務(wù)器用的是什么方法,如果請(qǐng)求過(guò)程中,網(wǎng)絡(luò)出了問(wèn)題這么辦?NSUrlConnection 連接后,有一系列委托方法來(lái)接受來(lái)自服務(wù)器的響應(yīng)和數(shù)據(jù),
其中接受相應(yīng)的方法回得到服務(wù)器要傳回的數(shù)據(jù)有多大,接受數(shù)據(jù)的方法會(huì)反復(fù)調(diào)用來(lái)不斷接受服務(wù)器數(shù)據(jù),
如果網(wǎng)絡(luò)出了問(wèn)題了,會(huì)調(diào)用一個(gè)方法讓你來(lái)做相關(guān)處理。
36.你使用過(guò)json解析方式么,他們的底層是如何處理的你了解么?
json解析的用法,用框架的用法簡(jiǎn)單介紹:
底層原理遍歷字符串中的字符,最終根據(jù)格式規(guī)定的特殊字符,比如{}號(hào),[]號(hào), : 號(hào) 等進(jìn)行區(qū)分, {}號(hào)是一個(gè)字典的開(kāi)始,[]號(hào)是一個(gè)數(shù)組的開(kāi)始, : 號(hào)是字典的鍵和值的分水嶺,最終乃是將json數(shù)據(jù)轉(zhuǎn)化為字典,
字典中值可能是字典,數(shù)組,或字符串而已。
37.xml解析的原理是什么,你還用過(guò)其他解析方式么?NSXMLParser, 其他解析方式有自定義二進(jìn)制解析,就是按字節(jié)去解析,電話會(huì)談就是如此,
還可以是字符串之間用特殊符號(hào)連接的數(shù)據(jù),將此數(shù)據(jù)用特殊符號(hào)可以分割成所用數(shù)據(jù)。
38.協(xié)議是什么,有什么作用.?
協(xié)議很像java中的接口,某個(gè)類(lèi)實(shí)現(xiàn)協(xié)議后,就必須實(shí)現(xiàn)協(xié)議中規(guī)定的@require的方法,比如一個(gè)類(lèi)A, 一個(gè)類(lèi)B都實(shí)現(xiàn)某“協(xié)議”后,
這個(gè)類(lèi)A的對(duì)象和B的對(duì)象都可以賦值給這個(gè)協(xié)議的類(lèi)型變量,比如 id<協(xié)議> 變量名 = A類(lèi)或B類(lèi)的對(duì)象,
于是這個(gè)變量就完成了能夠指向多個(gè)不同的類(lèi)的對(duì)象并調(diào)用對(duì)象中的實(shí)現(xiàn)協(xié)議的方法。39.類(lèi)別有什么作用?類(lèi)別的使用 。 類(lèi)別有三大作用,
可以使本來(lái)需要在.h中聲明的方法放到.m文件中聲明,達(dá)到了可以使方法不對(duì)外公開(kāi)。
可以方便的擴(kuò)展類(lèi),甚至系統(tǒng)類(lèi)都可以輕易擴(kuò)展,維護(hù)了代碼原本的結(jié)構(gòu)不受影響。
類(lèi)別可以寫(xiě)到不同的.h或.m文件中,可以分散代碼到跟類(lèi)別的擴(kuò)展功能想關(guān)聯(lián)的地方,方便查看。40.分線程回調(diào)主線程方法是什么,有什么作用?[self performSelectorOnMainThread:@selector(buttonGo2) withObject:nil waitUntilDone:YES];[self performSelector:@selector(buttonGo2) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES];需要即時(shí)刷新ui控件的時(shí)候,經(jīng)常使用。41.iphone閱讀器,如果要讀取一個(gè)文本文件,請(qǐng)問(wèn)你是如何處理編碼問(wèn)題的?另外像pdf格式的文件,你如何讀取。?
iphone手機(jī)閱讀器中對(duì)于PDF格式的閱讀,可以直接用UIWebView控件顯示,也可以從網(wǎng)上下到很多直接讀取pdf格式的代碼
直接從pdf中得到數(shù)據(jù)。復(fù)雜表格動(dòng)畫(huà)- (void)insertRowsAtIndexPaths:(NSArray )indexPaths withRowAnimation:(UITableViewRowAnimation)animation; -(void)deleteRowsAtIndexPaths:(NSArray )indexPaths withRowAnimation:(UITableViewRowAnimation)animation;- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
42.你在開(kāi)發(fā)大型項(xiàng)目的時(shí)候,如何進(jìn)行內(nèi)存泄露檢測(cè)的? 可以通過(guò)xcode的自帶工具run---start with performance tool里有instruments下有個(gè)leaks工具,
啟動(dòng)此工具后,運(yùn)行項(xiàng)目,工具里可以顯示內(nèi)存泄露的情況,雙擊可找到源碼位置,可以幫助進(jìn)行內(nèi)存泄露的處理。
43.你做iphone開(kāi)發(fā)時(shí)候,有哪些傳值方式,view和view之間是如何傳值的?
壓棧。
44.讓一個(gè)物體從界面中的一點(diǎn)運(yùn)動(dòng)到另外一點(diǎn),有哪些方法?四種方式:1. beginAnimation
2. 線程
3. NSTimer
4. 圖層動(dòng)畫(huà)(路徑)
45.你了解哪些加密方式? Base64, MD5, 循環(huán)右移位等.
46.地圖定位
CLLocationManager位置管理器 使用Core Location框架來(lái)確定iphone的位置(GPS,蜂窩基站三角網(wǎng),wps三種方式)
MKMapView提供了一套可植入的地圖接口,可以讓我們?cè)趹?yīng)用中展示地圖,并對(duì)其進(jìn)行相關(guān)的操作。一般來(lái)說(shuō),我們可以指定一個(gè)展示區(qū)域,放一些標(biāo)記在上面,還可以加蓋一些層在上面。
MKMapView依賴(lài)Google map里面相關(guān)服務(wù)(如Google Earth API等),所以地圖的左下角會(huì)有Google字樣。
47.打開(kāi)url
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://8004664411"]];mailto:// sms://
http網(wǎng)絡(luò)通信
ASIHTTPRequest 是一個(gè)直接在CFNetwork上做的開(kāi)源項(xiàng)目:提供直接提交(HTTP POST)文件的API,異步請(qǐng)求與隊(duì)列,自動(dòng)管理上傳與下載隊(duì)列管理機(jī),ASIFormDataRequest用于適合上傳文件,圖片數(shù)據(jù)。
圖片瀏覽
UIImagePickerController可以從相冊(cè),相機(jī),膠卷里獲得圖片。
對(duì)像序列化
NSCoding encodeWithCoder initWithCoder
NSKeyedUnarchiver NSKeyedArchiver
各種picker
UIDatePicker UIPickerView
電影播放
MPMoviePlayerController
音樂(lè)播放
MPMusicPlayerController
53.線程 ?
a. 線程的創(chuàng)建和使用規(guī)則?
答: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. 主分線程
答:?jiǎn)?dòng)分線程,上面已提到!加到主線程方法performSelector!
//加到主線程addData()是主線程的方法!只有加到主線程后,才能調(diào)用主線程的方法
[target performSelector:@selector(addData:) onThread:[NSThread mainThread] withObject:item waitUntilDone:YES];
//[target addData:item];//沒(méi)有加到主線程后,調(diào)用主線程的方法!一定會(huì)崩!
c.線程鎖
答:NSCondition
方法:
[thread lock];//加鎖
sleep(n);//線程休眠
[thread singnal];//相當(dāng)于通知,線程啟動(dòng)
[thread unlock];//解鎖
[thread exit];//線程退出
54.各種 排序算法?
希爾排序、快速排序、冒泡排序、
55.通信底層原理
答:OSI七層模型
7 應(yīng)用層: ftp,smtp,http,telnet,tftp(通過(guò)各種協(xié)議,最終還是包裝成TCP數(shù)據(jù)包,發(fā)送到網(wǎng)絡(luò)中?。?br>
6 表現(xiàn)層:
5 會(huì)話層:
4 傳輸層: tcp udp
3 網(wǎng)絡(luò)層: ip,ICMP,IGRP,EIGRP,OSPF,ARP
2 數(shù)據(jù)鏈路層: STP,VT
1 物理層:
為什么很多內(nèi)置類(lèi)如UITableViewController的delegate屬性都是assign而不是retain的?
答:
會(huì)引起循環(huán)引用
所有的引用計(jì)數(shù)系統(tǒng),都存在循環(huán)應(yīng)用的問(wèn)題。例如下面的引用關(guān)系:
- 對(duì)象a創(chuàng)建并引用到了對(duì)象b.
- 對(duì)象b創(chuàng)建并引用到了對(duì)象c.
- 對(duì)象c創(chuàng)建并引用到了對(duì)象b.
這時(shí)候b和c的引用計(jì)數(shù)分別是2和1。
當(dāng)a不再使用b,調(diào)用release釋放對(duì)b的所有權(quán),因?yàn)閏還引用了b,所以b的引用計(jì)數(shù)為1,b不會(huì)被釋放。
b不釋放,c的引用計(jì)數(shù)就是1,c也不會(huì)被釋放。從此,b和c永遠(yuǎn)留在內(nèi)存中。
這種情況,必須打斷循環(huán)引用,通過(guò)其他規(guī)則來(lái)維護(hù)引用關(guān)系。我們常見(jiàn)的delegate往往是assign方式的屬性而不是retain方式 的屬性,
賦值不會(huì)增加引用計(jì)數(shù),就是為了防止delegation兩端產(chǎn)生不必要的循環(huán)引用。
如果一個(gè)UITableViewController 對(duì)象a通過(guò)retain獲取了UITableView對(duì)象b的所有權(quán),這個(gè)UITableView對(duì)象b的delegate又是a,
如果這個(gè)delegate是retain方式的,那基本上就沒(méi)有機(jī)會(huì)釋放這兩個(gè)對(duì)象了。自己在設(shè)計(jì)使用delegate模式時(shí),也要注意這點(diǎn)。
以下每行代碼執(zhí)行后,person對(duì)象的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.在一個(gè)對(duì)象的方法里面:
self.name = “object”;
和
name =”object”
有什么不同嗎?
答:self.name = "object"會(huì)調(diào)用對(duì)象的setName()方法,會(huì)使object引用計(jì)數(shù)加1,name = "object"會(huì)直接把object賦值給當(dāng)前對(duì)象的name 屬性,引用計(jì)數(shù)不增加。
59.readwrite,readonly,assign,retain,copy,nonatomic屬性的作用?
@property是一個(gè)屬性訪問(wèn)聲明,擴(kuò)號(hào)內(nèi)支持以下幾個(gè)屬性:1,getter=getterName,setter=setterName,設(shè)置setter與getter的方法名2,readwrite,readonly,設(shè)置可供訪問(wèn)級(jí)別
3,assign,setter方法直接賦值,不進(jìn)行任何retain操作,為了解決原類(lèi)型與環(huán)循引用問(wèn)題4,retain,setter方法對(duì)參數(shù)進(jìn)行release舊值再retain新值,所有實(shí)現(xiàn)都是這個(gè)順序(CC上有相關(guān)資料)
5,copy,setter方法進(jìn)行Copy操作,與retain處理流程一樣,先舊值release,再Copy出新的對(duì)象,retainCount為1。這是為了減少對(duì)上下文的依賴(lài)而引入的機(jī)制。
6,nonatomic,非原子性訪問(wèn),不加同步,多線程并發(fā)訪問(wèn)會(huì)提高性能。注意,如果不加此屬性,則默認(rèn)是兩個(gè)訪問(wèn)方法都為原子型事務(wù)訪問(wèn)。鎖被加到所屬對(duì)象實(shí)例級(jí)(我是這么理解的…)。
7,@synthesize xxx; 來(lái)實(shí)現(xiàn)實(shí)際代碼
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],執(zhí)行結(jié)果是2,5
&a+1不是首地址+1,系統(tǒng)會(huì)認(rèn)為加一個(gè)a數(shù)組的偏移,是偏移了一個(gè)數(shù)組的大?。ū纠?個(gè)int)
int ptr=(int )(&a+1);
則ptr實(shí)際是&(a[5]),也就是a+5
原因如下:
&a是數(shù)組指針,其類(lèi)型為 int ()[5];
而指針加1要根據(jù)指針類(lèi)型加上一定的值,不同類(lèi)型的指針+1之后增加的大小不同。
a是長(zhǎng)度為5的int數(shù)組指針,所以要加 5sizeof(int)
所以ptr實(shí)際是a[5]
但是prt與(&a+1)類(lèi)型是不一樣的(這點(diǎn)很重要)
所以prt-1只會(huì)減去sizeof(int)
a,&a的地址是一樣的,但意思不一樣
a是數(shù)組首地址,也就是a[0]的地址,&a是對(duì)象(數(shù)組)首地址,
a+1是數(shù)組下一元素的地址,即a[1],&a+1是下一個(gè)對(duì)象的地址,即a[5].
文/孫國(guó)慶(簡(jiǎn)書(shū)作者)
原文鏈接:http://www.itdecent.cn/p/c6062811f32a
著作權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),并標(biāo)注“簡(jiǎn)書(shū)作者”。
C:
C語(yǔ)言中,內(nèi)存中的棧是什么?如果我要?jiǎng)?chuàng)建一個(gè)大數(shù)組,應(yīng)該如何創(chuàng)建?
鏈表和數(shù)組的區(qū)別
如何根據(jù)函數(shù)參數(shù)動(dòng)態(tài)創(chuàng)建一個(gè)數(shù)組,并將數(shù)組中的元素全部設(shè)為0?
野指針是什么,如何避免
OC:
屬性中copy這個(gè)關(guān)鍵字
KVO用過(guò)嗎,什么時(shí)候用,如何手動(dòng)觸發(fā)KVO
類(lèi)目和繼承有哪些區(qū)別,它們?cè)谥貙?xiě)一個(gè)方法的時(shí)候有怎樣的區(qū)別
同時(shí)重寫(xiě)一個(gè)屬性的getter和setter會(huì)有怎樣的問(wèn)題?
OC高級(jí)
解釋一下GCD中的同步和異步有什么區(qū)別?
說(shuō)一個(gè)你遇到過(guò)的內(nèi)存泄漏的例子,你是如何發(fā)現(xiàn)并解決的?
如何用GCD實(shí)現(xiàn):5個(gè)任務(wù)并行執(zhí)行,然后在5個(gè)都結(jié)束的時(shí)候執(zhí)行一個(gè)新的任務(wù)
說(shuō)一下MVVM的工作原理,它解決了什么問(wèn)題?
autorelease什么時(shí)候釋放的
runtime:
如何為類(lèi)目添加屬性
isKindOfClass和isMemberOfClass有什么區(qū)別?
解釋一下isa指針和IMP指針
什么是method swizzling,用它來(lái)解決什么問(wèn)題
runloop:
以+ scheduledTimerWithTimeInterval...的方式觸發(fā)的timer,在滑動(dòng)頁(yè)面上的列表時(shí),timer會(huì)暫定回調(diào),為什么?如何解決?
UI:
addChildViewController用過(guò)嗎,一般什么時(shí)候會(huì)用?需要注意哪些問(wèn)題?
viewDidLoad什么時(shí)候調(diào)用?
UIScrollView的contentOffset可不可以停在超出contentSize大小限制的地方?
bounds和frame的區(qū)別
響應(yīng)者鏈?zhǔn)鞘裁礀|西?如何工作的?如何處理手勢(shì)沖突?
動(dòng)畫(huà)和繪圖:
CALayer和持有它的那個(gè)UIView之間是怎樣的關(guān)系?
modelLayer和presentationLayer是如何工作的?
使用動(dòng)畫(huà)移動(dòng)一個(gè)UIButton,在動(dòng)畫(huà)的過(guò)程中,這個(gè)Button可以被點(diǎn)擊嗎?如果要實(shí)現(xiàn)Button在動(dòng)畫(huà)的過(guò)程中可以隨時(shí)被點(diǎn)擊,應(yīng)該怎樣實(shí)現(xiàn)?
CADisplayLink有什么用?它和NSTimer在Runloop中的表現(xiàn)有無(wú)區(qū)別?有什么區(qū)別?
UITableView的優(yōu)化
數(shù)據(jù)持久化:
沙盒中的三個(gè)文件夾分別是什么,分別用來(lái)存放什么東西,分別說(shuō)明一下里面的數(shù)據(jù)在:1、應(yīng)用退出;2、iPhone重啟;3、應(yīng)用更新 以后會(huì)出現(xiàn)怎樣的變化
如果你要保存類(lèi)似QQ會(huì)話列表和聊天記錄的信息,你準(zhǔn)備使用哪種數(shù)據(jù)持久化方式?簡(jiǎn)要說(shuō)明一下原因和如何實(shí)現(xiàn)
網(wǎng)絡(luò):
簡(jiǎn)要描述一下TCP和UDP的區(qū)別
TCP的三次握手是怎樣進(jìn)行的
為什么我們的網(wǎng)絡(luò)請(qǐng)求基本上使用HTTP而不用TCP
其他:
簡(jiǎn)要描述一下即時(shí)通信的原理
SD的圖片緩存機(jī)制是如何實(shí)現(xiàn)的
APNs推送流程和原理