標籤:
一、軟體開發流程?
軟體設計思路和方法的一般過程,包括設計軟體的功能和實現的演算法和方法、軟體的總體結構設計和模組設計、編程和調試、程式聯調和測試以及編寫、提交程式。
1 相關係統分析員和使用者初步瞭解需求,然後用WORD列出要開發的系統的大功能模組,每個大功能模組有哪些小功能模組,對於有些需求比較明確相關的介面時,在這一步裡面可以初步定義好少量的介面。
2 系統分析員深入瞭解和分析需求,根據自己的經驗和需求用WORD或相關的工具再做出一份文檔系統的功能需求文檔。這次的文檔會清楚例用系統大致的大功能模組,大功能模組有哪些小功能模組,並且還例出相關的介面和介面功能。
3 系統分析員和使用者再次確認需求。
4 系統分析員根據確認的需求文檔所例用的介面和功能需求,用迭代的方式對每個介面或功能做系統的概要設計。
5 系統分析員把寫好的概要設計文檔給程式員,程式員根據所例出的功能一個一個的編寫。
6 測試編寫好的系統。交給使用者使用,使用者使用後一個一個的確認每個功能,然後驗收。
舉個例子來看:
1 某公司想找人訂做一套人事管理軟體,從某種渠道上得知我們有提供這種服務,所以聯絡上了我們。
2 我們會派專門的軟體工程師到他們那裡去瞭解我們要設計一個什麼的東西給他們用,然後回來做個方案給他們,其中方案的內容包括:我們開發出來的軟體大概的介面是怎樣?方便什麼人使用?什麼人可以使用什麼功能?方便到什麼程度?大概的硬體要求是怎樣等? (這一塊是在講需求從哪擷取的,感覺沒有必要說這麼複雜,就直接說產品經理從客戶那裡擷取產品需求)
3 他們看了方案後,確定他們就是要做一套這樣的軟體,我就開始開發這套軟體。
4 我們把開發出來的軟體交用他們使用,其中在使用的過程中哪裡使用不方便或哪裡達不到要求,我們會第第一時間修改這些功能,直到他們要求的所有功能都能很完美的解決掉。
二、項目流程?
項目立項-->需求分析-->總體設計-->詳細設計-->開發編程-->測試分析與系統整合-- >
1.需求分析:通過對客戶業務的瞭解和與客戶對流程的討論對需求進行基本建 模,最 終形成需求規格說明書。
2.總體設計:通過分析需求資訊,對系統的外部條件及內部業務需求進行抽象建模,最終形成概要設計說明文檔。
3.詳細設計:此部分在對需求和概要設計的基礎上進行系統的詳細設計(也包含部分代碼說明)。
4.開發編程:對系統進行代碼編寫。
5.測試分析與系統整合:對所有功能模組進行類比資料測試及其它相關性測試並整合所有模組功能。
6.現場支援:系統上線試運行進行現場問題記錄、解答。
7.系統運行支援:系統正式推產後,對系統進行必要的維護和BUG修改
三、APP發布的上架流程?
(1)在蘋果網站的開發人員中心,建立一個APP,填寫此APP相關的一些描述資訊
(2)下載安裝發布認證
(3)選擇發布認證,使用Archive編譯發布包
(4)使用Xcode提交發布包
一、認證匯出
需要一個蘋果的開發人員帳號,http://developer.apple.com
申請AppId
申請發布認證(p12格式)
產生provisioning檔案
二、Appcan.on線上ipa包編譯
三、Ipa包提交蘋果AppStore
四、演算法:遞迴、冒泡排序、選擇排序?
冒泡排序:(簡述思想和用法)
思想:兩兩比較待排序紀錄的關鍵字,發現兩個紀錄的次序相反時即進行交換,直到沒有反序的紀錄為止(從第一個數開始比較)
ina[9] = {12,32,43,23,45,23,12,56,78};
int index2 = 0;
for(int index1 = 0; index1<9; index1++){
//取出第(n+1)個數與前者進行比較
//比較完第一輪,將最大的數置頂,就好比是氣泡一樣
for (index2 = index1+1; index2<9; index2++){
int variable = 0;
if(a[index1]<a[index2]){
variable = a[index1];
a[index1] = a[index2];
a[index2] = variable;
}
}
}
插入排序
思想:在已經排好的序列中用順序法尋找插入位置,找到後將該位置原來的紀錄及其後面所有紀錄順序後移一個位置,空出該位置來插入新紀錄。(在已經排好的序列中從左向右遍曆,找到前一個數大於後一個數,將後一個小的數設為儲存值temp,從儲存值temp的前一個下標開始及其前面的數字與儲存值temp比較,如果此時這個數比儲存值大,則將這個數賦值給後一個數,把這個數空出來,繼續比較直到比儲存值小,然後將temp值賦值給後一個數。)
int i,j;
for(int i=0;i<9;i++){
if(a[i]<a[i-1]){
int temp = a[i];//找到小的值
for(int j=i-1; j>=0&&a[j]<temp; j--){ //把前面的數都於這個小的值進行比較,如果比temp大則位置後移。
a[j+1] = a[j];
}
a[j+1] = temp;
}
}
遞迴
能採用遞迴描述的演算法通常有這樣的特徵:為求解規模為N的問題,設法將它分解成規模較小的問題,然後從這些小問題的解方便地構造出大問題的解,並且這些規模較小的問題也能採用同樣的分解和綜合方法,分解成規模更小的問題,並從這些更小問題的解構造出規模較大問題的解。特別地,當規模N=1時,能直接得解。
例如:
【問題】 編寫計算斐波那契(Fibonacci)數列的第n項函數fib(n)。
斐波那契數列為:0、1、1、2、3、……,即:
fib(0)=0;
fib(1)=1;
fib(n)=fib(n-1)+fib(n-2) (當n>1時)。
寫成遞迴函式有:
int fib(int n){
if (n==0) return 0;
if (n==1) return 1;
if(n>1) return fib(n-1)+fib(n-2);
}
遞迴演算法的執行過程分遞推和迴歸兩個階段。在遞推階段,把較複雜的問題(規模為n)的求解推到比原問題簡單一些的問題(規模小於n)的求解。例如上例中,求解fib(n),把它推到求解fib(n-1)和fib(n-2)。也就是說,為計算fib(n),必須先計算fib(n-1)和fib(n-2),而計算fib(n-1)和fib(n-2),又必須先計算fib(n-3)和fib(n-4)。依次類推,直至計算fib(1)和fib(0),分別能立即得到結果1和0。在遞推階段,必須要有終止遞迴的情況。例如在函數fib中,當n為1和0的情況。
在迴歸階段,當獲得最簡單情況的解後,逐級返回,依次得到稍複雜問題的解,例如得到fib(1)和fib(0)後,返回得到fib(2)的結果,……,在得到了fib(n-1)和fib(n-2)的結果後,返回得到fib(n)的結果。
在編寫遞迴函式時要注意,函數中的局部變數和參數知識局限於當前調用層,當遞推進入“簡單問題”層時,原來層次上的參數和局部變數便被隱蔽起來。在一系列“簡單問題”層,它們各有自己的參數和局部變數。
由於遞迴引起一系列的函數調用,並且可能會有一系列的重複計算,遞迴演算法的執行效率相對較低。當某個遞迴演算法能較方便地轉換成遞推演算法時,通常按遞推演算法編寫程式。例如上例計算斐波那契數列的第n項的函數fib(n)應採用遞推演算法,即從斐波那契數列的前兩項出發,逐次由前兩項計算出下一項,直至計算出要求的第n項。
五、常見幾種設計模式:
MVC,委託(代理)匿名函數/閉包,觀察者(通知、KVO),單例
MVC:用模型傳遞的資料顯示在介面上
應用情境:是一中非常古老的設計模式,通過資料模型,控制器邏輯,視圖展示將應用程式進行邏輯劃分。
優勢:使系統,層次清晰,職責分明,易於維護
敏捷原則:對擴充開放-對修改封閉
執行個體:model-即資料模型,view-視圖展示,controller進行UI展現和資料互動的邏輯控制。
1、什麼是MVC,為什麼使用MVC,有什麼好處?
答: 分別為: 模型(Model),視圖(View)和控制Controller)。
模型(Model) “資料模型”(Model)用於封裝與應用程式的商務邏輯相關的資料以及對資料的處理方法。
“模型”有對資料直接存取的權力,例如對資料庫的訪問。
視圖(View) 視圖層能夠實現資料有目的顯示。
控制器(Controller) 控制器起到不同層面間的組織作用,用於控制應用程式的流程。
2.描述一下iOS SDK中如何?MVC的開發模式
答:MVC是:模型--視圖--控制 開發模式,對於iOS SDK,所有的View都是視圖層的,它應該獨立於模型層,由視圖控制層來控制。所有的使用者資料都是模型層,它應該獨立於視圖。所有的ViewController都是控制層,由它負責控制視圖,訪問模型資料
委託(代理)
應用情境:當一個類的某些功能需要由別的類來實現,但是又不確定具體會是哪個類實現。
優勢:解耦合
敏捷原則:開放-封閉原則
觀察者(通知、KVO)
應用情境:一般為model層對,controller和view進行的通知方式,不關心誰去接收,只負責發布資訊。
優勢:解耦合
敏捷原則:介面隔離原則,開放-封閉原則
執行個體:Notification通知中樞,註冊通知中樞,任何位置可以發送訊息,註冊觀察者的對象可以接收。
kvo,索引值對改變通知的觀察者,平時基本沒用過。
通知:
發送通知:
[ [NSNotificationCenter defaultCenter ] postNotificationName:通知名 object:附帶的資訊];
接受通知(觀察者):
[ [NSNotificationCenter defaultCenter] addObserver:註冊觀察者 selector:監聽到訊息後要做的事情 name:通知名 object: ];
KVO:
KVO的用法主要就涉及3個部分:
1.為對象的屬性註冊觀察者:對象通過調用下面這個方法為屬性添加觀察者
Object-c代碼
- - (void)addObserver:(NSObject *)observer
- forKeyPath:(NSString *)keyPath
- options:(NSKeyValueObservingOptions)options
- context:(void *)context
- observer: 觀察者對象. 其必須實現方法observeValueForKeyPath:ofObject:change:context:.
- keyPath: 被觀察的屬性,其不能為nil.
- options: 設定通知觀察者時傳遞的屬性值,是傳改變前的NSKeyValueObservingOptionOld,還是改變後的NSKeyValueObservingOptionNew.
- context: 一些其他的需要傳遞給觀察者的上下文資訊,通常設定為nil
2.觀察者接收通知,並做出處理:觀察者通過實現下面的方法,完成對屬性改變的響應:
Object-c代碼
- - (void)observeValueForKeyPath:(NSString *)keyPath
- ofObject:(id)object
- change:(NSDictionary *)change
- context:(void *)context
- keyPath: 被觀察的屬性,其不能為nil.
- object: 被觀察者的對象.
- change: 屬性值,根據上面提到的Options設定,給出對應的屬性值
- context: 上面傳遞的context對象。
3.清除觀察者:對象通過下面這個方法移除觀察者:
Object-c代碼
- - (void)removeObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath
單例
應用情境:確保程式運行期某個類,只有一份執行個體,用於進行資源共用控制。
優勢:使用簡單,延時求值,易於跨模組
敏捷原則:單一職責原則
例如:
在.h裡面聲明一個共用執行個體方法
+ (instancetype)sharedInstance;
在.m裡面
+ (instancetype)sharedInstance {
staticViewController *sharedInstance = nil;
// GCD 實現單例
staticdispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// alloc 方法分配記憶體控制項,單例保證只會alloc一次
sharedInstance = [[selfalloc] init];
});
return sharedInstance;
}
六、類目、延展、協議
類目(Category)
類目就是為已經存在的類添加新的方法。
但是不能添加執行個體變數。
Category的使用情境有那些呢:
1、類包含了很多個方法實現,而這些方法需要不同團隊的成員來實現
2、當你在使用基礎類庫中的類時,你不想繼承這些類而只想添加一些方法時。
Category能實現上面的需求,當然也有使用Category是需要注意的問題:
1、Category可以訪問原始類的執行個體變數,但不能添加執行個體變數,如果想添加變數,那就通過繼承建立子類來實現。
2、Category可以重載原始類的方法,不大不推薦這麼做,這樣會覆蓋掉原始類的方法。如果確實要重載,那就通過繼承建立子類來實現。
3、和普通介面有所區別的是,在Category的實現檔案中的執行個體方法只要你不去調用它你可以不用實現所有聲明的所有方法。
延展:在類的實現檔案.m中定義類目叫延展。
定義自己的私人方法
協議(Protocol)
協議聲明了可以被其他的類實現的方法,協議本身不會去實現。
協議不是類,只是一個其他對象可以實現的介面。
協議可以寫在一個類裡面,用到的時候引入類的標頭檔就可以。
@requried:必須實現的方法
@optional: 可選的實現方法
定義:@protocol 協議名 //(可選寫)<擴充的協議名(例如:NSObject)>
@end
一個協議可以擴充自另一個協議。
ios面試技巧