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) (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