1、OC語言的基本特點 優缺點
objc優點:
1) Cateogies
2) Posing
3) 動態識別(多態用到才去識別)
4) 指標計算
5)彈性訊息傳遞
6) 不是一個過度復雜的 C 衍生語言
7) Objective-C 與 C++ 可混合編程
缺點:
1) 不支援命名空間
2) 不支持運算符重載
3)不支持多重繼承
4)使用動態運行時類型,所有的方法都是函數調用,所以很多編譯時優化方法都用不到。(如內聯函數等),性能低。
import會包含這個類的所有信息,包括實體變量和方法,而@class只是告訴編譯器。其后面聲明的名稱是類的名稱,至于這些類是如何定義的,暫時不用考慮,后面會再告訴你。
3、簡述類目優點和缺點,如果覆蓋本類或者父類的方法,會出現什么問題
優點:不需要通過增加子類而增加現有類的方法,且類目中的方法與原始類方法基本沒有區別
缺點:無法向類目中添加實例變量
出現的問題:覆蓋后原始類的方法沒辦法調用 注意這里不是方法重寫
MRC黃金法則:當你使用alloc、copy(mutableCopy)或者retain一個對象時。你必須使用相應的release或者autorelease將其釋放
ARC自動管理:自動引用計數
ARC我們稱之為自動引用計數,本質還是MRC只是在我們編寫代碼的時候不需要去手動釋放內存編譯器會自動管理內存
GC既內存垃圾回收機制 Mac10.8之后不再支持GC(移動端不存在GC)
從iOS和Android的內存使用情況來看ARC明顯好于GC
淺復制:只復制對象本身(指針地址),不對里面的屬性復制
深復制:不僅復制對象本身,(指針指向的地址),對象持有的屬性對象也做復制;
棧區(stack)由編譯器自動分配釋放,存放方法(函數)的參數值,局部變量的值等
堆取(heap)一般由程序員分配與釋放,如程序員不釋放,則內存溢出
靜態存儲區:內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。它主要存放靜態數據、全局數據和常量。
棧區:在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置于處理器的指令集中,效率很高,但是分配的內存容量有限。
堆區:亦稱動態內存分配。程序在運行的時候用malloc或new申請任意大小的內存,程序員自己負責在適當的時候用free或delete釋放內存。動態內存的生存期可以由我們決定,如果我們不釋放內存,程序將在最后才釋放掉動態內存。 但是,良好的編程習慣是:如果某動態內存不再使用,需要將其釋放掉,否則,我們認為發生了內存泄漏現象。
必須實現copying和mtableCopying協議,表示返回一個不可變和可變的對象。否則,程序會出現異常
- (id)copyWithZone:(NSZone *)zone{? ? Person *person=[[selfClass] allocWithZone:zone];? ? person->age=self.age;? ? person->name=self.name;returnperson;}- (id)mutableCopyWithZone:(NSZone *)zone{? ? Person *person=[[selfClass] allocWithZone:zone];? ? person->age=self.age;? ? person->name=self.name;returnperson;}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
9、strong與weak _unsafe_unretained與weak的區別
strong與weak:strong強引用,weak弱引用,在ARC中,使用strong告訴編譯器幫助我們自動插入reatin,weak是普通賦值相當于手動管理內存中的assign
_unsafe_unretained與weak:他們的功能一致,區別在于當指向對象銷毀后,weak會將變量直為nil,防止調用野指針
存在 當兩個強引用(strong)同時指向一塊內存的時候將釋放不掉
Person * p = [[Person alloc] init];NSMutableArray* arr = [[NSMutableArrayalloc] init];[arr addObject:p];
1
2
3
把對象從集合中移除的時候,也會釋放掉這個對象的強指針
[arr removeObject:p];
或者[arr removeAllObjects];
而接下來才是重點不進行下面的兩步p內存將不會被釋放
arr = nil;//如果不進行賦值為nil的操作,一樣存在內存溢出的現象,賦值為nil系統會對其進行清空所有強指針的操作.
p = nil;
自動釋放池是NSAutorelease類的一個實例,當向一個對象發送autorelease消息時,該對象會自動會自動入池,待銷毀時,將會向池中所有對象發送一條release消息,釋放對象
12、為什么delegate屬性都是assign而不是strong的?
防止循環引用,當簽署代理的時候如果使用strong就會造成相互持有,以至于對象無法釋放
plist文件、對象歸檔、sqlite3數據庫、coredata、NSUserDefault
KVC:鍵值編碼是一種間接訪問對象實例變量的機制,該機制不通過存取方法就可以訪問對象的實例變量
KVO:鍵值觀察是一種能使得對象獲取到其他對象屬性變化的通知機制。
關系:實現KVO模式被觀察的獨享必須使用KVC簡直編碼來修改它的實例變量,這樣才能被觀察者觀察到。因此KVC是KVO的基礎或者說KVO的實現是建立在KVC的基礎之上的。
單例、代理、通知、工廠、策略
16、內存管理在dealloc方法中,用release方法好還是用=nil好?
使用=nil方法更好,因為先調用了release方法,而且將變量置為nil,這樣就更安全的釋放對象,防止野指針調用
一般應用程序是單個進程,多個進程需要多個CPU,進程是靜態的容器,里面容納多個線程,線程是一些列方法的現行執行路徑。
18、delegate、Notification、block的使用區別
delegate與block一般用于兩個對象一對一之間的通信交互,delegate需要定義協議方法,代理對象實現協議方法,并且需要建立代理關系才可以實現通信,代理的好處是代碼的可讀性比較高,如果通信事件比較多的話,建議使用delegate。
block更加簡潔,不需要定義繁瑣的協議方法,而且由于block的機制我們可以直接使用局部變量
Notification主要用于一對多情況下通信,而且通信對象之間不需要建立關系。但是使用通知的代碼可讀性較差。
響應者鏈表示一個系列的響應者對象。事件被交由第一響應者對象處理,如果第一響應者不處理,事件被沿著響應者鏈向上傳遞,交給下一個響應者。一般來說,第一響應者是視圖對象或者子類對象,當其被觸摸后事件被交由它處理,如果它不處理,事件就會被傳遞給它的父視圖對象(如果存在),然后是它的視圖控制器(如果存在),以此類推,直到頂層視圖。接下來會沿著頂層視圖到窗口。再到程序。如果整個過程都沒有響應這個事件,該事件就會被丟棄。一般情況下在響應者鏈中只要由對象處理事件,事件就停止傳遞。但我們可以控制是否繼續傳遞。
static變量:表示變量是靜態存儲變量,表示變量存放在靜態存儲區
static函數:表示只在本文件中有效,別的文件中不能應用該函數
inta;//一個數值int*a;//一個指向數值的指針int**a;//一個指向指針的指針inta[10];//一個有10個指針的數組,該指針指向一個整型數組int*a[10];//一個有10個指針的數組,該指針指向一個整型數組int(*a)[10];//一個指向有10整型數的數組的指針int(*a)(int);//一個指向函數的指針,該函數有一個整型參數并返回一個整形數int(*a[10])(int);//一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數并返回一個整型值
1
2
3
4
5
6
7
8
9
實現文件的擴展名.m改成.mm即可。但cpp文件只能用c/c++代碼,而且cpp文件include的頭文件中,也不能出現oc的代碼,因為cpp只能寫c++的代碼
使用private修飾的全局變量是私有的變量
OC在語法上沒有私有方法,不過可以通過延展在實現文件里定義方法作為私有方法,但是 不是真正意義上的私有方法,也是可以調用的,只是外部不可見
const int a; a是一個常整型數
const int *a;a是一個指向常整型數的指針(也就是,整型數是不可修改的,但指針可以)
int *const a;a是一個指向整型數的常指針(也就是說,指針指向的整型數是可以修改的,但是指針是不可修改的)
extern可以置于變量或者函數前,以表示變量或者函數定義在別的文件中,提示編譯器遇到此變量和函數時在其他模塊中尋找其定義
C++語言在編譯的時候為了解決函數的多態問題,會將函數名和參數聯合起來生成一個中間的函數名稱,而C語言不會,這告訴編譯器,請保持我的名稱,不要給我生成用于連接的中間函數名
不同對象以自己的方式響應相同的消息的能力叫做多態
聲明的一個變量,在運行的時候綁定不同的對象,比如在方法的參數中聲明一個變量UIView *view,運行的時候我們可以根據不同的應用場景給view變量傳入不同的對象,可以傳一個UIButton,也可以傳入UIImageView對象。
UIKit、Foundation、CoreGraphic、CoreAnimation
音頻和視頻:Core Audio、OpenAL、Media Library、AV Foundation
數據管理:Core Data、SQLite
圖形和動畫:Core Animation OpenGL ES、Quartz 2D、Core Graphic
用戶應用:Address Book、Core Location、Map Kit、Store Kit
棧(Stack):是限定只能在表的一段進行插入和刪除操作的線性表。
隊列(Queue):是限定只能在表的一端進行插入和在另一端進行刪除操作的線性表。
隊列先進先出、棧先進后出;
遍歷速度不同。隊列遍歷數據快;
+(SingleCase *)sharedManager{staticSingleCase *ManagerInstance=nil;staticdispatch_once_tpredicate;dispatch_once(&predicate, ^{? ? ? ? ? ? ? ? ? ManagerInstance = [[selfalloc] init];? ? ? ? ? });returnManagerInstance;? }
單例設計是用來限制一個類只能創建一個對象,那么此對象中的屬性可以存儲全局的共享的數據,所有的類都可以訪問、設置此單例對象中的屬性數據
如果一個類創建的時候非常耗費性能,那么此類可以設置為單例節約性能
id可以理解為指向對象的指針。所有oc的對象 id都可以指向,編譯器不會做類型檢查,id調用任何存在的方法都不會在編譯階段報錯,當然如果這個id指向的對象沒有這個方法,該崩潰還是會崩潰的。
UIButton的父類是UIControl,UIControl的父類是UIView,UIView的父類是UIResponder,UIResponder的父類是NSObject
http狀態嗎 :302 是請求重定向。500以上是服務器錯誤。400以上是請求鏈接錯誤或者找不到服務器。200以上是正確。100以上是請求接受成功。
33、dispatch_group_async、dispatch_barrier_async、dispatch_apply分別是什么?
dispatch_group_async 可以實現監聽一組任務是否完成,完成后得到通知執行其他的操作。這個方法很有用,比如你執行三個下載任務,當三個任務都下載完成后你才通知界面說完成的了
dispatch_barrier_async 是在前面的任務執行結束后它才執行,而且它后面的任務等它執行完成之后才會執行
dispatch_apply 執行某個代碼片段N次。
nil和C語言的NULL相同,在objc/objc.h中定義。nil表示一個Objctive-C對象,這個對象的指針指向空(沒有東西就是空)。
首字母大寫的Nil和nil有一點不一樣,Nil定義一個指向空的類(是Class,而不是對象)。
AppDelegate作為UIApplication的委托,一般我們可以通過類方法[UIApplication shareApplication]來獲取對UIApplication,在UIApplication接收到系統事件和生命周期事件時,會把相應的事件傳遞給UIApplicationDelegate進行處理
cocoa是os開發環境 cocoa touch是iPhone開發環境
iBeacons是蘋果在2013年WWDC上推出一項基于藍牙4.0(Bluetooth LE | BLE | Bluetooth Smart)的精準微定位技術,當你的手持設備靠近一個Beacon基站時,設備就能夠感應到Beacon信號,范圍可以從幾毫米到50米。功耗相當小
38、iOS應用是如何實現后臺多任務處理(Multitasking)的?
ios7之后(一個app可以混合調用多種模式):Background Audio、VoIP、Location Services、Newsstand、Background Task Completion、Background Fetch 、Remote Notification、Background Transfer Service
除 UIKit 之外,Cocoa Touch 包含創建世界一流 iOS 應用程序所需的所有框架,從 3D 圖形、專業音頻到網絡,甚至提供特殊設備訪問 API 以控制攝像機或從 GPS 硬件獲取位置。Cocoa Touch 既包含只需要幾行代碼就可以完成全部任務的強大的 Objective-C 框架,也在需要時提供基礎的 C 語言 API 來直接訪問系統。這些框架示例包括:
Core Animation
通過 Core Animation,您就可以通過基于組合獨立圖層的簡單編程模型來創建豐富的用戶體驗。
Core Audio
Core Audio 是播放、處理和錄制音頻的專業級技術,能夠輕松為您的應用程序添加強大的音頻功能。
Core Data
Core Data 提供面向對象的數據管理解決方案,該方案易于使用和理解,甚至可處理任何應用或大或小的數據模型。
最大的區別是:UIview可以響應點擊事件CALayer不可以
圖層不會直接渲染到屏幕上,UIView是iOS系統中界面元素的基礎,所有的界面元素都是繼承自它。它本身完全由CoreAnimation來實現。他真正的繪圖部分,是由一個CALayer來管理。UIView本身更像一個CALayer的管理器。一個UIView可以有n個CALayer,每個layer顯示一種東西,增強UIView的展現能力
GCD是Apple開發的一個多核編程的較新的解決方法。在Mac OS X10.6中首次推出。GCD是一個替代諸如NSThread等技術很高效和強大的技術。GCD完全可以處理諸如數據鎖定和資源泄漏等復雜的異步編程問題。
TCP:傳輸控制協議,提供的是面向連接、可靠的字節流服務。當客戶和服務器彼此交換數據前,必須先在雙方之間建立一個TCP連接,之后才能傳輸數據。TCP提供超時重發,丟棄重復數據,檢驗數據,流量控制等功能,保證數據能從一端傳到另一端。 (MSN)
UDP:用戶數據報協議,是一個簡單的面向數據報的運輸層協議。UDP不提供可靠性,它只是把應用程序傳給IP層的數據報發送出去,但是并不能保證它們能到達目的地。由于UDP在傳輸數據報前不用在客戶和服務器之間建立一個連接,且沒有超時重發等機制,故而傳輸速度很快 (QQ)
簡單說,你瀏覽的網頁(網址以http://開頭)都是http協議傳輸到你的瀏覽器的, 而http是基于socket之上的。socket是一套完成tcp,udp協議的接口。
HTTP協議:簡單對象訪問協議,對應于應用層 ,HTTP協議是基于TCP連接的
tcp協議: 對應于傳輸層
ip協議: 對應于網絡層
TCP/IP是傳輸層協議,主要解決數據如何在網絡中傳輸;而HTTP是應用層協議,主要解決如何包裝數據。
Socket是對TCP/IP協議的封裝,Socket本身并不是協議,而是一個調用接口(API),通過Socket,我們才能使用TCP/IP協議。
**http連接:http連接就是所謂的短連接,即客戶端向服務器端發送一次請求,服務器端響應后連接即會斷掉;
socket連接:socket連接就是所謂的長連接,理論上客戶端和服務器端一旦建立起連接將不會主動斷掉;但是由于各種環境因素可能會是連接斷開,比如說:服務器端或客戶端主機down了,網絡故障,或者兩者之間長時間沒有數據傳輸,網絡防火墻可能會斷開該連接以釋放網絡資源**
Socket是一個針對TCP和UDP編程的接口,你可以借助它建立TCP連接等等。而TCP和UDP協議屬于傳輸層 。
而http是個應用層的協議,它實際上也建立在TCP協議之上。
(HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發動機,提供了網絡通信的能力。)
Socket是對TCP/IP協議的封裝,Socket本身并不是協議,而是一個調用接口(API),通過Socket,我們才能使用TCP/IP協議。Socket的出現只是使得程序員更方便地使用TCP/IP協議棧而已,是對TCP/IP協議的抽象,從而形成了我們知道的一些最基本的函數接口。
第一次握手:客戶端發送syn包到服務器,并計入SYN_SEND狀態,等待服務器的確認;
第二次握手:服務器收到syn包,必須確認客戶的SYN,同時自己也發送一個syn包,即SYN+ACK包,此時服務器進入SYN_RECY狀態;
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK,此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手
Frame指的是:該view在父view坐標系統中的位置和大小(參照點是父視圖的坐標系統)
Bounds指的是:該view在本身坐標系統中的位置和大小(參照點是本身的坐標系統)
MVC是一種架構設計,M數據模型model,V視圖View,C控制器controller
model:負責存儲定義操作數據
view:用來展示數據給用戶,和用戶進行操作交互
controller:是model與view的協調者,控制器獲取數據,將數據交給視圖展示
8、控制器的loadView方法是什么時候調用的,viewWillAperar什么時候調用
loadView:當控制器的根視圖View為空,且此view被訪問時調用
viewWillApear:當控制器根視圖view被添加到父視圖上時調用
當UIViewController的loadView被調用時,在此方法中,通過NSBundle加載Xib,先通過控制器的類名作為xib文件加載此xib文件。如果找到此xib文件,則加載為view對象作為控制器的根視圖,如果沒有xib文件,則通過alloc創建一個view對象作為根視圖
內存不足時。系統會調用控制器的didReceiveMemoryWarning方法通知控制器內存不足
當didReceiveMemoryWarning方法被調用的時候我們調用 self.view=nil方法釋放子視圖
11、如何監聽View的觸摸事件、事件是如何傳遞的、視圖的響應者鏈是什么?
監聽觸摸事件:覆寫view的touchBegain、touchMove、touchEnd系列方法監聽視圖的觸摸
事件的傳遞:當觸摸一個視圖時,首先系統會捕捉此事件,并為此事件創見一個UIEvent對象,將此對象加入到當前應用程序的時間隊列中。然后由UIWindow對象分發個觸摸的視圖對象,也就是第一響應者對象。
響應者鏈表示一個系列的響應者對象。事件被交由第一響應者對象處理,如果第一響應者不處理,事件被沿著響應者鏈向上傳遞,交給下一個響應者。一般來說,第一響應者是視圖對象或者子類對象,當其被觸摸后事件被交由它處理,如果它不處理,事件就會被傳遞給它的父視圖對象(如果存在),然后是它的視圖控制器(如果存在),以此類推,直到頂層視圖。接下來會沿著頂層視圖到窗口。再到程序。如果整個過程都沒有響應這個事件,該事件就會被丟棄。一般情況下在響應者鏈中只要由對象處理事件,事件就停止傳遞。但我們可以控制是否繼續傳遞。
特點:block中使用了局部對象,則此對象將會被retain,引用了當前對象的屬性或者方法,則會將當前對象retain
解決循環引用:將當前對象賦給一個局部變量,并且使用__block關鍵字修飾該局部變量,使用該變量訪問當前對象 的屬性和方法(__block typeof(self)weakself=self)
13、timer的間隔周期準嗎?為什么?怎樣實現一個精準的timer?
定時器timer一般都是準確的、但是當主線程有些時候出現阻塞(UI都是在主線程運行 加載視圖就會阻塞)的情況,這樣就可能導致timer會延遲。我們可以開辟子線程運行定時器
14、Http協議的特點,GET請求與POST請求的區別,什么事HTTPS協議
特點:短連接當服務端接收到請求并處理請求后關閉連接
區別:GET請求沒有請求體,POST含有請求體,請求參數可以放入請求體重所以POST可以提交大量的數據個服務器
HTTPS:安全超文本傳輸協議他是一個安全通信通道,它基于HTTP開發,用于客戶計算機和服務器之間交換信息。它使用安全套接字層(SSL)進行信息交換,簡單來說他是HTTP的安全版
15、xml數據解析方式,各有什么不同,json解析有哪些框架
解析方式:DOM解析與SAX解析
異同:DOM解析必須先完成DOM樹的構造,在處理較大的XML文檔時比較耗內存,占用資源較多SAX解析XML文檔時每遇到一個開始或者結束標簽或者屬性、或者一條指令時,程序就產生一個事件進行相應的處理,因此SAX對于DOM來說更適合操作大的XML文檔
iOS原生json解析框架:NSJSONSerialization
ASIHTTPRequest
優點:出來比較早、功能強大、文檔豐富
缺點:停止更新、新特性少、厚重
AFNetWorking
優點:支持比較新的特性、簡單易用
缺點:文檔數目一般、功能少、沒有同步請求
MKNetworkKit
優點:支持ARC、有ASIHTTPRequest的功能,AFNetWorking的輕便
缺點:有一些小bug
17、iOS中有哪些數據持久化的方式,各有什么特點,iOS平臺怎么做數據的持久化?CoreData和sqlite有沒有必然聯系?CoreData是一個關系型數據庫嗎?
方式:屬性列表、對象歸檔、SQLite數據庫、CoreData
iOS怎么持久化:混合使用
CoreData與sqlite是有聯系的,CoreData是對sqlite的封裝,因為sqlite是c語言的api,然而有人也需要oc 的api,所以有了 CoreData另外,CoreData不僅僅是把c的api翻譯成oc 的api,還提供了一些管理的功能,使用更加方便。
前言:在開發APP時,我們通常都會需要捕獲異常,防止應用程序突然的崩潰,防止給予用戶不友好的體驗。其實Objective-C的異常處理方法和JAVA的雷同,懂JAVA的朋友一看就懂。
以下程序已測試并通過:
設備:iOS 8模擬器中
開發工具:XCode6.1
使用@try、catch捕獲異常:
以下是最簡單的代碼寫法,其中@finally可以去掉:
@try{// 可能會出現崩潰的代碼}@catch(NSException *exception) {// 捕獲到的異常exception}@finally{// 結果處理}
在這里舉多一具比較詳細的方法,拋出異常:
@try{// 1[selftryTwo];}@catch(NSException*exception) {// 2NSLog(@"%s\n%@", __FUNCTION__, exception);//? ? ? ? @throw exception; // 這里不能再拋異常}@finally{// 3NSLog(@"我一定會執行");}// 4// 這里一定會執行NSLog(@"try");tryTwo方法代碼:
- (void)tryTwo{@try{// 5NSString*str = @"abc";? ? ? ? [str substringFromIndex:111];// 程序到這里會崩}@catch(NSException*exception) {// 6//? ? ? ? @throw exception; // 拋出異常,即由上一級處理// 7NSLog(@"%s\n%@", __FUNCTION__, exception);? ? }@finally{// 8NSLog(@"tryTwo - 我一定會執行");? ? }// 9// 如果拋出異常,那么這段代碼則不會執行NSLog(@"如果這里拋出異常,那么這段代碼則不會執行");}
為了方便大家理解,我在這里再說明一下情況:
如果6拋出異常,那么執行順序為:1->5->6->8->3->4
如果6沒拋出異常,那么執行順序為:1->5->7->8->9->3->4
2)部分情況的崩潰我們是無法避免的,就算是QQ也會有崩潰的時候。因此我們可以在程序崩潰之前做一些“動作”(收集錯誤信息),以下例子是把捕獲到的異常發送至開發者的郵箱。
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// Override point for customization after application launch.NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);returnYES;}voidUncaughtExceptionHandler(NSException *exception) {/**
*? 獲取異常崩潰信息
*/NSArray *callStack = [exception callStackSymbols];? ? NSString *reason = [exception reason];? ? NSString *name = [exception name];? ? NSString *content = [NSString stringWithFormat:@"========異常錯誤報告========\nname:%@\nreason:\n%@\ncallStackSymbols:\n%@",name,reason,[callStack componentsJoinedByString:@"\n"]];/**
*? 把異常崩潰信息發送至開發者郵件
*/NSMutableString *mailUrl = [NSMutableString string];? ? [mailUrl appendString:@"mailto:test@qq.com"];? ? [mailUrl appendString:@"?subject=程序異常崩潰,請配合發送異常報告,謝謝合作!"];? ? [mailUrl appendFormat:@"&body=%@", content];// 打開地址NSString *mailPath = [mailUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];? ? [[UIApplication sharedApplication] openURL:[NSURL URLWithString:mailPath]];}
iOS自帶單元測試框架OCUnit,但目前最好的測試框架應該是GHUnit
OC沒有多繼承,可以通過實現協議替代。OC是單繼承,所有的類全都繼承于NSObject,
但是在協議的遵守上卻允許使用多繼承。所以可以用協議來實現多繼承
上架流程:
1)在蘋果網站的開發者中心,新建一個APP,填寫此APP相關的一些描述信息
2)下載安裝發布證書
3)選擇發布證書,使用Archive編譯發布包
4)使用Xcode提交發布包
被打回:
1)訪問私有API
2)APP有嚴重的BUG
3)給蘋果審核的測試賬號無法登陸,或者境外無法訪問國內服務器
4)APP加載時間過長,iOS APP的最長啟動時間不得超過15秒
5)給出外部購買鏈接
6)APP描述中帶有”Beta“字樣,或者其他表明APP還未開發完成的信息
7)APP描述中提到了iOS之外的其他支持平臺
··········
如果屏幕上能顯示10個單元格,則tableView只會創建11個單元格(n+1),當滑倒第12個單元格時就會復用第一個單元格對象。tableView中有個復用池概念,tableView調用協議方法獲取單元格時,先從復用池中查找是否有可用的單元格如果有則復用,如果沒有則創建一個單元格對象
1)復用單元格
2)使用不透明的視圖,單元格中盡量少使用動畫
3)圖片加載使用異步加載,并且設置圖片加載的并發數
4)滑動式不加載圖片,停止滑動開始加載
5)文字、圖片可以直接drawInRect繪制
6)如非必要,減少reloadData全部cell,只reloadRowsAtInexPaths
7)如果cell是動態行高,計算高度后緩存
8)cell高度固定的話直接用cell.rowHeight設置高度
不支持ARC
Socket通信是通過TCP/IP協議,實現客戶端與服務器端之間的通信方式,客戶端通過三次握手與服務器建立可靠的連接,然后進行數據傳輸
runloop是線程相關的基礎框架的一部分。一個runloop就是一個事件處理的循環,用來不停地調度工作以及處理傳入事件,使用runloop的目的釋然你的線程在有工作的時候忙于工作,沒有工作的時候處于休眠狀態。
27、如何調用drawRect方法與layoutSubView方法,這兩個方法的作用
通過setNeedsLayout方法異步調用layoutSubView方法
通過setNeedsDisplay方法異步調用drawRect方法
drawRect方法用于繪圖,layoutSubView方法用于布局子視圖
二維碼生成:QRGener
二維碼掃描:zxing(自定義掃描區域)、ZBarSDK
iOS5:iCloud、定制UI、storyBoard、ARC、coreimage路徑,新增JSON解析類
其他:6、7、8、9新特性
優點:開發界面所見即所得,可以快速通過拖拽構造界面。
缺點:xib 對版本管理是災難,storyBoard是多個xib的集合一樣難以管理
新建一個Framework&Library的項目,編譯的時候,會將項目中的代碼打包成一個.a的靜態庫文件。
防止沖突:SVN不要多人同時修改同一個文件。例如A/B都修改同一個文件,先讓A修改,然后提交到服務器,然后B更新下來,在進行修改。Git服務器上的項目文件,僅讓一個人管理提交,其他人只更新。
其實斷點續傳的原理很簡單,就是在Http的請求上和一般的下載有所不同而已。 打個比方,瀏覽器請求服務器上的一個文時,所發出的請求如下: 假設服務器域名為w www.sjtu.edu.cn,文件名為down.zip。 GET /down.zip HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms- excel, application/msword, application/vnd.ms-powerpoint,/Accept-Language: zh-cn Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) Connection: Keep-Alive 服務器收到請求后,按要求尋找請求的文件,提取文件的信息,然后返回給瀏覽器,返回信息如下: 200 Content-Length=106786028 Accept-Ranges=bytes Date=Mon, 30 Apr 2001 12:56:11 GMT ETag=W/”02ca57e173c11:95b” Content-Type=application/octet-stream Server=Microsoft-IIS/5.0 Last-Modified=Mon, 30 Apr 2001 12:56:11 GMT 所謂斷點續傳,也就是要從文件已經下載的地方開始繼續下載。所以在客戶端瀏覽器傳給 Web服務器的時候要多加一條信息–從哪里開始。 下面是用自己編的一個”瀏覽器”來傳遞請求信息給Web服務器,要求從2000070字節開始。 GET /down.zip HTTP/1.0 User-Agent: NetFox RANGE: bytes=2000070- Accept: text/html, image/gif, image/jpeg,; q=.2,/*; q=.2 仔細看一下就會發現多了一行RANGE: bytes=2000070- 這一行的意思就是告訴服務器down.zip這個文件從2000070字節開始傳,前面的字節不用傳了。 服務器收到這個請求以后,返回的信息如下: 206 Content-Length=106786028 Content-Range=bytes 2000070-106786027/106786028 Date=Mon, 30 Apr 2001 12:55:20 GMT ETag=W/”02ca57e173c11:95b” Content-Type=application/octet-stream Server=Microsoft-IIS/5.0 Last-Modified=Mon, 30 Apr 2001 12:55:20 GMT 和前面服務器返回的信息比較一下,就會發現增加了一行: Content-Range=bytes 2000070-106786027/106786028 返回的代碼也改為206了,而不再是200了。 知道了以上原理,就可以進行斷點續傳的編程了。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{NSURL* url = [NSURLURLWithString:@"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"];? ? ? NSData * data = [[NSData alloc]initWithContentsOfURL:url];UIImage*image = [[UIImagealloc]initWithData:data];if(data !=nil) {dispatch_async(dispatch_get_main_queue(), ^{self.imageView.image= image;//當操作UI的時候回到主線程});? ? ? }? });