在Obj-c中有沒(méi)有私有方法?私有變量?一般采用什么方法實(shí) 現(xiàn)?
objective-c – 類里面的方法只有兩種, 靜態(tài)方法和實(shí)例方法. 這 似乎就不是完整的面向?qū)ο罅?按照OO的原則就是一個(gè)對(duì)象只暴露有 用的東西. 如果沒(méi)有了私有方法的話, 對(duì)于一些小范圍的代碼重用 就不那么順手了. 在類里面聲名一個(gè)私有方法 @interfaceController : NSObject { NSString *something; } +(void)thisIsAStaticMethod;
-(void)thisIsAnInstanceMethod; @end
@interfaceController (private) -(void)thisIsAPrivateMethod; @end @private可以用來(lái)修飾私有變量
在Objective‐C中陕靠,所有實(shí)例變量默認(rèn)都是私有的严拒,所有實(shí)例方 法默認(rèn)都是公有的
?obj-c的優(yōu)缺點(diǎn) 答案:
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++ 可混合編程 缺點(diǎn):
1) 不支援命名空間
2) 不支持運(yùn)算符重載
3) 不支持多重繼承
4) 使用動(dòng)態(tài)運(yùn)行時(shí)類型哗伯,所有的方法都是函數(shù)調(diào)用贰您,所以很多
編譯時(shí)優(yōu)化方法都用不到。(如內(nèi)聯(lián)函數(shù)等)狠毯,性能低劣。
a) int a; // Aninteger
b) int *a; // A pointer to aninteger
c) int **a; // A pointer to apointer to an integer
d) int a[10]; // An array of10 integers
e) int *a[10]; // An array of10 pointers to integers
f) int (*a)[10]; // A pointerto an array of 10 integers
g) int (*a)(int); // A pointerto a function a that takes an integer argument and returns aninteger
h) int (*a[10])(int); // Anarray of 10 pointers to functions that take an integer argument andreturn an integer
53.HTTP協(xié)議中,POST和GET的區(qū)別是什么?
答案:1.GET 方法
GET 方法提交數(shù)據(jù)不安全嫌变,數(shù)據(jù)置于請(qǐng)求行,客戶端地址欄可見(jiàn); GET 方法提交的數(shù)據(jù)大小有限
GET 方法不可以設(shè)置書(shū)簽
POST 方法
POST 方法提交數(shù)據(jù)安全,數(shù)據(jù)置于消息主體內(nèi)五鲫,客戶端不可見(jiàn) POST 方法提交的數(shù)據(jù)大小沒(méi)有限制
POST 方法可以設(shè)置書(shū)簽
?iOS的系統(tǒng)架構(gòu)分為( 核心操作系統(tǒng)層 theCore OS layer )、( 核心服務(wù)層theCore Services layer )芭概、( 媒
體層 theMedia layer )和( Cocoa 界面服務(wù)層 the Cocoa Touch layer )四個(gè)層次赛不。
?控件主要響應(yīng)3種事件:( 基于觸摸的事件 )、( 基于 值的事件 )和( 基于編輯的事件 )罢洲。
. xib文件的構(gòu)成分為哪3個(gè)圖標(biāo)?都具有什么功能踢故。(10分) 答: File’sOwner 是所有 nib 文件中的每個(gè)圖標(biāo),它表示從 磁盤加載 nib 文件的對(duì)象;
First Responder 就是用戶當(dāng)前正在與之交互的對(duì)象;
View 顯示用戶界面;完成用戶交互;是 UIView 類或其子類惹苗。
?UIView與CLayer有什么區(qū)別(10分)?
答: 1.UIView 是 iOS 系統(tǒng)中界面元素的基礎(chǔ)殿较,所有的界面元 素都是繼承自它。它本身完全是由 CoreAnimation 來(lái)實(shí)現(xiàn)的桩蓉。它 真正的繪圖部分淋纲,是由一個(gè) CALayer 類來(lái)管理。 UIView 本身 更像是一個(gè) CALayer 的管理器院究,訪問(wèn)它的跟繪圖和跟坐標(biāo)有關(guān)的 屬性洽瞬。
?UIView 有個(gè)重要屬性 layer 本涕,可以返回它的 主 CALayer 實(shí)例。
?UIView 的 CALayer 類似 UIView 的子 View 樹(shù)形結(jié)構(gòu)伙窃, 也可以向它的 layer 上添加子layer 菩颖,來(lái)完成某些特殊的表示。 即 CALayer 層是可以嵌套的为障。
UIView 的 layer 樹(shù)形在系統(tǒng)內(nèi)部晦闰,被維護(hù)著三份 copy 。 分別是邏輯樹(shù)鳍怨,這里是代碼可以操縱的;動(dòng)畫(huà)樹(shù)呻右,是一個(gè)中間層,系 統(tǒng)就在這一層上更改屬性京景,進(jìn)行各種渲染操作;顯示樹(shù)窿冯,其內(nèi)容就是 當(dāng)前正被顯示在屏幕上得內(nèi)容。
?動(dòng)畫(huà)的運(yùn)作:對(duì) UIView 的 subLayer (非主 Layer ) 屬性進(jìn)行更改确徙,系統(tǒng)將自動(dòng)進(jìn)行動(dòng)畫(huà)生成醒串,動(dòng)畫(huà)持續(xù)時(shí)間的缺省值似 乎是 0.5 秒。
?坐標(biāo)系統(tǒng): CALayer 的坐標(biāo)系統(tǒng)比 UIView 多了一
個(gè) anchorPoint 屬性鄙皇,使用CGPoint 結(jié)構(gòu)表示芜赌,值域是 0~1 , 是個(gè)比例值伴逸。這個(gè)點(diǎn)是各種圖形變換的坐標(biāo)原點(diǎn)缠沈,同時(shí)會(huì)更
改 layer 的 position 的位置,它的缺省值是 {0.5,0.5} 错蝴, 即在 layer 的中央洲愤。
?渲染:當(dāng)更新層,改變不能立即顯示在屏幕上顷锰。當(dāng)所有的層都 準(zhǔn)備好時(shí)柬赐,可以調(diào)用setNeedsDisplay 方法來(lái)重繪顯示。
?變換:要在一個(gè)層中添加一個(gè) 3D 或仿射變換官紫,可以分別設(shè) 置層的 transform 或affineTransform 屬性肛宋。
?變形: QuartzCore 的渲染能力,使二維圖像可以被自由操 縱束世,就好像是三維的酝陈。圖像可以在一個(gè)三維坐標(biāo)系中以任意角度被旋 轉(zhuǎn),縮放和傾斜毁涉。 CATransform3D 的一套方法提供了一些魔術(shù)般 的變換效果沉帮。
?Quatrz 2D的繪圖功能的三個(gè)核心概念是什么并簡(jiǎn)述其作用(10 分)。
答:上下文:主要用于描述圖形寫入哪里; 路徑:是在圖層上繪制的內(nèi)容; 狀態(tài):用于保存配置變換的值、填充和輪廓遇西, alpha 值等馅精。
?iPhone OS主要提供了幾種播放音頻的方法(10分)? 答: SystemSound Services
AVAudioPlayer 類
Audio Queue Services
OpenAL
使用AVAudioPlayer類調(diào)用哪個(gè)框架、使用步驟(10分)? 答: AVFoundation.framework
步驟:配置 AVAudioPlayer 對(duì)象;
實(shí)現(xiàn) AVAudioPlayer 類的委托方法;
控制 AVAudioPlayer 類的對(duì)象; 監(jiān)控音量水平;
回放進(jìn)度和拖拽播放粱檀。
?CFSocket使用有哪幾個(gè)步驟(10分)洲敢。
答:創(chuàng)建 Socket 的上下文;創(chuàng)建 Socket ;配置要訪問(wèn)的服務(wù) 器信息;封裝服務(wù)器信息;連接服務(wù)器;
?Core Foundation中提供了哪幾種操作Socket的方法(10分)? 答: CFNetwork 、 CFSocket 和 BSD Socket 茄蚯。
線程與進(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)程。
?ios 平臺(tái)怎么做數(shù)據(jù)的持久化?coredata 和sqlite有無(wú)必然 聯(lián)系?coredata是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)嗎?
iOS 中可以有四種持久化數(shù)據(jù)的方式:屬性列表琳钉、對(duì)象歸
檔势木、 SQLite3 和 Core Data; core data 可以使你以圖形界 面的方式快速的定義 app 的數(shù)據(jù)模型,同時(shí)在你的代碼中容易獲 取到它歌懒。 coredata 提供了基礎(chǔ)結(jié)構(gòu)去處理常用的功能跟压,例如保存, 恢復(fù)歼培,撤銷和重做,允許你在 app 中繼續(xù)創(chuàng)建新的任務(wù)茸塞。在使
用 coredata 的時(shí)候躲庄,你不用安裝額外的數(shù)據(jù)庫(kù)系統(tǒng),因?yàn)?core data 使用內(nèi)置的 sqlite 數(shù)據(jù)庫(kù)钾虐。 coredata 將你 app 的 模型層放入到一組定義在內(nèi)存中的數(shù)據(jù)對(duì)象噪窘。 coredata 會(huì)追蹤這 些對(duì)象的改變,同時(shí)可以根據(jù)需要做相反的改變效扫,例如用戶執(zhí)行撤銷 命令倔监。當(dāng) core data 在對(duì)你 app 數(shù)據(jù)的改變進(jìn)行保存的時(shí) 候直砂, coredata 會(huì)把這些數(shù)據(jù)歸檔,并永久性保存浩习。 macosx 中 sqlite 庫(kù)静暂,它是一個(gè)輕量級(jí)功能強(qiáng)大的關(guān)系數(shù)據(jù)引擎,也很容易嵌 入到應(yīng)用程序谱秽∏⒅可以在多個(gè)平臺(tái)使用, sqlite 是一個(gè)輕量級(jí)的嵌 入式 sql 數(shù)據(jù)庫(kù)編程疟赊。與 core data 框架不同的
是郊供, sqlite 是使用程序式的, sql 的主要的 API 來(lái)直接操 作數(shù)據(jù)表近哟。 Core Data 不是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)驮审,也不是關(guān)系型數(shù) 據(jù)庫(kù)管理系統(tǒng) (RDBMS) 。雖然 Core Dta 支持SQLite 作為一 種存儲(chǔ)類型吉执,但它不能使用任意的 SQLite 數(shù)據(jù)庫(kù)疯淫。 Core
Data 在使用的過(guò)程種自己創(chuàng)建這個(gè)數(shù)據(jù)庫(kù)。 Core Data 支持對(duì) 一鼠证、對(duì)多的關(guān)系峡竣。
?獲取項(xiàng)目根路徑,并在其下創(chuàng)建一個(gè)名稱為userData 的目錄量九。 (10分)适掰。
// 獲取根路徑
NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirect ory,NSUserDomainMask,YES);
NSString *documentsDirectory = [paths objectAtIndex:];
// 創(chuàng)建文件系統(tǒng)管理器
NSFileManager *fileManager = [[NSFileManageralloc] init]; // 判斷userData 目錄是否存在 if(![fileManagerfileExistsAtPath:[NSStringstringWithFormat: @"%@/userData",documentsDirectory]]) {
// 不存在, 創(chuàng)建一個(gè)userData目錄 [fileManagercreateDirectoryAtPath:[NSStringstringWithFormat: @"%@/userData",documentsDirectory]withIntermediateDirectori es:falseattributes:nilerror:nil];
}
列舉幾種進(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è)與解除死鎖
進(jìn)程間通信的方式有______ (1)管道(Pipe):管道可用于具有親緣關(guān)系進(jìn)程間的通信固额,
允許一個(gè)進(jìn)程和另一個(gè)與它有共同祖先的進(jìn)程之間進(jìn)行通信眠蚂。 (2)命名管道(named pipe):命名管道克服了管道沒(méi)有名字
的限制,因此斗躏,除具有管道所具有的功能外逝慧,它還允許無(wú)親緣關(guān)系進(jìn) 程間的通信。命名管道在文件系統(tǒng)中有對(duì)應(yīng)的文件名。命名管道通過(guò) 命令mkfifo或系統(tǒng)調(diào)用mkfifo來(lái)創(chuàng)建笛臣。
(3)信號(hào)(Signal):信號(hào)是比較復(fù)雜的通信方式云稚,用于通知 接受進(jìn)程有某種事件發(fā)生,除了用于進(jìn)程間通信外沈堡,進(jìn)程還可以發(fā)送 信號(hào)給進(jìn)程本身;linux除了支持Unix早期信號(hào)語(yǔ)義函數(shù)sigal外静陈,還 支持語(yǔ)義符合Posix.1標(biāo)準(zhǔn)的信號(hào)函數(shù)sigaction(實(shí)際上,該函數(shù)是 基于BSD的踱蛀,BSD為了實(shí)現(xiàn)可靠信號(hào)機(jī)制窿给,又能夠統(tǒng)一對(duì)外接口,用 sigaction函數(shù)重新實(shí)現(xiàn)了signal函數(shù))率拒。
(4)消息(Message)隊(duì)列:消息隊(duì)列是消息的鏈接表崩泡,包括Posix 消息隊(duì)列system V消息隊(duì)列。有足夠權(quán)限的進(jìn)程可以向隊(duì)列中添加消 息猬膨,被賦予讀權(quán)限的進(jìn)程則可以讀走隊(duì)列中的消息角撞。消息隊(duì)列克服了 信號(hào)承載信息量少,管道只能承載無(wú)格式字節(jié)流以及緩沖區(qū)大小受限 等缺
(5)共享內(nèi)存:使得多個(gè)進(jìn)程可以訪問(wèn)同一塊內(nèi)存空間勃痴,是最 快的可用IPC形式谒所。是針對(duì)其他通信機(jī)制運(yùn)行效率較低而設(shè)計(jì)的。往 往與其它通信機(jī)制沛申,如信號(hào)量結(jié)合使用劣领,來(lái)達(dá)到進(jìn)程間的同步及互斥。
(6)內(nèi)存映射(mapped memory):內(nèi)存映射允許任何多個(gè)進(jìn)程 間通信铁材,每一個(gè)使用該機(jī)制的進(jìn)程通過(guò)把一個(gè)共享的文件映射到自己 的進(jìn)程地址空間來(lái)實(shí)現(xiàn)它尖淘。
(7)信號(hào)量(semaphore):主要作為進(jìn)程間以及同一進(jìn)程不同 線程之間的同步手段。 (8)套接口(Socket):更為一般的進(jìn)程間通信機(jī)制著觉,可用于不同 機(jī)器之間的進(jìn)程間通信村生。起初是由Unix系統(tǒng)的BSD分支開(kāi)發(fā)出來(lái)的, 但現(xiàn)在一般可以移植到其它類Unix系統(tǒng)上:Linux和System V的變種 都支持套接字饼丘。
77.http和scoket通信的區(qū)別趁桃。 http是客戶端用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)求方式為客戶端主動(dòng)發(fā)起請(qǐng)求典徘,服務(wù)器才能給響應(yīng)忽肛, 一次請(qǐng)求完畢后則斷開(kāi)連接,以節(jié)省資源烂斋。服務(wù)器不能主動(dòng)給客戶端 響應(yīng)(除非采取http長(zhǎng)連接 技術(shù))。iphone主要使用類是 NSUrlConnection。 scoket是客戶端跟服務(wù)器直接使用socket“套接字”進(jìn)行連接汛骂,并沒(méi) 有規(guī)定連接后斷開(kāi)罕模,所以客戶端和服務(wù)器可以保持連接通道,雙方 都 可以主動(dòng)發(fā)送數(shù)據(jù)帘瞭。一般在游戲開(kāi)發(fā)或股票開(kāi)發(fā)這種要求即時(shí)性很強(qiáng) 并且保持發(fā)送數(shù)據(jù)量比較大的場(chǎng)合使用淑掌。主要使用類是CFSocketRef。 TCP全稱是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ù)的完整性檢查。
TCP和UDP的區(qū)別 TCP提供的是面向連接的桃犬、可靠的數(shù)據(jù)流傳輸刹悴,而UDP提供的
是非面向連接的、不可靠的數(shù)據(jù)流傳輸攒暇。 簡(jiǎn)單的說(shuō)土匀,TCP注重?cái)?shù)據(jù)安全,而UDP數(shù)據(jù)傳輸快點(diǎn)形用,但安全性一般
你了解svn,cvs等版本控制工具么?
版本控制 svn,cvs 是兩種版控制的器,需要配套相關(guān)的svn就轧,cvs服務(wù) 器。 scm是xcode里配置版本控制的地方尾序。版本控制的原理就是a和b同時(shí)開(kāi) 發(fā)一個(gè)項(xiàng)目钓丰,a寫完當(dāng)天的代碼之后把代碼提交給服務(wù)器, b要做的時(shí)候先從服務(wù)器得到最新版本每币,就可以接著做携丁。 如果a和b 都要提交給服務(wù)器,并且同時(shí)修改了同一個(gè)方法兰怠,就會(huì)產(chǎn)生代碼沖突梦鉴,
如果a先提交,那么b提交時(shí)揭保,服務(wù)器可以提示沖突的代碼肥橙,b可以 清晰的看到,并做出相應(yīng)的修改或融合后再提交到服務(wù)器秸侣。
.為什么很多內(nè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)冀惭。
通信底層原理 答:OSI七層模型
7 應(yīng)用層: ftp,smtp,http,telnet,tftp(通過(guò)各 種協(xié)議震叙,最終還是包裝成TCP數(shù)據(jù)包,發(fā)送到網(wǎng)絡(luò)中!)
6 表現(xiàn)層:
5 會(huì)話層:
4 傳輸層: tcp udp
3 網(wǎng)絡(luò)層: ip,ICMP,IGRP,EIGRP,OSPF,ARP 2 數(shù)據(jù)鏈路層: STP,VT
1 物理層:
82散休、objective-c 是所有對(duì)象間的交互是如何實(shí)現(xiàn)的? 在對(duì)象間交互中每個(gè)對(duì)象承擔(dān)的角色不同媒楼,但總的來(lái)說(shuō)無(wú)非就是”
數(shù)據(jù)的發(fā)送者”或”數(shù)據(jù)的接收者”兩種角色,我們可以通過(guò)代理去 進(jìn)行通信戚丸,或者通過(guò)觀察者消息模式划址,blocks,appdelegagte
TCP/IP 建立連接的過(guò)程?
在TCP/IP 協(xié)議中限府,TCP協(xié)議提供可靠的連接服務(wù)夺颤,采用三次握手建立 連接; 第一次握手:建立連接時(shí),客戶端發(fā)送連接請(qǐng)求到服務(wù)器胁勺,并進(jìn)入 SYN_SEND狀態(tài)世澜,等待服務(wù)器確認(rèn); 第二次握手:服務(wù)器收到客戶端連接請(qǐng)求,向客戶端發(fā)送允許連接應(yīng) 答署穗,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài); 第三次握手:客戶端收到服務(wù)器的允許連接應(yīng)答寥裂,向服務(wù)器發(fā)送確認(rèn)嵌洼, 客戶端和服務(wù)器進(jìn)入通信狀態(tài),完成三次握手封恰。
(所謂的三次握手咱台,就是要有三次連接信息的發(fā)送、接收過(guò)程俭驮。TCP 連的建立需要進(jìn)行三次連接信息的發(fā)送、接收春贸。)
如何引用一個(gè)已經(jīng)定義過(guò)的全局變量? extern
可以用引用頭文件的方式混萝,也可以用extern 關(guān)鍵字,如果用引用 頭文件的方式來(lái)引用某個(gè)在頭文件中的全局變量萍恕,假定你那個(gè)變量寫 錯(cuò)了逸嘀,那么編譯期間會(huì)報(bào)錯(cuò),如果用extern 方式引用時(shí)允粤,假定你犯 了同樣的錯(cuò)誤崭倘,那么在編譯期間不會(huì)報(bào)錯(cuò),而在連接期間報(bào)錯(cuò)类垫。
Objective-C如何對(duì)內(nèi)存管理的,說(shuō)說(shuō)你的看法和解決方法? Objective-C的內(nèi)存管理主要有三種方式ARC(自動(dòng)內(nèi)存計(jì)數(shù))司光、手
動(dòng)內(nèi)存計(jì)數(shù)、內(nèi)存池悉患。
1. (Garbage Collection)自動(dòng)內(nèi)存計(jì)數(shù):這種方式和java類似残家,
在你的程序的執(zhí)行過(guò)程中。始終有一個(gè)高人在背后準(zhǔn)確地幫你收拾垃 圾售躁,你不用考慮它什么時(shí)候開(kāi)始工作坞淮,怎樣工作。你只需要明白陪捷,我 申請(qǐng)了一段內(nèi)存空間回窘,當(dāng)我不再使用從而這段內(nèi)存成為垃圾的時(shí)候, 我就徹底的把它忘記掉市袖,反正那個(gè)高人會(huì)幫我收拾垃圾啡直。遺憾的是, 那個(gè)高人需要消耗一定的資源凌盯,在攜帶設(shè)備里面付枫,資源是緊俏商品所 以iPhone不支持這個(gè)功能。所以“Garbage Collection”不是本入門 指南的范圍驰怎,對(duì)“Garbage Collection”內(nèi)部機(jī)制感興趣的同學(xué)可以 參考一些其他的資料阐滩,不過(guò)說(shuō)老實(shí)話“Garbage Collection”不大適 合適初學(xué)者研究。
解決: 通過(guò)alloc – initial方式創(chuàng)建的, 創(chuàng)建后引用計(jì)數(shù)+1, 此后每retain一次引用計(jì)數(shù)+1, 那么在程序中做相應(yīng)次數(shù)的release 就好了.
2. (Reference Counted)手動(dòng)內(nèi)存計(jì)數(shù):就是說(shuō)县忌,從一段內(nèi)存被 申請(qǐng)之后掂榔,就存在一個(gè)變量用于保存這段內(nèi)存被使用的次數(shù)继效,我們暫 時(shí)把它稱為計(jì)數(shù)器,當(dāng)計(jì)數(shù)器變?yōu)?的時(shí)候装获,那么就是釋放這段內(nèi)存 的時(shí)候瑞信。比如說(shuō),當(dāng)在程序A里面一段內(nèi)存被成功申請(qǐng)完成之后穴豫,那 么這個(gè)計(jì)數(shù)器就從0變成1(我們把這個(gè)過(guò)程叫做alloc)凡简,然后程序B 也需要使用這個(gè)內(nèi)存,那么計(jì)數(shù)器就從1變成了2(我們把這個(gè)過(guò)程叫 做retain)精肃。緊接著程序A不再需要這段內(nèi)存了秤涩,那么程序A就把這個(gè) 計(jì)數(shù)器減1(我們把這個(gè)過(guò)程叫做release);程序B也不再需要這段內(nèi) 存的時(shí)候,那么也把計(jì)數(shù)器減1(這個(gè)過(guò)程還是release)司抱。當(dāng)系統(tǒng)(也
就是Foundation)發(fā)現(xiàn)這個(gè)計(jì)數(shù)器變成了0筐眷,那么就會(huì)調(diào)用內(nèi)存回收程 序把這段內(nèi)存回收(我們把這個(gè)過(guò)程叫做dealloc)。順便提一句习柠,如 果沒(méi)有Foundation匀谣,那么維護(hù)計(jì)數(shù)器,釋放內(nèi)存等等工作需要你手工 來(lái)完成资溃。
解決:一般是由類的靜態(tài)方法創(chuàng)建的, 函數(shù)名中不會(huì)出現(xiàn)alloc 或init字樣, 如[NSString string]和[NSArray arrayWithObject:], 創(chuàng)建后引用計(jì)數(shù)+0, 在函數(shù)出棧后釋放, 即相當(dāng)于一個(gè)棧上的局部 變量. 當(dāng)然也可以通過(guò)retain延長(zhǎng)對(duì)象的生存期.
?(NSAutoRealeasePool)內(nèi)存池:可以通過(guò)創(chuàng)建和釋放內(nèi)存池控制 內(nèi)存申請(qǐng)和回收的時(shí)機(jī).
解決:是由autorelease加入系統(tǒng)內(nèi)存池, 內(nèi)存池是可以嵌套 的, 每個(gè)內(nèi)存池都需要有一個(gè)創(chuàng)建釋放對(duì), 就像main函數(shù)中寫的一 樣. 使用也很簡(jiǎn)單, 比如[[[NSString alloc]initialWithFormat:@” Hey you!”] autorelease], 即將一個(gè)NSString對(duì)象加入到最內(nèi)層的 系統(tǒng)內(nèi)存池, 當(dāng)我們釋放這個(gè)內(nèi)存池時(shí), 其中的對(duì)象都會(huì)被釋放.
?block 實(shí)現(xiàn)原理 Objective-C是對(duì)C語(yǔ)言的擴(kuò)展武翎,block的實(shí)現(xiàn)是基于指針和函數(shù)
指針。 從計(jì)算語(yǔ)言的發(fā)展肉拓,最早的goto后频,高級(jí)語(yǔ)言的指針,到面向?qū)ο?/p>
語(yǔ)言的block暖途,從機(jī)器的思維卑惜,一步步接近人的思維,以方便開(kāi)發(fā)人 員更為高效驻售、直接的描述出現(xiàn)實(shí)的邏輯(需求)露久。
下面是兩篇很好的介紹block實(shí)現(xiàn)的博文 iOS中block實(shí)現(xiàn)的探究
談Objective-C Block的實(shí)現(xiàn)
3 block的使用
使用實(shí)例 cocoaTouch框架下動(dòng)畫(huà)效果的Block的調(diào)用 使用typed聲明block
typedef void(^didFinishBlock) (NSObject *ob); 這就聲明了一個(gè)didFinishBlock類型的block, 然后便可用
@property (nonatomic,copy) didFinishBlock finishBlock;
聲明一個(gè)blokc對(duì)象欺栗,注意對(duì)象屬性設(shè)置為copy毫痕,接到block 參 數(shù)時(shí),便會(huì)自動(dòng)復(fù)制一份迟几。
__block是一種特殊類型消请, 使用該關(guān)鍵字聲明的局部變量,可以被block所改變类腮,并且其
在原函數(shù)中的值會(huì)被改變臊泰。 4 常見(jiàn)系列面試題
面試時(shí),面試官會(huì)先問(wèn)一些蚜枢,是否了解block缸逃,是否使用過(guò)block针饥, 這些問(wèn)題相當(dāng)于開(kāi)場(chǎng)白,往往是下面一系列問(wèn)題的開(kāi)始需频,所以一定要 如實(shí)根據(jù)自己的情況回答丁眼。
1 使用block和使用delegate完成委托模式有什么優(yōu)點(diǎn)?
首先要了解什么是委托模式,委托模式在iOS中大量應(yīng)用昭殉,其在 設(shè)計(jì)模式中是適配器模式中的對(duì)象適配器苞七,Objective-C中使用id類 型指向一切對(duì)象,使委托模式更為簡(jiǎn)潔挪丢。了解委托模式的細(xì)節(jié):
iOS設(shè)計(jì)模式—-委托模式
使用block實(shí)現(xiàn)委托模式莽鸭,其優(yōu)點(diǎn)是回調(diào)的block代碼塊定義在委 托對(duì)象函數(shù)內(nèi)部,使代碼更為緊湊;
適配對(duì)象不再需要實(shí)現(xiàn)具體某個(gè)protocol吃靠,代碼更為簡(jiǎn)潔。
2 多線程與block
GCD與Block
使用 dispatch_async 系列方法足淆,可以以指定的方式執(zhí)行block GCD編程實(shí)例
dispatch_async的完整定義
void dispatch_async(
dispatch_queue_t queue,
dispatch_block_t block); 功能:在指定的隊(duì)列里提交一個(gè)異步執(zhí)行的block巢块,不阻塞當(dāng)前
線程 通過(guò)queue來(lái)控制block執(zhí)行的線程。主線程執(zhí)行前文定義的
finishBlock對(duì)象 dispatch_async(dispatch_get_main_queue(),^(void){finishBloc k();});
__block和__weak修飾符的區(qū)別其實(shí)是挺明顯的: 1.__block不管是ARC還是MRC模式下都可以使用巧号,可以修飾對(duì)象族奢,還 可以修飾基本數(shù)據(jù)類型。 2.__weak只能在ARC模式下使用丹鸿,也只能修飾對(duì)象(NSString)越走,不 能修飾基本數(shù)據(jù)類型(int)。 3.__block對(duì)象可以在block中被重新賦值靠欢,__weak不可以廊敌。
tableView 滑動(dòng)卡的問(wèn)題主要是因?yàn)?從緩存中或者是從本地讀取 圖片給UIImage的時(shí)候耗費(fèi)的時(shí)間。需要把下面的兩句話放到子線程 里面:
1NSData *imgData = [NSData dataWithContentsOfURL:[NSUR
L URLWithString:app.icon]]; //得到圖像數(shù)據(jù) 2UIImage *image = [UIImage imageWithData:imgData];
把UIImage賦值給圖片的時(shí)候在主線程门怪。
子線程不能更新UI 所有的UI跟新都是主線程執(zhí)行了骡澈。手指滑動(dòng)屏幕 了≈揽眨或者屏幕的某個(gè)方法執(zhí)行了肋殴。
子線程里面加入NSTimer 的時(shí)候需要 手動(dòng)添加NSRunloop 否則 不能循環(huán)。
單利里面添加 NSMutableArray 的時(shí)候坦弟,防止多個(gè)地方對(duì)它同時(shí)便利 和修改的話护锤,需要加原子屬性。并且用strong酿傍,烙懦,,并且寫一個(gè)遍歷 和修改的方法拧粪。加上鎖修陡。 Lock UnLock
__weak ViewController* weakSelf = self; GCD里面用 __weak 防止內(nèi)存釋放不了沧侥,循環(huán)引用。
id魄鸦、nil代表什么?
id和void *并非完全一樣宴杀。在上面的代碼中,id是指向struct objc_object的一個(gè)指針拾因,這個(gè)意思基本上是說(shuō)旺罢,id是一個(gè)指向任何 一個(gè)繼承了Object(或者NSObject)類的對(duì)象。需要注意的是id是一 個(gè)指針绢记,所以你在使用id的時(shí)候不需要加星號(hào)扁达。比如id foo=nil定義
了一個(gè)nil指針,這個(gè)指針指向NSObject的一個(gè)任意子類蠢熄。而id *foo=nil則定義了一個(gè)指針跪解,這個(gè)指針指向另一個(gè)指針,被指向的這 個(gè)指針指向NSObject的一個(gè)子類签孔。 nil和C語(yǔ)言的NULL相同叉讥,在objc/objc.h中定義。nil表示一個(gè) Objctive-C對(duì)象饥追,這個(gè)對(duì)象的指針指向空(沒(méi)有東西就是空)图仓。 首字母大寫的Nil和nil有一點(diǎn)不一樣,Nil定義一個(gè)指向空的類(是 Class但绕,而不是對(duì)象)救崔。 SEL是“selector”的一個(gè)類型,表示一個(gè)方法的名字 Method(我們常說(shuō)的方法)表示一種類型捏顺,這種類型與selector和實(shí) 現(xiàn)(implementation)相關(guān)
IMP定義為 id (*IMP)(id, SEL,...)六孵。這樣說(shuō)來(lái), IMP是 一個(gè)指向函數(shù)的指針幅骄,這個(gè)被指向的函數(shù)包括id(“self”指針)狸臣,調(diào) 用的SEL(方法名),再加上一些其他參數(shù).說(shuō)白了IMP就是實(shí)現(xiàn)方法昌执。
冒泡排序 main()
{
int i,j,temp;
int a[10];
for(i=0;i<10;i++)
scanf ("%d,",&a[i]);
for(j=0;j<=9;j++)
{ for (i=0;i<10-j;i++)
if (a[i]>a[i+1])
{ temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;}
}
for(i=1;i<11;i++)
printf("%5d,",a[i] );
printf("\n");
}
為什么很多內(nèi)置類烛亦,如UITableView的delegate屬性都是assign 而不是retain的?
如果是retain會(huì)引起循環(huán)引用 一個(gè)對(duì)象沒(méi)必要管理自己delegate的生命周期,或者說(shuō)沒(méi)必要擁有該 對(duì)象懂拾,所以我們只要知道它的指針就可以了煤禽,用指針找到對(duì)象去調(diào)用 方法,也就是委托實(shí)現(xiàn)的感覺(jué)岖赋。
或者我們換個(gè)角度檬果,從內(nèi)存管理方面也可以解釋這個(gè)問(wèn)題。delegate 的生命周期不需要讓該對(duì)象去控制,如果該對(duì)象對(duì)其使用retain很可 能導(dǎo)致delegate所指向的對(duì)象無(wú)法正確的釋放选脊。
視圖控制器的loadView方法是什么時(shí)候調(diào)用的? 視圖控制器的view被訪問(wèn)到杭抠,并且為nil時(shí),調(diào)用loadView方法創(chuàng)
建視圖
1.什么情況使用 weak 關(guān)鍵字恳啥,相比 assign 有什么不同? 什么情況使用 weak 關(guān)鍵字? 1)在ARC中,在有可能出現(xiàn)循環(huán)引用的時(shí)候,往往要通過(guò)讓其中一端使 用weak來(lái)解決,比如:delegate代理屬性 2)自身已經(jīng)對(duì)它進(jìn)行一次強(qiáng)引用,沒(méi)有必要再?gòu)?qiáng)引用一次,此時(shí)也會(huì) 使用weak,自定義IBOutlet控件屬性一般也使用weak;當(dāng)然偏灿,也可以 使用strong。
不同點(diǎn):
1)weak 此特質(zhì)表明該屬性定義了一種“非擁有關(guān)系” (nonowning relationship)钝的。為這種屬性設(shè)置新值時(shí)翁垂,設(shè)置方法既不保留新值, 也不釋放舊值硝桩。此特質(zhì)同assign類似沿猜, 然而在屬性所指的對(duì)象遭到 摧毀時(shí),屬性值也會(huì)清空(nil out)碗脊。 而 assign 的“設(shè)置方法”只 會(huì)執(zhí)行針對(duì)“純量類型”(scalartype啼肩,例如 CGFloat 或 NSlnteger 等)的簡(jiǎn)單賦值操作。
2)assigin 可以用非OC對(duì)象,而weak必須用于OC對(duì)象
這個(gè)寫法會(huì)出什么問(wèn)題: @property (strong) NSMutableArray *array;
使用了atomic屬性會(huì)嚴(yán)重影響性能衙伶。 該屬性使用了同步鎖疟游,會(huì)在創(chuàng)建時(shí)生成一些額外的代碼用于幫助編寫 多線程程序,這會(huì)帶來(lái)性能問(wèn)題痕支,通過(guò)聲明nonatomic可以節(jié)省這些 雖然很小但是不必要額外開(kāi)銷。 在默認(rèn)情況下蛮原,由編譯器所合成的方法會(huì)通過(guò)鎖定機(jī)制確保其原子性 (atomicity)卧须。如果屬性具備nonatomic特質(zhì)溉贿,則不使用同步鎖灌砖。請(qǐng)注 意,盡管沒(méi)有名為“atomic”的特質(zhì)(如果某屬性不具備nonatomic 特質(zhì)誊酌,那它就是“原子的”(atomic))蹦漠。 在iOS開(kāi)發(fā)中椭员,你會(huì)發(fā)現(xiàn),幾乎所有屬性都聲明為nonatomic笛园。 一般情況下并不要求屬性必須是“原子的”隘击,因?yàn)檫@并不能保證“線 程安全” ( thread safety),若要實(shí)現(xiàn)“線程安全”的操作研铆,還需 采用更為深層的鎖定機(jī)制才行埋同。例如,一個(gè)線程在連續(xù)多次讀取某屬 性值的過(guò)程中有別的線程在同時(shí)改寫該值棵红,那么即便將屬性聲明為 atomic凶赁,也還是會(huì)讀到不同的屬性值。
因此,開(kāi)發(fā)iOS程序時(shí)一般都會(huì)使用nonatomic屬性虱肄。但是在開(kāi)發(fā)Mac OS X程序時(shí)致板,使用 atomic屬性通常都不會(huì)有性能瓶頸。
AFNetworking或SDWebImage 里面給 UIImageView 加載圖片的邏 輯是什么樣的?
SDWebImage 中為 UIView 提供了一個(gè)分類叫做 WebCache, 這個(gè)分 類中有一個(gè)最常用的接口, sd_setImageWithURL:placeholderImage: , 這個(gè)分類同時(shí)提供了很 多類似的方法, 這些方法最終會(huì)調(diào)用一個(gè)同時(shí)具有 option progressBlock completionBlock 的方法, 而在這個(gè)類最終被調(diào)用 的方法首先會(huì)檢查是否傳入了 placeholderImage 以及對(duì)應(yīng)的參數(shù), 并設(shè)置 placeholderImage .
然后會(huì)獲取 SDWebImageManager 中的單例調(diào)用一個(gè) downloadImageWithURL:... 的方法來(lái)獲取圖片, 而這個(gè) manager 獲取圖片的過(guò)程有大體上分為兩部分, 它首先會(huì)在 SDWebImageCache 中尋找圖片是否有對(duì)應(yīng)的緩存, 它會(huì)以 url 作為 數(shù)據(jù)的索引先在內(nèi)存中尋找是否有對(duì)應(yīng)的緩存, 如果緩存未命中就 會(huì)在磁盤中利用 MD5 處理過(guò)的 key 來(lái)繼續(xù)查詢對(duì)應(yīng)的數(shù)據(jù), 如果 找到了, 就會(huì)把磁盤中的緩存?zhèn)浞莸絻?nèi)存中.
然而, 假設(shè)我們?cè)趦?nèi)存和磁盤緩存中都沒(méi)有命中, 那么 manager 就 會(huì)調(diào)用它持有的一個(gè) SDWebImageDownloader 對(duì)象的方法 downloadImageWithURL:... 來(lái)下載圖片, 這個(gè)方法會(huì)在執(zhí)行的過(guò)程 中調(diào)用另一個(gè)方法 addProgressCallback:andCompletedBlock:fotURL:createCallback: 來(lái)存儲(chǔ)下載過(guò)程中和下載完成的回調(diào), 當(dāng)回調(diào)塊是第一次添加的時(shí) 候, 方法會(huì)實(shí)例化一個(gè) NSMutableURLRequest 和 SDWebImageDownloaderOperation , 并將后者加入 downloader 持 有的下載隊(duì)列開(kāi)始圖片的異步下載.
而在圖片下載完成之后, 就會(huì)在主線程設(shè)置 image, 完成整個(gè)圖像 的異步下載和配置.
GCD 里面有哪幾種 Queue? 背后的線程模型是什么樣的?
GCD 中 Queue 的種類還要看我們?cè)趺催M(jìn)行分類, 如果根據(jù)同一時(shí)間 內(nèi)處理的操作數(shù)分類的話, GCD 中的 Queue 分為兩類
Serial Dispatch Queue
Concurrent Dispatch Queue
一類是串行派發(fā)隊(duì)列, 它只使用一個(gè)線程, 會(huì)等待當(dāng)前執(zhí)行的操作 結(jié)束后才會(huì)執(zhí)行下一個(gè)操作, 它按照追加的順序進(jìn)行處理. 另一類 是并行派發(fā)隊(duì)列, 它同時(shí)使用多個(gè)線程, 如果當(dāng)前的線程數(shù)足夠, 那么就不會(huì)等待正在執(zhí)行的操作, 使用多個(gè)線程同時(shí)執(zhí)行多個(gè)處理.
另外的一種分類方式如下:
Main Dispatch Queue
Global Dispatch Queue
Custom Dispatch Queue
主線程只有一個(gè), 它是一個(gè)串行的進(jìn)程. 所有追加到 Main Dispatch Queue 中的處理都會(huì)在 RunLoop 在執(zhí)行. Global Dispatch Queue 是所有應(yīng)用程序都能使用的并行派發(fā)隊(duì)列, 它有 4 個(gè)執(zhí)行優(yōu)先級(jí) High, Default, Low, Background. 當(dāng)然我們也可以 使用 dispatch_queue_create 創(chuàng)建派發(fā)隊(duì)列.
什么是iOS中的沙盒機(jī)制咏窿。 IOS中的沙盒機(jī)制(SandBox)是一種安全體系斟或,它規(guī)定了應(yīng)用程序只 能在為該應(yīng)用創(chuàng)建的文件夾內(nèi)讀取文件,不可以訪問(wèn)其他地方的內(nèi)容翰灾。 1.每個(gè)應(yīng)用程序都在自己的沙盒內(nèi) 2.不能隨意跨越自己的沙盒去訪問(wèn)別的應(yīng)用程序沙盒的內(nèi)容 3.應(yīng)用程序向外請(qǐng)求或接收數(shù)據(jù)都需要經(jīng)過(guò)權(quán)限認(rèn)證 默認(rèn)情況下缕粹,每個(gè)沙盒含有3個(gè)文件夾:Documents, Library 和 tmp。 因?yàn)閼?yīng)用的沙盒機(jī)制纸淮,應(yīng)用只能在幾個(gè)目錄下讀寫文件 Documents:蘋果建議將程序中建立的或在程序中瀏覽到的文件數(shù)據(jù) 保存在該目錄下平斩,iTunes備份和恢復(fù)的時(shí)候會(huì)包括此目錄 Library:存儲(chǔ)程序的默認(rèn)設(shè)置或其它狀態(tài)信息; Library/Caches:存放緩存文件,iTunes不會(huì)備份此目錄咽块,此目錄下 文件不會(huì)在應(yīng)用退出刪除
tmp:提供一個(gè)即時(shí)創(chuàng)建臨時(shí)文件的地方
nil, Nil, NSNULL, NULL區(qū)別 nil是指向obj-c中對(duì)象的空指針绘面,是一個(gè)對(duì)象,在o-c中ni對(duì)象調(diào) 用方法不會(huì)引起crash侈沪。 Nil是指向obj-c中的類的空指針揭璃,表示的是一個(gè)空類。 NULL是指向任何類型的空指針(如c/c++中的空指針)亭罪,在objective -c中是一個(gè)數(shù)值瘦馍。
NSNULL用于集合操作,在集合對(duì)象中应役,表示一個(gè)空值的集合對(duì)象情组。
96.iOS中處理音頻和視頻使用哪些框架?
AVFoundation(基于Core Audio、Core Video箩祥、Core Media等框架)院崇、
MediaPlayer、UIKit
如何監(jiān)聽(tīng)View的觸摸事件,事件是如何傳遞的袍祖、視圖的響應(yīng)者鏈?zhǔn)?什么? (1)覆寫View類的touchBegin底瓣、touchMove、touchEnd系列方法監(jiān)聽(tīng)視 圖的觸摸蕉陋。
(2)事件傳遞:當(dāng)觸摸一個(gè)視圖時(shí),首先系統(tǒng)會(huì)捕捉此事件,并為此事 件創(chuàng)建一個(gè)UIEvent對(duì) 象,將此對(duì)象加入當(dāng)前應(yīng)用程序的事件隊(duì)列中, 然后由UIApplication對(duì)象從隊(duì)列中,一個(gè)一個(gè)取出來(lái)進(jìn)行分發(fā),首首 先分發(fā)給UIWindow對(duì)象,然后由UIWindow對(duì)象分發(fā)給觸摸的視圖對(duì) 象,也就是第一響應(yīng)者對(duì)象捐凭。!
(3)響應(yīng)者鏈: 事件被交由第一響應(yīng)者對(duì)象處理,如果第一響應(yīng)者不 處理,事件被沿著響應(yīng) 者鏈向上傳遞,交給下一個(gè)響應(yīng)者(next responder)。一般來(lái)說(shuō),第一響應(yīng)者是個(gè)視圖對(duì) 象或者其子類對(duì)象, 當(dāng)其被觸摸后事件被交由它處理,如果它不處理,事件就會(huì)被傳遞給 它 的視圖控制器對(duì)象(如果存在),然后是它的父視圖(superview)對(duì) 象(如果存在),以 此類推,直到頂層視圖凳鬓。接下來(lái)會(huì)沿著頂層視圖 (top view)到窗口口(UIWindow對(duì)象)再 到程序(UIApplication對(duì) 象)柑营。如果整個(gè)過(guò)程都沒(méi)有響應(yīng)這個(gè)事件,該事件就被丟棄。一般 情 況下,在響應(yīng)者鏈中只要由對(duì)象處理事件,事件就停止傳遞村视。但有時(shí)候 可以在視圖的響應(yīng)?方方法中根據(jù)一些條件判斷來(lái)決定是否需要繼續(xù) 傳遞事件官套。
xml數(shù)據(jù)的解析方式,各有什么不同? (1)xml數(shù)據(jù)解析有兩種解析方方式:DOM解析與SAX解析! (2)DOM解析必須先完成DOM樹(shù)的構(gòu)造,在處理規(guī)模較大的XML文檔時(shí)就 很耗內(nèi)存,占用資 源較多!
(3)與DOM不同的是,它是用用事件驅(qū)動(dòng)模型,解析XMl文文檔時(shí)每遇 到一個(gè)開(kāi)始或者結(jié)束標(biāo) 簽、 或者屬性、或者一條指令時(shí),程序就產(chǎn)生生一個(gè)事件來(lái)進(jìn)行行相應(yīng)的處理,因此,SAX相對(duì)于 DOM來(lái)說(shuō)更適合 操作大的XML文檔!
設(shè)備狀態(tài)欄(Device Status Bar)是什么?高度如何?是否透明? 在手機(jī)通話或者導(dǎo)航狀態(tài)下奶赔,它是如何顯示的? 高度為20px惋嚎,iOS7開(kāi)始為透明狀態(tài),整合在導(dǎo)航欄(高度64px)中
通話或?qū)Ш綘顟B(tài)下站刑,高度變高為40px 100.Core Graphics 和Quartz 2D的區(qū)別?
quartz是一個(gè)通用的術(shù)語(yǔ)另伍,用于描述在IOS和MAC OS X ZHONG 整個(gè)媒 體層用到的多種技術(shù) 包括圖形、動(dòng)畫(huà)绞旅、音頻摆尝、適配。
Quart 2D 是一組二位繪圖和渲染API因悲,Core Graphic會(huì)使用到這組API
Quartz Core 專指Core Animation用到的動(dòng)畫(huà)相關(guān)的庫(kù)堕汞、API和類。
如何為APP添加啟動(dòng)頁(yè)? 使用LaunchScreen.xib或者Images.xcassets中添加LaunchImage
UIView的ContentMode是如何實(shí)現(xiàn)的? contentstretchmode的機(jī)理,當(dāng)view的bounds改變時(shí),ios的繪圖系
統(tǒng)只是簡(jiǎn)單的拉伸和重新排列緩存的layer圖像.
layer的層級(jí)結(jié)構(gòu)是什么? layer的層級(jí)和view相似,一個(gè)layer有多個(gè)sublayer,一個(gè)sublayer 只有一個(gè)最近的superlayer.
有一些方法控制layer的層級(jí)順序,同view相似: addsublayer;
insertsublayer: atindex(below/above); replacesublayer:with; removefromsuperlayer.
layer同時(shí)也有zposotion的屬性,擁有低的zposition的layer比高 的先繪制.當(dāng)有時(shí)使用sublayer不便控制層級(jí)時(shí),使用zpositon是個(gè) 很好的選擇.
如何確定layer的位置? 控制layer的位置使用兩個(gè)property. position 一個(gè)superlayer坐標(biāo)系下的坐標(biāo); anchorpoint 一個(gè)本身坐標(biāo)系下的坐標(biāo);
transform中晃琳,可以使用kvc執(zhí)行動(dòng)畫(huà)的屬性有哪些?
rotation.x, rotation.y, rotation.z, rotation (same
as rotation.z), scale.x, scale.y, scale.z, translation.x, translation.y, translation.z, and translation
在一個(gè)對(duì)象的方法里面:self.name= “object”;和 name =” object” 有什么不同嗎?
self.name =”object”:會(huì)調(diào)用對(duì)象的setName()方法;
name = “object”:會(huì)直接把object賦值給當(dāng)前對(duì)象的name屬性讯检。
請(qǐng)簡(jiǎn)述self.name= nil的機(jī)制,以及與[namerelease]的區(qū)別? self.name =nil; //使用nil參數(shù)調(diào)用setName:方法
[name release]生成的訪問(wèn)器將自動(dòng)釋放以前的name對(duì)象
使用sql語(yǔ)句查詢出省名以湖開(kāi)頭卫旱,郵編為436001所在的市區(qū)? (5分)(表名及字段名自定義)
select*fromcitys where postcode=436001 and province=’ 湖%’;
寫一” 標(biāo)準(zhǔn)”宏MIN 人灼,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè) 答:#define MIN(A,B) ((A) <= (B) ? (A) : (B)) 這個(gè)測(cè)試是為下面的目的而設(shè)的: 標(biāo)識(shí)#define在宏中應(yīng)用的基本知識(shí)。這是很重要的顾翼,因?yàn)橹钡角度?(inline)操作符變?yōu)闃?biāo)準(zhǔn)C的一部分投放,宏是方便產(chǎn)生嵌入代碼的唯一 方 法,對(duì)于嵌入式系統(tǒng)來(lái)說(shuō)适贸,為了能達(dá)到要求的性能灸芳,嵌入代碼經(jīng)常是 必須的方法。 三重條件操作符的知識(shí)取逾。這個(gè)操作符存在C語(yǔ)言中的原因是它使得編 譯器能產(chǎn)生比 if-then-else 更優(yōu)化的代碼,了解這個(gè)用法是很重 要的苹支。 懂得在宏中小心地把參數(shù)用括號(hào)括起來(lái) 我也用這個(gè)問(wèn)題 開(kāi)始討論宏的副作用砾隅,例如:當(dāng)你寫下面的代碼時(shí)會(huì)發(fā)生什么
事? least = MIN(*p++, b); 結(jié)果是:
((*p++) <= (b) ? (*p++) :(*p++))
這個(gè)表達(dá)式會(huì)產(chǎn)生副作用,指針p會(huì)作三次++自增操作债蜜。
const char *p; charconst*p; char*const p; const char* const p;四個(gè)修飾指針有什么區(qū)別
答: (1)定義了一個(gè)指向不可變的字符串的字符指針 (2)和(1)一樣 (3)定義了一個(gè)指向字符串的指針晴埂,該指針值不可改變,即不可改 變指向 (4)定義了一個(gè)指向不可變的字符串的字符指針寻定,且該指針也不可 改變指向