1、iPhone5的屏幕分辨率大小為 1136* 640 ?
屏幕分辨率:用於量度位圖圖像內數據量多少的一個參數。通常表示成ppi(每英寸像素Pixel per inch)。屏幕物理尺寸不變,分辨率越高,每單位面積內包含的細節(像素點)越多。
2、structstrA { int a; float b; char c; } expA;
printf("%ld",sizeof(expA)); 輸出結果為 12 ?
該問題涉及編譯器的“內存對齊”問題:
現代計算機中內存空間都是按照byte(字節)劃分的,從理論上講似乎對任何類型的變量的訪問可以從任何地址開始,但實際情況是在訪問特定變量的時候經常在特定的內存地址訪問,這就需要各類型數據按照一定的規則在空間上排列,而不是順序的一個接一個的排放,這就是對齊。
對齊的作用和原因:各個硬件平台對存儲空間的處理上有很大的不同。一些平台對某些特定類型的數據只能從某些特定地址開始存取。其他平台可能沒有這種情況,但是最常見的是如果不按照適合其平台的要求對數據存放進行對齊,會在存取效率上帶來損失。比如有些平台每次讀都是從偶地址開始,如果一個int型(假設為 32位)如果存放在偶地址開始的地方,那麼一個讀周期就可以讀出,而如果存放在奇地址開始的地方,就可能會需要2個讀周期,並對兩次讀出的結果的高低 字節進行拼湊才能得到該int數據。顯然在讀取效率上下降很多。這也是空間和時間的博弈。
通常,我們寫程序的時候,不需要考慮對齊問題。編譯器會替我們選擇適合目標平台的對齊策略。當然,我們也可以通知給編譯器傳遞預編譯指令而改變對指定數據的對齊方法。
但是,正因為我們一般不需要關心這個問題,所以因為編輯器對數據存放做了對齊,而我們不了解的話,常常會對一些問題感到迷惑。最常見的就是struct數據結構的sizeof結果,出乎意料。
對於結構體來說,按成員中所占字節最大的是float類型,占用4個字節,一共有3個成員,所以總的占用字節為:4 * 3 = 12.
可通過編譯器命令來設定:
#progma pack (2) /*指定按2字節對齊*/
3、@property語法中readonly/readwrite,atomic/nonatomic的作用,@dynamic的作用?
@Property:Objective-C語言關鍵詞,與@synthesize配對使用。xcode4.5以及以後的版本,@synthesize可以省略。
功能:讓編譯器自動編寫一對與數據成員同名的方法聲明來省去讀寫方法的聲明。
聲明property的語法為:
@property (參數1,參數2) 類型 名字;
如:@property(nonatomic,retain) UIWindow*window;
其中參數主要分為三類:
讀寫屬性: (readwrite/readonly)
setter語意:(assign/retain/copy)
原子性: (atomicity/nonatomic)
各參數意義如下:
readwrite:同時產生setter\getter方法
readonly:只產生簡單的getter,沒有setter。
assign:默認類型,setter方法直接賦值,而不進行retain操作
retain:setter方法對參數進行release舊值,再retain新值。
copy:setter方法進行Copy操作,與retain一樣
atomic:原子性,它沒有一個如果你沒有對原子性進行一個聲明(atomic or nonatomic),那麼系統會默認你選擇的是atomic。
原子性就是說一個操作不可以被中途cpu暫停然後調度, 即不能被中斷, 要不就執行完, 要不就不執行. 如果一個操作是原子性的, 那麼在多線程環境下, 就不會出現變量被修改等奇怪的問題。原子操作就是不可再分的操作,在多線程程序中原子操作是一個非常重要的概念,它常常用來實現一些同步機制,同時也是一些常見的多線程Bug的源頭。當然,原子性的變量在執行效率上要低些。
關於異步與同步:並非同步就是不好,我們通常需要同時進行多個操作,這時使用異步,而對於程序來說,一般就是使用多線程,然而我們很多時候需要在多個線程間訪問共享的數據,這個時候又需要同步來保證數據的准確性或訪問的先後次序。當有多個線程需要訪問到同一個數據時,OC中,我們可以使用@synchronized(變量)來對該變量進行加鎖(加鎖的目的常常是為了同步或保證原子操作)。
nonatomic:非原子性,是直接從內存中取數值,因為它是從內存中取得數據,它並沒有一個加鎖的保護來用於cpu中的寄存器計算Value,它只是單純的從內存地址中,當前的內存存儲的數據結果來進行使用。在多線環境下可提高性能,但無法保證數據同步。
4、OSI(Open System Interconnection)開放式系統互聯參考模型 把網絡協議從邏輯上分為了7層,試列舉常見的應用層協議。
注意問的是應用層協議,有些同學直接答了七層模型。
應用層在開放系統互連(OSI)模型中的最高層,為應用程序提供服務以保證通信,但不是進行通信的應用程序本身。
Telnet協議是TCP/IP協議族中的一員,是Internet遠程登陸服務的標准協議和主要方式。它為用戶提供了在本地計算機上完成遠程主機工作的能力。
FTP文件傳輸協議是TCP/IP網絡上兩台計算機傳送文件的協議,FTP是在TCP/IP網絡和INTERNET上最早使用的協議之一,它屬於網絡協議組的應用層。
超文本傳輸協議 (HTTP-Hypertext transferprotocol) 是分布式,協作式,超媒體系統應用之間的通信協議。是萬維網(world wide web)交換信息的基礎。
SMTP(SimpleMail Transfer Protocol)即簡單郵件傳輸協議,它是一組用於由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式,它幫助每台計算機在發送或中轉信件時找到下一個目的地。
時間協議(TIME protocol)是一個在RFC 868內定義的網絡協議。它用作提供機器可讀的日期時間資訊。
DNS 是域名系統 (Domain Name System) 的縮寫,是因特網的一項核心服務,它作為可以將域名和IP地址相互映射的一個分布式數據庫。
SNMP(Simple Network Management Protocol,簡單網絡管理協議)的前身是簡單網關監控協議(SGMP),用來對通信線路進行管理。
TFTP(TrivialFile Transfer Protocol,簡單文件傳輸協議)是TCP/IP協議族中的一個用來在客戶機與服務器之間進行簡單文件傳輸的協議,提供不復雜、開銷不大的文件傳輸服務。端口號為69。
5、網絡傳輸層協議中,基於TCP/IP協議和UDP/IP的連接有什麼區別?
TCP:TransmissionControl Protocol 傳輸控制協議TCP是一種面向連接(連接導向)的、可靠的、基於字節流的運輸層(Transport layer)通信協議,由IETF的RFC 793說明(specified)。
UDP 是UserDatagram Protocol的簡稱, 中文名是用戶數據包協議,是 OSI 參考模型中一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務,IETF RFC 768是UDP的正式規范。
面向連接:是指通信雙方在通信時,要事先建立一條通信線路,其有三個過程:建立連接、使用連接和釋放連接。電話系統是一個面向連接的模式,撥號、通話、掛機;TCP協議就是一種面向連接的協議。
面向無連接:是指通信雙方不需要事先建立一條通信線路,而是把每個帶有目的地址的包(報文分組)送到線路上,由系統自主選定路線進行傳輸。郵政系統是一個無連接的模式,天羅地網式的選擇路線,天女散花式的傳播形式;IP、UDP協議就是一種無連接協議。
6、簡述MVC模式中M、V、C分別指代什麼及發揮的作用?
MVC開始是存在於Desktop(桌面)程序中的,M是指數據模型,V是指用戶界面,C則是控制器,使用MVC的目的是將M和V的實現代碼分離。C存在的目的則是確保M和V的同步,一旦M改變,V應該同步更新。
視圖是用戶看到並與之交互的界面,視圖沒有真正的處理發生,不管這些數據是聯機存儲的還是一個雇員列表,作為視圖來講,它只是作為一種輸出數據並允許用戶操縱的方式。
模型表示企業數據和業務規則,模型返回的數據是中立的,就是說模型與數據格式無關,這樣一個模型能為多個視圖提供數據,由於應用於模型的代碼只需寫一次就可以被多個視圖重用,所以減少了代碼的重復性。
控制器接受用戶的輸入並調用模型和視圖去完成用戶的需求,控制器本身不輸出任何東西和做任何處理。它只是接收請求並決定調用哪個模型構件去處理請求,然後再確定用哪個視圖來顯示返回的數據。
7、聲明@property的語法中,retain、copy、assign的含義及作用?試寫出 @property中帶retain和assign關鍵字,通過@synthesize自動生成的的合成存取方法(set、get方法)的實現代碼。
getter分析:
@property (nonatomic, retain) test* aTest;
@property (nonatomic, copy) test* aTest;
等效代碼:
-(void)aTest {
return aTest;
}
========== 貌似我是分割線 ===========
@property (retain) test* aTest;
@property (copy) test* aTest;
等效代碼:
-(void)aTest
{
[aTest retain];
return [aTest autorelease];
}
setter分析:
@property (nonatomic, retain) test* aTest;
@property (retain) test* aTest;
等效於:
-(void)setaTest:(test *)newaTest {
if (aTest !=newaTest) {
[aTest release];
aTest =[newaTest retain];
}
}
========== 貌似我是分割線 ===========
@property (nonatomic, copy) test* aTest;
@property (copy) test* aTest;
等效於:
-(void)setaTest:(test *)newaTest {
if (aTest !=newaTest) {
[aTest release];
aTest =[newaTest copy];
}
}
8、iOS中有哪些回調機制,並作簡單的比較。
各種回調機制的比較:
1、目標動作對(Target-Action):當兩個對象之間有比較緊密的關系時,如視圖控制器與其下的某個視圖。比如UIButton可以使用addTarget:(id) action:(SEL)forControlEvents:(UIControlEvents)來添加目標動作方法。
2、代理(Delegate):也叫委托,當某個對象收到多個事件,並要求同一個對象來處理所有事件時。委托機制依賴於某個協議定義的方法來發送消息。
3、通告機制(Notification):當需要多個對象或兩個無關對象處理同一個事件時。
4、Block:適用於回調只發生一次的簡單任務。
9、列出在編碼中哪些編碼習慣有助於提高代碼質量、軟件性能和健壯性,減少程序崩潰。
#使用嚴格的命名規則(如匈牙利命名法)能夠避免不必要的類型轉換錯誤。
#在編碼前先設計好流程圖或使用偽代碼,清晰化整個設計意圖。
#對自己的代碼進行嚴格的單元測試(unittesting)。
單元測試是指對軟件中的最小可測試單元進行檢查和驗證。如C語言中單元指一個函數,Java裡單元指一個類,圖形化的軟件中可以指一個窗口或一個菜單等。總的來說,單元就是人為規定的最小的被測功能模塊。單元測試是在軟件開發過程中要進行的最低級別的測試活動,軟件的獨立單元將在與程序的其他部分相隔離的情況下進行測試。
#異常的處理
首先不要輕易使用異常的捕獲,其次要盡可能捕獲具體的異常。對於異常的處理最好能夠采用封裝的方式,大家統一使用。這樣可以保證異常處理的一致性也可以保證當異常出現時性能的穩定。
# 寫防御性的代碼,使用內省的方法檢查傳入的參數。
OC語言具備內省的方法,比如NSObject具有如下方法:
- (BOOL)isKindOfClass:(Class)aClass;
- (BOOL)isMemberOfClass:(Class)aClass;
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
- (BOOL)respondsToSelector:(SEL)aSelector;
#采用增量式的編程方式。
采用增量式編程和測試,會傾向於創建更小的方法和更具內聚性的類。你應該經常評估代碼質量,並不時的進行許多小調整,而不是一次修改許多東西。在寫了幾行代碼之後,就應該進行一次構建/測試。在沒有得到反饋時,你不要走的太遠。
#使用工具(如Instrument)來幫助檢查內存洩漏、過早釋放內存、CPU使用效率等問題。
#消除所有的編譯警告,警告就是錯誤。
10、JSON中{ }代表_____,[ ]代表_____,試將下面的JSON串用OC對象表示出來:
{"people": [
{ "firstName": "Brett","lastName":"McLaughlin", "email":"aaaa" },
{"firstName": "Jason","lastName":"Hunter", "email": "bbbb"},
{ "firstName":"Elliotte", "lastName":"Harold","email": "cccc" }
],
“location”:”中華人民共和國”
}
JSON中{}代表對象,數據結構為{key1:value1, key2:value2, key3: …… }
[ ]代表數組,與其他語言中的數組類似。
//
@interface People :NSObject
@property (nonatomic, copy)NSString* strFirstName;
@property (nonatomic, copy)NSString* strLastName;
@property (nonatomic, copy)NSString* strEmail;
@end
//
@interface JSonData :NSObject
@property (nonatomic,retain) NSMutableArray* arrPeople; // 存放People對象的數組
@property (nonatomic, copy)NSString* strLocation;
@end