外行人如何在一個月時間內成為可以開發 App. 的獨立製作人?

有一個絕妙的點子,但是不會開發APP。怎麼在一個月時間內,從沒學過任何編程語言的小白,成為一個可以開發APP的獨立製作人?能夠獨立開發諸如ins這樣的APP。
好吧,那換個話題,樓主是外行人,怎麼從菜鳥開始學編程,包括電腦和APP的?如果有個清晰的線路圖,應該能少走不少浪費時間的彎路。

15-03-06添加:感謝大家的指導,只是有幾位前輩是不是沒看仔細我後來的意思。之前我是想一個月之內學會的,因為不太了解編程這個學科。後來發現不可能後就請教菜鳥怎麼從零開始學習。所以我的意思是「非科班出身的菜鳥怎樣從零開始學習編程」,而不是「菜鳥怎麼用一個月學成編程」。我不急著學成也確實智商平平,但自覺毅力尚可,之前用三年刷過了注會所以對學習編程有一點小信心,雖然知道兩者難度不可同日而語。
非常謝謝諸位啊。
@迷你悟空, 哈哈哈,謝謝大哥,肚子笑疼了,一語道出忽悠的重要性。
另:媽蛋怎麼知乎的戾氣和虎撲一樣重啊。

15-03-07添加:準備報個培訓班,北大青鳥是否可行?


多圖,注意流量.
--------------------------------
買幾本好書,坐電腦前不停的寫,廢寢忘食的寫,編程是世界上最容易的事,你還不用碰底層,先學學基本流程式控制制和調用API,然後理解下分層思想,這就能寫腳本了,然後有興趣有時間就研究底層,沒興趣就弄好一門語言,專心寫腳本開發好app,難度方面你可以放心,是個人就能學會,學不會是不可能的。
你要用java就研究好面向對象,一個月有點短但要是全力投入也不是不可能。
你知道自己學,這可比那些就差一個程序員的強太多了。
祝你成功,有問題可以私信我。
---------------------------------------------------------------
今天是第1天.
@題主
書買到了嗎?開發環境裝好了嗎?大體理解接下來29天要學習的內容了嗎?還有信心和意志力堅持下去嗎?
如果決定搞安卓開發,應該學習java.如果決定搞iOS開發,應該學習Obj-C.
這兩門語言是面向對象的語言.它們將程序看成一個個"對象"的互相作用,對象有自己的特徵和工作方法.
一個App有視圖,控制代碼和模塊三個部分.這被稱為MVC模型.
一個成熟的類似ins的App的開發,要實現移動終端上的程序(Client)和專用的伺服器上的程序(Server).
Client 和 Server通過IP協議上層的傳輸層協議(TCP或UDP)通信.
接下來29天,大體要學習的部分就是這些:1.程序開發基礎;2.MVC模型;3.網路編程相關知識.
如果想繼續學習,請私信我或留言.
Hope you will carry on your career.

The end of this section.
------------------------------------------------------------------------
第1.5天 說明下情況,以免新手被坑
鑒於下面有知友說想看後續,於是決定更新.
不過更新前必須交個實底,本人學生一名,之前只搞過MFC(可以理解成Windows窗體程序開發的一種方法),會資料庫操作和網路編程,上過計算機網路,自學過操作系統和數據結構.可以稱得上熟練掌握的編程語言只有c++.安卓和iOS開發都看過書,但掌握的不是很全面,實際經驗也很匱乏.
但這些開發的本質,個人看來是一樣的.並不會因為語言特性的些許不同和實際操作的一點區別而影響本質.因此希望通過更新這個答案也能鞏固自己的學習.
(說通俗點就是我是個大菜雞,非要裝成高手寫了這麼個東西...)
-------------------------------------------------------------------------
今天是第2天.
規定一下格式:斜體字是非必須看的,新手可以不看,粗體下劃線是必須掌握的概念.
程序開發語言主要分兩種:
0.面向過程式.(現在多數已經成為面向對象式的一部分,如C語言,在App開發中已經不常用)
1.面向對象式.(Java和Obj-C,C++都是面向對象的編程語言,這類型的語言在實際應用中最重要,必須學習掌握)
2.函數式.(陽春白雪,相對業務應用少一些,和App開發關係不大.如果在以後希望深入學習演算法等,可以考慮學習一門)

App開發的核心是程序的書寫.因此今天講面向對象編程思路.(注意,是"思路".具體的語法不會涉及太多)
面向對象的編程將"對象"(Object,物體)視為核心,對象的"動作"稱為方法,對象的屬性(特性)稱為成員變數.
如果用面向過程的視角來看,成員變數是特殊的變數.方法是特殊的函數.
可執行程序載入入計算機內存後擺放在三個地方:代碼段(用於保存函數中的命令),數據段(用於保存全局變數和常量),棧段(用於保存函數調用函數的關係,還有一些其他信息,如上下文切換,這裡沒必要不介紹).
變數的本質是一塊內存中的空間,能夠記錄一定形式的數據.
函數的本質是很多條指令,能夠被執行並讀取,計算,判斷,修改一些指定地址變數的值.

對象是方法和成員變數的集合.
類(class)是對象的集合.

是不是很抽象?舉個例子.
人類是一個"類",某一個具體的人A是這個類的對象,A的體重是變數.人有一個方法叫做吃(記住,方法就是函數,函數就是指令的集合,吃是一個動作,也就是一堆指令),通過執行"吃"這個方法可以改變人的體重.
如果還不明白(其實暫時不明白也正常),就拆解的更細緻一些:
類,就是某種對象的公共特徵,比如人,是個人就一定有體重這個屬性,因此體重是這個類的成員變數,這個類的每一個對象(具體的人),都有體重這個變數.
吃,就是這種對象都可以有的動作,是個人就可以吃,通過這個動作能改變一定的變數(比如人的體重等).
那麼怎麼用代碼實現呢?(注意,不同語言的代碼看起來不一樣,但是實際本質是一樣的.)
下面有人喊要我講Obj-C,那我就現學現賣了.
定義一個類.
@interface Human
{
int weight;
}
-void eat:(int)foodweightinKG;
@end

@implementation Human
-void eat:(int)foodweightinKG
{
weight=weight+0.15*foodweightinKG;
}
@end

這就實現了吃一公斤胖0.15公斤的人這個"類".
類,對象,函數,變數是以後開發的重要概念,必須熟練掌握.建議想學習的知友買本參考書,用於學習某門語言的語法.這個答案不可能特別具體的講解每一個語法,但如果有資料輔助的話學習起來是不難的.
如果從後面來看我的答案,建議看到這裡的時候找一些學習資料,學習一下某門具體語言的語法.這裡重要的是理解這個思路,就是通過控制"對象",修改對象的屬性,調用對象的方法來控制程序的行為.

The end of this section.
---------------------------------------------------------------------
今天是第3天.
今天主要講程序設計中的一些基本問題和概念.
有些問題要強調一下:
0.本人菜,能搞明白的只有c++,java會的相對比oc好一些,oc非常生疏.但基本原理都一樣.
1.看完這個基本上就有思路了,但還是要自己買書實踐.篇幅所限不可能內容太完備.如果有具體問題還是要自己查找資料,結合實踐解決.
2.這麼多贊確實出乎我意料,我會儘力更新.有問題也可以在下面提問,如果能解答的話我會儘力解答.
-----------------------
今天想告訴大家一些當初我在學MFC時候弄了很久才理解的很簡單的道理.
一.一個App,甚至一個窗口程序,絕大多數功能,都不是靠自己硬寫出來的,而是調用已有的庫函數,套用已有的類,加上中間業務邏輯的代碼,和自己的演算法實現(如果有).
就說最簡單的Hello,world 這個東西如果要從一無所有的裸機(沒有操作系統)上實現,必須得從頭寫向顯示緩衝區中寫數據的彙編指令(假設在8086上).
這個工作量顯然不小.但我們不需要這樣做.只需要調用系統自帶的庫函數就可以解決問題.
在Windows程序開發中,我們要畫一個窗口,即使用調用WindowsAPI的方法,也要寫幾十行代碼(註冊窗口類,設置屬性什麼的),最後ShowWindow(),才能顯示出來.這顯然不符合面向對象的設計原則,而且增加了完全不必要的複雜程度.
因此,絕大多數普通開發者(非底層開發者)的日常工作是:尋找一些適當的庫,調用這些庫中已有的代碼,來進行功能的實現.
因此後面講的網路編程,不是叫你從頭控制每個數據包里的每個欄位填什麼,而是只需採用適當的類(java有個Socket類,c++用socket函數從OS獲取句柄),調用其中的函數(bind,listen,connect,accept,send,recv,close/sendto,recvfrom等等)就可以了.
這就是一個非常重要的理念:分層模型.將複雜的邏輯分成多層來實現,上層只和自己緊挨著的下層交互,保證了層與層之間一定的獨立性,為複雜應用的開發提供了可能.
情況1.你的軟體比較複雜,應該用分層.
比如未來我們要開發一個小型社交軟體(假設),那麼首先我們要寫一個服務端,服務端要記錄用戶的信息,對話的信息.可以創建一個用戶類,用於記錄用戶的信息.再創建一個對話消息類,從高層上抽象用戶與伺服器發消息的過程,便於寫客戶端;再創建一個好友類,用於記錄用戶和朋友列表的對應關係(可以思考一下朋友列表怎麼實現?).再創建一個記錄類,用於幫助客戶端實現聊天記錄的實時查看,搜索,管理功能.
假設我們已經構造好了這些類.那麼在新用戶填寫完用戶名密碼,點擊註冊按鈕的時候,就應該創建一個對話消息類的實例(也就是這個類的對象),嘗試向伺服器發出一組消息,裡面包含著新用戶的用戶名,密碼(或者密碼的Hash散列,但這個目前先不講),一些填寫的資料等等.
如果你在點擊按鈕後被調用的函數(稱為"回調函數",Call back function)中,沒有使用你已經創建好的類,而是從頭寫了一遍TCP報文內容填充代碼,那麼這顯然不是對已有層模型的良好應用.正確的做法是用你已經有的那個高層類的各個函數實現報文的填充.
同理,如果你想創建一個客戶到客戶的好友關係,不應該自己從頭改數據,而應該調用之前建立的好友關係類的成員函數.這樣不容易出現問題(比如從頭寫的時候忘了考慮邊界條件),也能大大節約開發,維護,升級(如果你把同樣的代碼拷貝了一份過去,那麼你修改這段代碼的功能的時候就必須把拷貝的那份也修改了!)的成本.
情況2.你的軟體和操作系統內核交互,或者想要操縱硬體,那麼必須調用系統的API(Application Programming Interface).這種情況下,你被迫接受了分層模型.
這樣說可能顯得比較抽象不好理解.那麼舉個具體的例子.
首先,如果你要判斷2^17+1是不是素數,而且判斷結束後的結果也不輸出,就那麼放著,那麼當然可以不去碰系統的API.
但如果你想把結果輸出到屏幕,或者通過網路傳輸回伺服器,或者獲取感測器的信息等,那麼必須調用操作系統提供的函數.因為操作系統利用地址空間變換,讓你碰不到真實內存空間.調用這些API時具體的參數很多,需要時可以上網查找相應的函數參數和返回值的約定.
二.一個APP的開發分這幾個部分,以安卓開發為例.這裡假設大家都已經安裝了Eclipse作為開發環境,並且都有Android開發包.如果沒有可以去下載一下.這兩個軟體都是免費的.
新建一個空的Android工程.

大概長這樣.
認識一下圖中的文件和目錄.
1.首先是src和下面的那個package(對就是那個圖標像準星瞄準腫瘤一樣的東西,好像看它裂成4塊啊).
src是源代碼文件夾.
解釋一下,在java里一個package相當於一個"包"."包"里可以有一個或多個*.java的源代碼文件.編程的工作就在這些.java文件里進行.
2.然後是一些資源文件.在res目錄下.
比如這個AndroidManifest.xml,這裡面記錄了一些文檔信息.比如軟體的版本,包的關係之類的東西.
又比如reslayoutmain.xml(圖中忘展開了,但是你自己建完工程點進去肯定是有的.),這個xml文檔控制了你的App的一個界面,App有單界面和多界面的,咱們先死磕這一個界面.雙擊這個文件,看到的大概是這樣的.

是可視化的.所以可以做"所見即所得"的編輯,就像編輯文檔一樣簡單(當然了如果要考慮兼容其實也不是那麼簡單的,但初學者不用考慮太多).
當然了,如果你想求根問底那滿足你.

這個的確很容易把初學者嚇回去,但是不用擔心大部分時間你是不用碰這個的.而且這個xml文檔就類似html文檔一樣.不信你打開一個網頁,右鍵-&>查看源代碼看到的也是類似格式的東西.用尖括弧組表示一個段落,段落之間嵌套或並列,是xml文檔的特點.目前不必深入.
然後就是一些其他的資源文件,比如drawable-hdpi裡面有圖片文件,用於顯示.這個和網頁製作是有共同點的.後面再介紹.
3.可執行文件.
這裡有必要介紹一下計算機程序的運行過程.
計算機程序的運行有兩種形式:編譯型和解釋型.
先說編譯型.(如C系語言)
首先,程序員採用各種高級語言(相對彙編碼)編寫程序.然後編譯器把程序員書寫的源代碼分析,轉換為彙編碼,鏈接器鏈接多個文件,形成最終的可執行文件.最終發布的時候如果只發布可執行文件,那麼用戶是看不到高級語言源代碼的.
再說解釋型.(如php,asp等網頁腳本語言)
首先,程序員書寫腳本.然後解釋器讀取源代碼,並動態的分配空間給程序中的變數,判斷程序的走向,執行相應的動作.如果要發布給用戶(當然腳本一般不發布出去),用戶是能看到源碼的.

而Java就很特殊了!!!
Java編寫的程序,首先經過初步的編譯,生成了Java位元組碼.(一種比較底層的東西,但不能碰到具體硬體)然後把這個東西放到JVM上跑.因為JVM這個東西每個平台上都有,因此也就相對容易移植到不同平台上.這個JVM的全程是Java Virtual Machine,也就是一個虛擬機.所以性能相對就比較爛,不過現在大多數應用場合是不特別在乎運行性能的,反倒是開發速度和可移植性可維護性比較重要.
這個JVM也可以理解成一個大型的解釋器(...)因此Java算哪種不好說,兩種特點它都有.
然後呢,AndroidApp更特殊,在Java這麼奇特的大背景下它也算特殊的.為什麼呢?為了適配移動設備(低能耗等需求),出了一個東西,叫Dalvik Virtual Machine.這個東西的位元組碼和java位元組碼還不一樣...
所以為了編寫一個AndroidApp,你的Java源碼經歷了這樣一個流程:

Java源碼-&>Java位元組碼-&>Dalvik位元組碼-&>.apk文件
(編譯) (再編譯) (與資源等打包)

說了這麼多,那如何得到最終的apk文件呢?
點擊Eclipse上面那個綠色的箭頭就可以了.

The end of this section.
------------------------------------------------------------------------------
今天是第4天
今天計劃繼續研究第一個AndroidApp,HelloWorld工程的結構,並添加一個按鈕控制項.
今天將介紹回調函數的概念.
如果可能我更一個iOS開發的,畢竟也不能太坑想學iOS的...但是各位小夥伴記住原理都是一樣的,只是具體實施方法有那麼一些區別而已.


遇到點問題卡住了.這個答案更新可能比較慢....等我調一下

好的,回來.
首先,建立完工程之後,如果沒有現成的Android設備(如本人手頭的老機器好久沒用了得找找),可以建立一個AndroidVirtualDevice.這個在下載開發環境的時候會有AVDManager,在那個裡面建立就行.
如果建立完之後start有問題,那麼改環境變數.附一篇文章:百度經驗——實用生活指南(如侵犯作者著作權請通知,會刪除)
然後點擊綠色按鈕,會在剛才建的虛擬機中出現界面.就像這樣.

然後呢,工程里的那個R.java不要改,那個是自動生成的,用來配合你寫的部分.
今天先把開發環境配置好.如果能順利走下來建立工程打開AVD看到這個基本主要任務就算完成.有中間卡住的可以百度,百度不到可以下面留言問我.
然後如果想在界面上加點東西應該怎麼辦呢?
我試試改下main.xml.一會繼續更新.

好的,現在回來.

這裡你直接拷貝代碼是不行的.要注意幾點:
1.MVC模型中,你創建的視圖(在main.xml的可視化編輯界面中拖拽過來一個按鈕)和Button對象MyButton1是沒有直接關聯的.要讓他們有關聯,必須綁定.這個動作在代碼中的findViewById中實現.至於那個id參數填什麼,可以看你的R.java(別改,千萬別手賤),點擊那個東西一個個展開,R.java-&>R-&>id,裡面一定有你剛才在視圖裡創建的那個button的id.找到他就可以了.
這個東西的實質是一個類似宏定義的整數,打開R.java,你會發現一堆public static final class,裡面有一堆int型的變數,那個其實就是類似於宏定義的按鈕的類似"句柄"的東西,用MFC的類比.只要知道這個整數唯一對應著視圖域的那個控制項就行了.
然後下面的行為就是確定按鈕的行為.這裡通過setOnClickListener,實現了把自己的回調函數(onClick())綁定到按鈕的被點擊事件上.可以理解成一旦點擊這個按鈕,Android就會觸發這個函數執行.

接下來講解下回調函數的概念.
之前講變數的時候我埋了一個伏筆,說所有變數都可以通過他們的地址來讀寫.
好的,現在回到這個伏筆.
可以認為setOnClickListener這個行為傳入了一個對象地址,這個對象的地址由new OnClickListener得到,而裡面的那個OnClick()函數認為是新創建的這個OnClickListener對象的一部分.

這個行為就類似於C++當中傳函數指針.如果能理解最好,不能理解就記住這麼寫就能好使(是不是要求太低了...).
The end of this section.咦,this怎麼變色了.
--------------------------------------------------------------------------------
PS[0]:再強調一下,這個東西本人也是第一次寫(指的是在這個開發環境下寫,之前可視化的開發一直寫windows窗口程序的).所以可能更新過程中突然卡住了.答主應該不會棄坑.
PS[1]:看這架勢有可能不到30天就更完了.如果這樣的話很可能太快有人跟不上,有問題隨時留言問就好.當然能搜索的請自覺先搜索,搜索不到解決方案再來問.
PS[2]:答主好久以前安裝的開發環境,如果要開發環境的話我去找找還能不能找到那個包了.這個安裝的時候實在太麻煩了,因此學習Android開發我也是拖了很久.希望真的有興趣開發App的朋友們不要僅僅因為安裝過程中遇到一些困難就放棄.尤其是之前沒有開發可視化程序經驗的新手,如果能成功看到自己寫的不是黑框框的東西,會很大程度上提高對編程的興趣.(當然後來我又主動退回到黑框框里去了,這是後話.)
--------------------------------------------------------------------------------
第4.5天.
諮詢下大家意見.我打算接下來25天(可能用不了那麼久就完結了)講快點,做一個聊天工具的開發.這個怎麼樣?能接受不?還是先回顧下前面?
iOS那邊我一會看看,爭取更一個,今天Android那邊打算先停一下,因為前面側重點太靠這邊了,而且這推進速度也不算慢.但注意,原理是相通的,細節略有不同.畢竟前面一直都沒怎麼偏向iOS這邊,不能太厚此薄彼.
等下,答主換台mac回來接著更新.
好的回來了.
首先要搞iOS開發得有台MacOS設備,注意,沒有Mac可以弄虛擬機,或者借一台,本人的mac是借的.虛擬機也完全一樣,就是有點卡.
還有必須說明的一點就是要開發iOS App的過程不需要開發者賬號,但如果想發布在AppStore或者在自己沒越獄的iOS設備上用,那必須得有開發者賬號.付費之後就可以使用.價格記不清了,不低也不算高.如果不買開發者賬號,就只能在模擬器上跑.
另外就是軟體方面.有了MacOS設備之後在AppStore下載安裝一個XCode作為開發環境就可以了.
------------------------------------------------------------------
今天是第5天
那麼想學習iOS開發的朋友們請打開你的XCode.學習Android開發的朋友可以把之前做的HelloWorld工程自己做一做,加上一個按鈕.你在虛擬機里運行完一遍之後可以到你的工程文件夾下找*.apk,然後放到你的真機里去跑跑看.

File-&>New-&>Project-&>iOS-&>Application-&>SingleViewApplication(暫時選這個).Device那裡暫時選Universal就行.
然後選擇一個喜歡的位置放置工程文件.
為了驗證你之前的開發環境配置是否正確,點擊上面的三角形開始按鈕,在模擬器(Simulator)中執行程序.
(下面這三段的第一個版本有問題,已經更正.)
應該能看到一個模擬器的界面彈出來,當然了整個屏幕不一定放得下,可能需要往上拉右面的滾動條.什麼都不用做,等待片刻之後會出來一個界面.你會驚奇的發現它居然和LaunchScreen.xib的視圖是完全一樣的(不一樣就見鬼了),當然,不一會它就沒了,取而代之的是一個空白界面.
所以這裡LaunchScreen.xib表徵的就是啟動時預先載入的一個Logo擺放的地方.
好的,那麼由之前幾天提到的MVC模型,或者按我個人理解:App工程=源碼+視圖+資源文件+雜七雜八

既然要系統的學習,那麼就應該掌握下iOSApp工程的文件結構.
等我出去看一下怎麼截圖.MacOS下我不會截圖...
好的學會了.圖解如下:

上方為圖1

上方為圖2

上方為圖3

那麼圖1中的各個文件都有什麼用處呢?
首先看,有一堆.h和.m文件;*.h文件不必說,自然是C系語言都有的頭文件.*.m文件是Obj-C的代碼文件,就類似於*.cpp文件和*.h文件的關係.由於聲明和實現分離是C系語言一貫的德行,而且前面也提到了Human類的介面聲明在@interface後面,實現在@implementation後面,我們在這裡也就不多說了.

接下來說說具體每個文件的用途.
AppDelegate.m,裡面裝了許多回調函數.讀那個函數名字,就知道它是在什麼時候被調用的.有準備進入後台,已經進入後台,準備回到前台,已經回到前台等事件的監聽.監聽到事件後會調用相應的回調函數.
ViewController.m,裡面裝載了界面載入和內存不足時調用的回調函數.
Main.storyboard,這個是工程的主視圖文件.因為建立工程的時候我們選擇的是SingleView型的,所以這裡只有一個.
你可以在這個界面上加入一些控制項,比如按鈕文本框之類的.當然了,這裡的東西現在只能看,不能點,點了也沒用,因為對應控制項事件的處理函數沒有寫.
那麼在哪裡寫這些事件的處理函數呢?答案是在ViewController.h中.注意這裡XCode提供了一種很方便的綁定控制項實例與事件回調函數的方法:拖拽.

首先打開ViewController.h,和Main.storyboard,要保證兩者能同時被看到.然後右鍵點擊你要設置事件的控制項,點住相應控制項右側的圓點,向ViewController.h中拖動.然後會彈出一個對話框讓你填寫函數的名字.給函數起一個好記的,含義充分的名字,以確保自己不會弄混亂.然後在生成的函數體(注意在ViewController.m中!!!)中填寫適當內容就可以了.
注意,C系語言聲明和實現的分離,決定了新的函數體在ViewController.m中.找到對應的函數,填寫適當的內容即可.

如圖所示.

做到這裡之後可以休息一下了.今天的內容大概就是這樣.求贊求魚丸甩起(誤)

The end of this section.
----------------------------------------------------------------------------------------
今天是第5.5天.
看一下題目.要獨立開發ins類的app是吧?
答主沒用過ins,所以可能做的和題主想要的有點出入.
然後今天講什麼?諮詢下大家意見.突然感覺沒什麼可講的了.這哪用的上30天啊(笑)

初步計劃講講AndroidApp的結構,Activity之間的關係,App的狀態.
然後做個比之前Helloworld稍微大一點的東西.
iOS那邊先放一放,安裝開發環境也挺折騰的,想學iOS的朋友先配置下開發環境把之前那個做出來吧.
----------------------------------------------------------------------------------------
今天是第6天.
講一下AndroidApp裡面Activity是什麼.
Activity我個人的理解就是視圖.可以認為App整體是一個網站,打開這個App之後看到的第一個視圖是主頁,頁面之間可以來回跳轉.
因此,可以認為Activity是一張類似於網頁的東西.
仔細觀察會發現Activity跟網頁真的很相似.還記得那個main.xml嗎,裡面的布局和html布局的語法是很接近的,甚至有div.
布局的時候要考慮這樣幾個問題:
1.Android設備種類多,屏幕解析度五花八門.網頁一般兼容1920*1080和1366*768的屏幕問題就不大了,而Android設備屏幕解析度有:
320X480
460X640
----------------------上面這兩種不常見.------------
480X800//這個還有一些
480X854//小米1就是這個解析度
540X960//HTC以前的機器用
640X960//坑爹3:2,好像魅族用過,相對少見
1280X720//720P,比較主流
1280X800
1920X1080//1080P,高端機有採用的.
據說還有2K的,這個就更好了.

基本常見的列舉出來了.但也有沒考慮到的.兼容這麼多就不錯了.

這些設備別說屏幕解析度不一致了,就連屏幕長寬比都不能統一.
坑爹的15:9,3:2,....(雖說蘋果現在也好不到哪裡去...)
這就決定了在設計界面的時候,必須結合絕對布局和相對布局兩種方式.
所謂絕對布局,就是給出具體坐標,然後放置元素.
所謂相對布局,就是給出元素間放置的關係,然後放置.
具體在操作的時候可以通過放置linear layout的線來控制元素的位置.
比如這樣:

這個不多說了,因為我也不是特別懂美術和界面.

好的,那麼可以發現Activity上控制項的布局和網頁很相似.
那Activity的交互性是怎麼實現的呢?前面我們已經看過了,是通過控制項元素綁定相應的對象,進而在對象上調用回調函數實現的監聽控制項動作.
那如何將我們的後台的動作(比如socket收到一份報文)反映到控制項上呢?
同樣也是通過調用控制項綁定對象的方法.比如,可以把文本框綁定到文本框對象上,然後在收到報文後調用文本框對象的setText方法設置文本框的新內容.推薦大家還是買一本講App開發的書,可以對照著操作.
這種後台動作反過來影響前台顯示的應用有很多,最常見的就是收到socket數據之後要在前台做對應的顯示,或者一個控制項的動作影響其他的控制項的行為.

iOSapp的視圖被稱為storyboard.這個和上面的很相似,不贅述了.

另外再強調一下,本人之前也沒碰過App開發.上面這些都是第一次做,因此答案的確定度存疑,可能可供分享的價值也不是很大.

那麼接下來準備把重點放回到編程上來了,上面那些布局和控制項,視圖之類的東西我計劃後面做示例的時候再探索.其實我現在有點找不到下面該說什麼好了.如果有明確的學習需要的話就在下面評論區提出來吧.

好的.那麼先講講內存管理吧.(現階段新手用不到)
數據結構有兩種.一種是大小和元素都確定的(一般都比較簡單,像是一個單純用數組實現的隊列或者棧之類的),還有一種是動態分配並生成,用後銷毀的,比如不定數目的元素連成鏈表,各種二叉樹.這種變數的內存空間一般是臨時分配的.因此就涉及到一個內存回收的問題.
Java有自動內存管理,但是要注意要釋放的數據不要連成引用環,否則無法釋放內存,發生內存泄露,相當於這塊內存就一直被霸佔著,一時半會倒不會有什麼問題(這點其實反倒最坑爹,如果上來就能看到錯那這種問題就很好改,怕就怕這種不知道什麼時候會發作的Bug),但如果產生內存泄露在某個循環里或者某個經常被調用的函數里,泄露的次數多了就會導致整個環境沒有一點內存可分了,程序就崩潰了.因此要注意回收內存的問題.
Obj C在這方面有自動釋放池,記錄剩餘的引用次數.因此要注意作用域的問題,記得retain返回的局部對象,否則一不小心返回的東西會被莫名其妙的回收.

然後講一下基本的數據結構.這裡就假設大家都有一定基礎了.這個在你開發玩具App的時候用的不多,但是想專門做軟體開發的話這方面了解越深入越好(其實是我實在找不到現階段該講啥了)
首先是棧和隊列.他們的區別很簡單,棧是後入先出,隊列是先入先出.用鏈表實現.

然後是二叉樹.二叉樹維護著左右兩個子樹和一個上級節點.二叉樹的作用是便於根據一個關鍵詞的大小快速尋找目標元素是否在集合中.通過遍歷一個二叉樹,可以對集合中的所有已有元素進行某種操作.
然後是紅黑樹.紅黑樹是特殊的二叉樹,能夠維持高操作性能,實現上稍微複雜一些.
然後是圖.圖的作用主要是擬合現實中的多對多關係模型.一對多關係模型則可以考慮用樹模擬,每一棵樹都可以一一對應的化為一個二叉樹.

這些東西有興趣的朋友可以學習下,用計算機係數據結構的教材就可以.現階段可以不掌握這些而直接投入開發,但如果想深入學習,這是一個很重要的必須要掌握的東西.
為什麼說數據結構對後來的學習很重要?
比如你的App要維護用戶與用戶之間的好友關係,那就必須得有相應的數據結構保存用戶與用戶之間的關聯.好友關係的創建刪除查詢都要在一個比較快的時間內完成,否則伺服器會背上不必要的壓力.又比如你的軟體要實現推薦給用戶想看的內容,那這就涉及到用戶之間的相似度的計算(UserCF)和內容內部的歸檔(ItemCF).後者可以嘗試用機器學習的一些手段(logistic,SVM等等),前者可以用向量內積法計算,等等.在掌握基本的語法和操作方法,熟悉了常用的開發過程之後,就可以考慮往演算法方面前進.而學習這些演算法的基礎就是熟練掌握理解常用的數據結構.

今天好像扯了很多沒用的....因為實在沒什麼思路了,明天講網路編程吧.

The end of this section.
---------------------------------------------
今天是第7天.一周過去了,時間過得很快啊.
今天我們講網路編程.這是應用軟體開發的一個很重要的部分.
要講網路編程,首先要了解計算機網路模型.計算機網路服從於之前說過的分層概念.也就是說,網路的實現是分層的.
OSI指導模型將網路分為7層.實際應用的是TCP/IP,它將網路分為5層.這5層分別是:應用層,傳輸層,網路層,數據鏈路層,物理層.
物理層,顧名思義,是與底層物理鏈路相連的層,為數據鏈路層提供基本的報文傳送服務.數據鏈路層為網路層提供服務,以此類推.
由下至上的,最後自然是由傳輸層負責為我們的應用層(我們的App)提供服務.因此,我們主要的編程工作是針對於傳輸層與應用層的介面的.
先看傳輸層.傳輸層的主要任務是:將用戶要傳送的數據整理成一定的格式,發給接收設備的傳輸層.接收設備的傳輸層收到後,將數據提交給自己的應用層.
傳輸層還有一個任務,就是實現"復用".一台設備上通常有不止一個程序需要連接網路,但他們之間的通信必須是互不干擾的.這是依靠的是傳輸層的"埠"實現的.
傳輸層有兩個協議:TCP和UDP.他們的區別是:1.TCP是可靠的,UDP是不可靠的.2.TCP是以流的形式傳送,而UDP是以一份報文的形式傳送.
TCP保證在連接沒有斷開的情況下正確且按順序地傳送每一份數據,將數據連成一個"流",保證數據在連接不斷的情況下被可靠地傳送.
UDP將要發送的內容打包成一個報文(通常報文的長度要求小於1472個位元組),整份報文會被作為一個整體傳送.如果報文傳送失敗,接收方不會收到任何數據.如果傳送成功,那麼接收方會收到完整的數據.
因此,UDP的傳送雖然不可靠(不保證送到,錯了也沒有提示),但是如果收到了就一定是正確的,不會出現"收到內容錯誤的報文"的情況.

初步熟悉了這兩種傳輸層協議的特點之後,我們講講傳輸層的埠和網路層的IP地址,以及NAT(Network Address Translation,網路地址轉換).
為什麼要講網路層的東西?不是分層模型只需要操作和自己最近的一層嗎?
因為NAT的出現違背了分層模型,因此必須特殊考慮.
首先介紹一下埠的概念.埠是為了區分同一台設備上的不同程序而設計的.比如HTTP協議默認綁定了伺服器的80埠.這樣當你發起針對80埠的連接請求的時候,伺服器的服務端應用會加以處理(雖然你最後連接上的不是伺服器的80埠,這個是後話不提).又比如你的ssh服務埠是22,這樣當同一台伺服器同時開啟ssh和http服務時,兩種服務因為監聽的埠不同,所以請求處理不會混亂.

那麼NAT又是怎麼產生的呢?
路由器是最高工作在網路層的設備,它的作用是轉發報文.家用路由器涉及到一個復用的問題,就是全球一共有差不多46億IP地址,不可能每台設備都分配一個IP地址.因此必須設置好轉發關係,讓你分到的一個IP地址經過轉換轉換使得你的每一個設備上都有不同的IP地址.
這是怎麼做到的?
IP地址的確只有46億個,但是埠號的取值範圍是0到65535,而一般的設備是不會跑那麼多網路連接的.因此,通過"全球通行IP地址:對外埠"-&>"本地專用IP地址:對內埠"的映射,是有可能實現IP地址資源的復用的.這裡不詳細講NAT了,有興趣的可以自己搜索.

然後講講最常用的TCP的連接建立過程.TCP是有連接狀態的.因此,比如我要連接到伺服器的80埠,我就應該先綁定一個本地空閑的埠(客戶端這一步可以在創建套接字的時候順帶著由操作系統自動完成),然後用這個套接字(socket)向伺服器的80埠發起連接請求.伺服器收到請求後,會分配一個自己的空閑埠(注意,這個才是最後和客戶發生直接對話的埠,80埠只用於監聽)與客戶的這個socket建立連接.這樣就發起了一次穩定的TCP連接.
UDP沒有連接狀態.因此假設我們要通過UDP和伺服器的81埠通信,只要創建一個套接字,然後想都不想直接給發送報文給81埠就行.一般UDP的應用不要求必須送達,因此也不必關心伺服器是否收到了消息,繼續做下面的事情就可以了.如果伺服器成功收到了消息,並進行了處理,然後又回復了一封報文,你就可以選擇接收這封報文,並查看裡面的內容.

當然了,UDP也沒那麼可怕,一般來說正確發送正確接收的概率遠遠大於出現故障的概率,除非網路連接的狀態特別惡劣(干擾嚴重導致物理層誤碼被丟包),或者有人為錯誤(比如嘗試發送過長的報文,導致網路層IP包被拆了,整個報文跟著完蛋了),否則正確收發的情況還是佔大多數的.

今天就先講這麼多.有興趣繼續的可以回去多看一看計算機網路體系結構的資料,還是很有趣的.明天講具體的編程過程.
The end of this section.
-----------------------------------------------------
十分抱歉昨天因為個人原因拖更了.今天一併補上.
今天是第8,9天.因此今天的內容也要稍微長一些.準備一口氣介紹完Java和OC的網路編程,並初步進入多線程模型的學習.

首先,要知道Android和iOS都是基於Linux的.因此他們的底層服務是一樣的.但對於具體的開發方式而言所應用的網路通信函數庫又是不相同的.
AndroidApp跑在JVM里.因此必須調用Java的http://java.net包裡面提供的函數.
Obj-C向前兼容C.因此可以調用傳統的Socket函數.也可以採用Core Foundation和NextStep的類.這種類(CFNetService,偏底層;NSNetService,偏高層)有高層的抽象,更方便人類理解和使用.
接下來必須辨析兩個通信中的概念.

1.同步和非同步:對文件,TCP連接等外部"設備",我們能進行的操作只有兩種:讀和寫.獲取數據是讀,發送數據是寫.
同步操作,指的是等待操作完成,在此之前不做任何其他行為,直到操作完成才繼續向下運行.非同步操作,指的是給操作系統下達一個任務,讓它安排合適的時機完成指定的讀寫操作,而程序自己繼續向下運行.這項讀寫任務的完成情況由這樣幾種方式反饋:1.操作系統給進程發送信號2.操作系統在操作完成後調用事先約定的回調函數.

2.阻塞和非阻塞,
阻塞和非阻塞一般指讀操作.寫操作發生阻塞的情況在少量數據發送的應用中不多見.
"阻塞"指的是當操作無法完成時,在這裡一直等待,直到操作完成.
"非阻塞"指的是當操作無法完成時,獲取到這個不能立刻完成的信息,當場放棄等待,立即進行下面的工作.
比如客戶端收取伺服器傳來的數據的操作,如果利用阻塞操作實現,那麼當接收緩衝區里沒有數據的時候,客戶端程序(這裡認為是單線程的實現方式)將停在這裡一直等著,不能響應任何動作.宏觀表現就是卡死了.
而如果採用非阻塞方式實現,當緩衝區中數據時,將立刻收到一個"WouldBlock"的消息,然後程序可以向下運行,處理這個問題.這時是可以避免應用活活卡死的.

接下來可以介紹這幾個類了.(本人對用底層Socket的操作比較熟悉,對這些類比較生疏,因此也包含著探索的過程)
1.Java的http://java.net包.
(1).底層Socket.
Socket skt= new Socket(遠程地址,埠號);//這裡創建的是TCP連接.
OutputStream writestream=skt.getOutputStream();//獲取一個寫入流,向寫入流中寫入數據即可.
InputStream readstream=skt.getInputStream();//獲取一個讀取流,從這個流中讀取數據.
writestream.write(流式內容的位元組數組,起始位置,結束位置);
readstream.read(接收緩衝區,起始位置,最大接收長度);//這個返回值是實際讀入了多少位元組.如果讀入的位元組數小於你想要的接收長度,可能需要過一會再次調用這個函數進行數據讀取.
skt.configureBlocking(true/false);//這個函數將設置當前socket工作在同步模式還是非同步模式.
然後可以用select方法進行多個socket的管理等.這裡不多說了.
(2).高層的連接.
&<1&>資料庫連接.
常用的資料庫會提供相應的jdbc,這樣的話直接調用庫中的函數就可以完成連接與登錄的過程.
查詢與修改可以直接傳SQL命令字元串完成.也沒什麼可說的.
&<2&>HTTP.
要開始一個HTTP連接,可以用底層的socket直接連接伺服器的socket埠,並自己合成報文.但顯然這樣做沒有利用好現有的庫資源.
Java的http://java.net提供了一個URL類和一個HttpURLConnection類.通過這兩個類可以方便的獲取URL所指向的文件資源.創建一個這樣的HTTP請求的過程如下:
先創建一個String str,然後將這個str的內容填充為要連接的URL.
然後創建一個URL myurl=new URL(str);這樣就可以用這個myurl創建HTTP連接了.
HttpURLConnection con=(HttpURLConnection)myurl.openConnection();
然後可以從連接con中獲取數據流了.
BufferedReader reader=new BufferedReader(new InputStreamReader(con.getInputStream));
接下來從reader中讀取:
String thisline=reader.readLine();//將一行內容讀取到thisline字元串中.
也可以將內容直接讀取到byte數組中.不贅述了.

2.Obj-C的常用庫:
&<1&>.底層連接:可以用linux的socket(個人比較熟悉這個);
&<2&>.HTTP連接可以用NSNetwork.就像這樣:
NSNetwork同步HTTP操作:
NSURLRequest *pReq=[NSURLRequest requestWithURL:[NSURLURLWithString:@"填入你要訪問的URL"]];//注意,這裡的@後面接字元串常量.
NSURLResponse* urlrep;
NSError* err=nil;
NSData* data=[NSURLConnection sedSynchronousRequest:pReq returningResponse:urlrep error:err];//創建接收緩衝區,開始接收數據.
if(!data)//如果接收失敗
{
if(err)
{//如果產生錯誤
NSLog(@"錯誤為:[%@]",[err localizedDescription]);//列印錯誤到控制台.
}
}
非同步操作可以自己創建一個類,然後調用Obj-C特性中的代理的方法實現每次收到數據呼叫自己的回調函數.記得每次在回調函數中檢查錯誤就可以了.這裡不贅述.

最後介紹一下Linux的網路編程API(實際上這些API在windows下絕大多數也都能用.但Windows下的一些API到Linux下不能用了):
之所以前面沒有介紹如何綁定埠,如何實現監聽連接請求,是因為一般沒有在手機App上搭建服務端的,一般都是用Linux伺服器搭建服務端,然後綁定埠,等待App作為客戶端來連接.

因此,這裡重點介紹Linux服務端的搭建.
首先,你最好有一個固定的公網IP地址.(192開頭那個不好使.可以自己租伺服器,沒有固定IP也可以用一些高級技巧,比如動態DNS,但這種服務不穩定)然後綁定自己機器上的一個埠作為自己的服務用.注意不要和常用埠衝突(參考:如果你在同一台伺服器上要架設網站,那麼留出80埠,從剩餘埠中選擇;如果要通過ssh遠程連接這台伺服器,留出22埠).這裡假設我們用公網IP的6602埠.如果伺服器在自己家的路由內部,記得設置路由器埠映射,到你的伺服器上監聽的埠.
接下來創建一個cpp文件.
vim Server.cpp
用a命令編輯文本.
#include......//一堆頭文件,到時候現用現查
int main
{
typedef int SOCKET;
SOCKET skt=socket(AF_INET,SOCKET_STREAM,0);//指定創建TCP套接字.
sockaddr_in thelocaladdr;
memset(thelocaladdr,0,sizof(sockaddr_in));
thelocaladdr.sin_family=AF_INET;
thelocaladdr.sin_port=htons(6602);
thelocaladdr.sin_addr.s_addr=0;
bind(skt,(sockaddr*)thelocaladdr,sizeof(sockaddr));//把套接字綁定到本地地址,相當於綁死你剛才那個埠和你創建的套接字skt.
listen(skt,5);//最多同時處理5個未響應的連接請求(這裡實際是設置等待隊列深度,深度太大也沒用)
while(1)
{
socket remoteskt=accept(skt,0,0);//等待客戶端連接,新套接字是remoteskt;
int isParent=fork();//誰是0誰兒子(笑)
if(!isParent)
{//如果是子進程
//在這裡處理連接請求,用recv收,用send發.連接結束後,回收垃圾,結束自己.
}
}
return 0;
}
必須得說明下,不是我不縮進,是知乎不支持,我打的空格全沒了....

好的,既然這裡都用到fork函數了,那就說明已經是時候講多進程/多線程了.
不過,今天的內容應該已經夠多了,可以慢慢消化一下.明天講多進程/多線程.


The end of this section.
------------------------------------
今天是第10,11天.(答主時間不多,有時候更新不及時,而且開學之後基本上不太可能實時更新了....見諒,但是內容上是不會少的.等我完全掌握之後會回來更正一遍,改正這個版本的錯誤並梳理思路.)

今天講講多進程/多線程編程.
首先辨析一下程序文件(可執行文件)/進程/線程的區別.
可執行文件是一個靜態的,二進位文件.它平時被保存到外存上.只有當可執行文件被執行的時候,才被操作系統讀取其中的內容,並分塊載入到主存儲器.
這個程序被執行後,會產生一個進程.
如果這個進程fork()自身,或者再次執行這個程序,會產生第二個該程序的進程.
如果這個進程創建子線程,那麼會產生線程.(主要是windows下有這個概念,linux下的線程不太了解,一般都是用fork.)
線程之間一般可以共享數據段,而進程不可以.
下面詳細講一下linux的fork函數.
fork的基本特徵可以一句話概括:到這裂兩半,誰零誰兒子.(...)
換言之,就是程序運行到fork這裡,操作系統(*nix內核)會給它再次分配一個數據段,並拷貝之前的內容.這樣就可以再產生一個進程.這兩個進程共享原來的代碼,然後子進程的執行不是從原來程序的入口點(一般是main函數)開始的,而是從fork那句後面開始的.fork會提供一個返回值,用於返回是否是父進程.
宏觀上看,可以認為這兩個進程是"同時"執行的.然而微觀上的執行順序並不確定,也無需關心.
例如,當你的環境是單核CPU時,物理上是不可能做到同時執行多個程序的.但是可以通過幾十毫秒就調度(切換)一次進程的方式,實現多個進程"人眼可見的"同時跑在操作系統上.
在Linux上(別忘了Android跑在Linux上,iOS是基於UNIX的,而Linux是UNIX的派生)進程有優先順序,nice值等屬性,決定了每次調度器調度的時候,哪個進程被換入,換入後又執行多長時間.用戶態開發者(比如我們這種App開發者)無需關心這些.

好,理論部分到此結束(當然了要想深入了解原理這肯定是遠遠不夠的,如果有興趣可以讀UnixV6在fork部分的源碼,UnixV6源代碼已經開源.)接下來介紹實際應用.
不知大家是否比較過一個Windows窗口程序和初學編程的時候命令行程序的異同?
相同點是:代碼都運行在同一套體系(80x86機,有操作系統)上.
不同點是:一般的命令行程序沒有消息循環,除了等待用戶輸入和等待網路另一端發來數據以外,在自己被分配的執行事件中一直持有著CPU資源.而窗體程序有一個消息循環.大概的語句結構是這樣的:

CreateWindow(...(一堆參數懶得找了));//創建一個窗口
ShowWindow();//顯示之前的窗口,同樣懶得找參數了.

message Mymsg;//創建消息結構
while(GetMessage(Mymsg,NULL,0,0))//進入消息循環.
{//我也想縮進,知乎這編輯器不支持,大家體諒一下
TranslateMessage(Mymsg);//翻譯消息.
DispatchMessage(Mymsg);//分發消息.
}
這裡注意,在CreateWindow的時候你有機會創建一個自己的消息處理回調函數.當系統發來消息(滑鼠,鍵盤等操作,網路編程中的非同步消息模型中的系統消息,外部要求關閉等消息)的時候,通過這個回調函數可以加以處理.
比如當獲取到滑鼠消息時:
switch(uMsg)
{
case WM_LBUTTONDOWN: //用戶點擊滑鼠左鍵
{///做點什麼
}
break;
}
沒有消息的時候,程序就"卡在"GetMessage()那裡不能動彈.(但客觀上說,是程序自己主動放棄了CPU的資源,並要求操作系統調度到下一個進程)
但為什麼我們能操作窗口,而不至於產生不響應的狀況呢?
因為每當我們對這個窗口進行一次操作,都將會產生一個發送給這個窗口的"消息",這時GetMessage獲得了這個消息,因此程序繼續運行,宏觀上來看就是"好厲害,同時開這麼多窗口居然不卡!".(......)
--------------------AndroidApp中實現多線程--------------
那麼如何在AndroidApp中實現多進程/多線程呢?
首先,多線程相對容易實現.因為AndroidApp運行在JVM中,這就決定了Java的一些類可以直接用.
事實上,常用繼承Thread類的方法創建新的線程.
Thread是一個類,這個類中有一個run方法,還有一個start方法.
因此,只要繼承Thread類,重寫其中的run方法,就可以創建自己的線程.這個線程的入口點是run函數.
然後用這個自己創建的子類派生出對象,再調用它的start方法就可以了.兩個線程會同時運行.
注意,java有一些關鍵字(如synchronized)可以確保線程之間不會互相干擾(比如控制其他線程不讀取一個線程正在寫的數據,也就是控制"臟讀(Dirty Read)"現象,等等.).
一個線程如果暫時沒事幹,也可以調用sleep(毫秒數)暫時放棄CPU一段時間.但要注意,這個操作不保證在指定時間後一定能回到這個線程.也就是說sleep的實際含義是:在一定時間內,確定的放棄CPU使用權,即使在此之後不保證能及時回到這個線程中.當需要"至少等待這麼多時間"時,適合用sleep.
還是給個常式吧,免得太突兀.

class MyBGThread1 extends Thread
{
public void run()
{
//填寫自己進程要做的事情.這裡可以訪問原來主線程中的變數.
}
}
.....//懶得寫了
public void main()
{
MyBGThread1 thethread=new MyBGTread1;
thethread.start();
}
-------------------iOSApp中實現多線程/多進程----------
首先肯定是fork了,用fork可以實現幾乎所有多進程需求.
fork之後的進程之間怎麼通信?
可以用UDP給自己的主進程發消息.活用網路編程解決本機需求.

然後還可以利用NSThread類實現多線程.下面來介紹這種方法.

假設你有一個類MyClass,裡面有一個函數thisthreadmain(),你希望在生成新線程之後,新線程執行這個函數裡面的命令.那就可以這樣操作:
@implementation MyClass
void somefunction()
{
//...一些其他操作

//調用這個somefunction的時候就會產生一個子線程,這個線程以自己的thisthreadmain為參數.
[NSThread detachNewThreadSelector:@selector(thisthreadmain:) toTarget:self withObject:/*這裡填上傳入給thethreadmain函數的參數.*/];//創建並啟動子線程.
//一些其他操作.
}
void thisthreadmain:(id)Param
{
//子線程里的操作.
}
@end

這樣就完成了一個子線程的創建.
下面講一個相對底層一些的,pthread介面.這個介面更底層,因此常式用C實現.
pthread產生的線程的生命周期是:
step&<1&>創建線程結構
step&<2&>啟動線程
step&<3&>銷毀線程
下面是一段常式:
#import&

//注意,用#import代替#include 可以避免頭文件重複包含導致無法編譯.
void ChildThreadFunc(void* pParameters)
{
//子線程要跑的函數
}
void MakepThread()
{
pthread_attr_t MyAttr;
pthread_t MypthID;
if(pthread_attr_init(MyAttr))//初始化pthread_attr_t結構.
{
printf("Failed.
");
goto end;
}
if(pthread_create(MypthID,MyAttr,ChildThreadFunc,/*這裡填要傳入的參數*/))
{//創建線程(注意我只是創建,沒啟動.)
printf("Failed
");
goto end;
}
if(pthread_detach(MypthID))
{//啟動線程.
printf("Failed
");
goto end;
}
if(pthread_attr_destroy(MyAttr))
{//銷毀線程.
printf("Failed");
goto end;
}
end:
return 0;
}
雖然goto一般不建議常用,但用於處理可能出現異常並且有資源回收需求的業務是非常合適的.
那個printf也可以換成NSLog.
今天講的內容有點多,而且也比較抽象.如果可能的話自己動手試一試吧.
過兩天答主打算弄一個實例,直接把前面的知識點串聯起來.

小夥伴們求魚丸甩起啊!(...)

The end of this section.
-------------------------------------------------
某良心答主又來更新了(真不要臉啊....)
今天是第12,13天(平時時間不多,我盡量弄,要開學上課了...)
今天咱們做個多界面的東西試試.


不好意思各位,這兩天學校有些事情在忙,我有點調度不過來了。我儘快補上剩下的內容,希望大家諒解。


然後呢,圖和我下面講的內容不在一台電腦上.所以下面講的是沒圖的.回去我補上.現在用的電腦上沒有開發環境.我儘可能先寫出一些,回去繼續更新.

Android中創建多界面程序,需要用到一個叫intent的東西.
intent,直譯為動機.利用這個"動機",可以完成Activity的跳轉和參數傳遞.這個"動機"還可以調用系統的一些應用,比如撥打電話,發送簡訊等等.
簡單地說,"動機"是一個對象,負責可視化對象之間的跳轉.具體來說,可以完成同一個App內部Activity之間的跳轉,不同App之間的跳轉這兩種.這裡我們主要講解同一個App內部Activity之間的跳轉.

同一個App內部可以創建多個Activity.可是我們新建的工程只有一個Activity.這時應該怎麼辦?
//付費購買會員資格,享受更多Activity!(...)
上面是玩笑.我們可以通過創建新的繼承Activity的子類的方法創建第二個,乃至更多個Activity.
但現在的主要問題是,如何設置這些Activity,使它們能夠被使用?

一個Activity,在程序上需要一個子類去繼承Android的Activity類;界面上需要一個xml文件提供界面描述;Android工程總體上需要修改manifest.xml.因此,必須完成這樣的幾個過程:
1.創建自己的第二個子類,繼承Activity類(第一個是你創建工程的時候開發環境免費送的)
2.創建自己的第二個.xml頁面描述文件,用於構造界面.
3.在manifest.xml中註冊新的Activity.
4.回到自己的新Activity子類,與新的xml描述文件綁定.


這中間有些具體操作挺複雜的,我第一次弄也弄了好久.一會回去貼圖,再詳細補充,這樣大家可以少走點彎路.

iOS開發裡面那個多界面很好做,隨便畫一個新界面(右下角那個),弄一個按鈕在第一個界面.按住Control,然後拖動按鈕到你要跳轉的界面,選擇覆蓋就行了.跳回來也很簡單.但暫時沒弄明白怎麼傳參數.等一會回去研究一下.今天要9點左右才能開始繼續更,請大家諒解.


施工現場,帶好安全帽.


我相信有人可以0基礎一個月的時間學會IOS或者安卓APP開發,並且有可以使用的產出,可能糙一點。

但是我不相信來這裡問這種問題的人可以。


題主想要完成這個任務,需要一些條件啦:首先你網速夠好,其次你英文夠好。上外網不卡,英文聽力不錯。一個月不幹別的事情差不多可以上手iOS App或者Html5 Web App開發。能做個作業,可以跟小白炫耀一下。
需要的工具:互聯網、翻牆軟體、電腦一台(iOS 需要mac 虛擬機黑蘋果都行)、谷歌、http://Lynda.com、w3cschool。

時間分配:12天基礎,18天實踐。以六天為一周,那麼你的一個月就有五個周,而不是四個。前兩周搞定基礎,後三周完成作業

基礎部分:
第一周:在http://lynda.com上搜索並學習 Foundations of Programming: Fundamentals,Foundations of Programming: Object-Oriented Design 看完這兩個教程,算是入了個門,什麼variable class function method 之類的就看懂了明白是怎麼回事兒了。 同時以這六天的進度評估現在的接受能力,如果這六天覺得很輕鬆沒問題,並可以寫一些小的代碼,可以挑戰iOS的開發,如果這六天覺得比較吃力,而且第二個Object-Oriented Design中的概念很難理解,建議轉向Html5 Mobile App開發。


第二周:根據第一周的評估又分為兩個方向
方向A:iOS開發:學習語言和工具:xcode 以及 swift或者Object-C
在http://Lynda.com上搜索並學習
項目1[Objective-C Essential Training 或者 Swift Essential Training]
項目2 [App Development Essential Training或者App Development with Swift Essential Training ]
項目3[ iOS Game Development with Sprite Kit]
語言的選擇上看喜好,Object-C發展的比較完善,資料也很多,swift是新興的,熱門,但各種學習的資料的介紹中也有不少錯誤。任何不懂的地方請用谷歌進行英文搜索,比百度有效率太多。
本周沒有完成以上三個項目的學習,則任務失敗。你要有興趣可以繼續看下去,但一個月之內的作業是肯定完不成了。

方向B:Html5 Mobile App:學習HTML,CSS,Javascript
項目1 w3cschool上學習HTML HTML5 CSS CSS3
項目2 http://Lynda.com上學習 JavaScript Essential Training
項目3 http://lynda.com上學習 Building Android and iOS Apps with Dreamweaver CC and PhoneGap
本周沒有完成以上三個項目的學習,則任務失敗。但比起方向A來說,這個方向還是相對好完成一些的。
在基礎部分的學習中,還有一個小技巧提升學習速度——將播放器的播放速度提高至1.1-1.2倍,長期這樣可以節約很多時間。


實戰部分
第三至五周
做作業——遇到問題——解決問題——繼續做作業。
大概這三周的時間內會遇到各種各樣的問題,但通過前兩周的學習應該基本獲得了解決問題的各種方法。關注遇到的問題,和如何解決這個問題。所有其他的複雜的概念請在解決了問題、完成任務之後再研究。
你可能會遇到如何在存儲用戶的資料,聯網遊戲或者應用還需要一個伺服器,調用手機的攝像頭、震動等功能、等等等等。先明確目的,然後通過搜索引擎(谷歌更為高效),論壇交流來嘗試解決這些問題。
以實現功能為主要目標,解決問題,並做好筆記,會讓你快速的完成任務。
你會遇到很多的庫、框架、IDE、協議並且看到許多程序員為此爭執。我的建議是跟這些保持一定的距離。在國內的論壇或者QQ群,總會有一些也是剛起步的朋友拿這些嚇唬人。國外的社區環境還是相當不錯的。
對於有些不能給你提供任何幫助而對你橫加指責,或是好心卻把事情變的更加的複雜化的人,我建議感謝他們,但仍然按照自己的目標走。向著目標,別走彎路。


最近總結了自己這一年做的工作,突然感覺這個問題其實有解。

首先題主也明白,一個月無法出作品,但是一個月也許可以讓你重新認識自己腦海中的點子,並規划出一個明確的完成思路。

那麼我們先具備這麼幾個條件:

*較重度的app使用經驗
*英語聽說讀寫能力中的讀
*較強的邏輯思維
*強大地做下去的決心

我覺得具備這上面三個條件就可以開始了。

我一直非常和有天馬行空想法的人交流,很多東西和潮流都是這樣的人來帶領的,你若真認為自己的想法很好,方案可行,就一定不要放棄和拖延,付出行動自然會有結果,不論好壞都是你的處女座。不要太過在意別人的看法。

每個外行入手製作app時,都是從頁面開始的,所以,你首先要能畫出來你腦海中idea需要幾個頁面,功能如何分布在這些頁面中,相互如何交互。所以我提及了「較重度的app使用經驗」,有這個經驗才能很快的把虛的想法變成實在的可看到的東西。

當完成頁面工作,如果完全沒編程過,就該去看一下斯坦福大學ios開發課程,我當時就是聽著那個課熟悉了ios框架知識,這段時間比較難克服的是很多生僻名詞的理解。有難度的話就得買本中文的書籍來對比著學習,這個階段是最難的,但做到後也是成就感最大的。

接下來,就該去逛這麼幾個網站啦:http://github.com 或者國內的http://code4app.com 後者上手更容易,你可以搜索到類似能完成你頁面那些功能的代碼。照貓畫虎,把代碼片段粘貼到自己項目中。

那麼你看,你需要具備的條件,就剩下強大的做下去的決心了,因為到這裡,你才開始把自己的想法搭積木一樣的搭出來。這時也是考研自己能否堅持下去的關鍵,這時也許會有很多朋友在旅行,也許朋友圈中每天都有大家的聚餐,也有很多朋友跳槽高就,更有女神的各種搔首弄姿,建議在做工作時完全不碰社交網路。同時也要有「我要做出一個讓大家都驚嘆的app」的決心。

上面說的太理論,那麼實踐才出真知,我的這一年其實總結了不少東西,希望你能受用。

我記得我當時畫草圖時,就畫過頭了,太在意細節,沒整體去感知產品的結構,一個頁面要表達的中心思想不明確。這就體現了做產品的功力問題了,但不是說沒功力就做不出,我建議期初頁面一定要追求簡單,功能就一個,目的就一個,不要堆砌,你看snapchat這樣的產品,簡單到想刪掉,但你要知道,這麼簡單才是讓大部分人一下子就會用的關鍵所在。頁面越要表達的多,越不知所以然。

草圖畫完後,我在實際編碼時真的是刪減了很多功能,而且過程很痛苦,那時才明白什麼叫做豐富了容易,做簡單難的道理。

編碼過程中,不要過多扣UI方面的東西,如果你總告訴自己UI能體現你產品的內涵,氣質什麼的,那說明你的創意想法也許真的不是很靠譜,不然為什麼靠UI來襯托產品氣質呢。

再說一個不能跳過的東西:伺服器端開發,建議使用雲產品來快速搭建,比如leanCloud這類東西,能幫你節省太多時間。我走過很多彎路,其中就有自學了很多Server方面的知識,自己搭建mongoDB集群,甚至我都做了預備產品突發大流量的應對工具,最終結果就是這些工作太浪費時間了,真的要大流量來了,那時再想辦法也來得及。

綜上所述,你花費最大時間會在編碼和改bug上,其次是學習和模仿別人代碼上。

最後,不要給自己設限,不要總提自己優勢和弱勢,其實當你真的走到自己編碼做自己想法的時候,你需要的只是強大的推動你完成的那股子勁兒。

還是不得不說一下,找個夥伴一起吧,這樣會更有信心,即使他幫你做的只有20%。


做夢


轉一篇漫畫給你吧。

來自:「21天教你學會C++」 - 酷殼 – CoolShell.cn
希望對你有幫助不用謝。


加特技,duang的一下。就好了。


作為一個行內人嚴肅地告訴你:這不可能。


不可能的任務。
一般至少需要2年。
小白從什麼都不知道,到理解什麼是編程,至少需要3~6個月。然後大堆東西需要學,後台前台,sql資料庫,編程技巧,都少不了。如果不是真愛,你根本堅持不了這麼久。


不可能的。不是打擊你,這根本不符合學習規律。如果課餘時間學努力的話大約半年以上吧。脫產學習有人指導的話大概小半年。


程序員的飯碗這麼好端么


一個月從零學 JAVA,目標獲得一個公司的實習資格(至少通過筆試吧),能做到嗎? - 程序員
編程零基礎如何學習 Swift? - 程序員
一個月的學習能否上手做安卓app? - 編程


只要你有錢就好了,你想做什麼都行,爺伺候你。
如果你沒錢,那麼你有床就行,躺上去做個夢,想做啥都行。
如果你連床都沒有,那麼只好睡天橋下面了……
睡眠質量不行,估計夢做不好。


那要看您想要寫什麼app了,todolist 啊,抓一些json數據啊還是比較簡單的。
但是這些基本上都只是玩具,買不了錢的。切好圖,一天隨便寫三個五個不費勁。

如果想寫出能賣錢的東西,甚至想做startup,建議先花兩三個月學好基礎,進公司做學徒跟幾個項目,讓工程師美工產品經理什麼的多帶帶。充分學習怎麼挖掘需求,設計界面,設計交互,寫代碼,維護版本,測試項目……有了五六個項目經歷以後,就可以獨立寫一些能賣錢的東西了。

不過最高票的答案思路也對,先入行,入行以後就不會問這個問題了。
但他OC的確是不懂的,不要學。

iOS入門還是很快的,我當時也就花了三天寫出第一個「玩具」(不是「Hello World!」),但是入門後天空廣闊,先不說與C/C++的混編,就是引用編譯各種靜態庫,ide設置,證書下載,軟體上架也夠您玩好一陣子了。

最近在做一個智能家居相關的APP,光是第一個功能就讓我們兩家公司合共8名工程師寫了兩個星期,預計整個工期要到5月初。不到這種工程量的APP,現在已經沒什麼競爭力了。太容易寫就能賺到的錢,基本上都被賺光了。

最後,誠如最高票答案所說,程序誰都能學會。
但是當一個軟體工程師,甚至獨立開發者,需要付出長時間的努力,需要一顆不浮躁但愛折騰的心。這個行業門檻低,難度高

希望您持之以恆,成為獨立開發者,並從中得益。


要做個App?最好先算算賬!做一個APP需要多少成本,得準備多少資金預算?

因為一直做APP研發,常常遇到一些客戶說我要做個APP,我要做啥啥管理系統.......在客戶的眼中,這些APP,這些系統儼然就是通向互聯網金山的鑰匙。各位老闆,我覺的開做之前,我們的先算算賬。

我們先說APP開發

人員基本配置:安卓攻城獅*2、IOS攻城獅*2、後台攻城獅*2、UI設計師*1、產品汪*1;基本上已經很簡配了,攻城獅2人配置是防止人員的異動或者不可避免的人員生病、家裡水龍頭跑睡、汽車肇事等等,最重要的是他們是瓦工工作量大啊!

如果有錢稍微豪華點的配置還有測試工程師、系統架構師、運維工程師等等

那麼這些APP開發人員大概需要花多少錢呢?

安卓工程師:9K起(成手)

IOS工程師:9K起(成手)

後台工程師:PHP 8K起(成手,人少還不招);JAVA 7K起

UI設計師:6.5K起(成手)

產品汪:7K起(成手)
以上薪資都是 稅前工資。

稅前工資總額=9000+9000+8000+6500+7000=39500元

那公司需要負擔多少?各種保險、公積金(不過廣州交公積金的企業不多)

大致是39500*120%=47400

現在也比較流行做微信公眾號開發


那麼微信開發需要多少人呢?

人員配置:PHP*2、UI設計師*1、前端工程師*1、產品汪*1

如果你很幸運有一個全棧工程師,那麼前端工程師可以省略掉,不過,我建議你一定好伺候好這位爺,因為,全棧工程師真的是可遇而不可求!

薪酬依據上面基本上也可以算個七七八八。

PS:上面其實可能還缺了一個崗位,如果老闆本身不能做產品管理的話,那麼至少的有一個管事的吧,這個崗位工資目測怎麼也的10K以上才能靠譜點。

以上薪資為目前廣州APP開發程序員的業內價格。

頭大沒?迷糊沒?

上面只是各位老闆付出的薪酬成本,還有我們組隊的時間成本呢,還有不可估量的市場機會成本。現在的IT市場環境基本上是成手的賣家市場,組隊的時間、人員的素質,都是需要綜合考量的因素。如果降低人員招聘的質量,那麼也必然要承受因為人員質量的降低而帶來的產品質量的降低。

頭有點暈沒?沒暈的話,我們繼續。

你終於費了九牛二虎之力,組隊成功!

接下我們開始正式幹活吧!


APP開發面臨的工作量有多少呢?

海面上面是老闆認為的工作量;

而海面上面+海面下面才是我們實際的工作量;

一個APP的開發周期一般怎麼也兩個月,版本的穩定也還有2個多月,小半年出去了。

最終,通過全體人員不懈的努力,終於鼓搗出來了

終於從0走到了1,恭喜你!邁出了第一步。


APP如何運營?

這才是最大頭的工作,這方面的工作做的少,沒什麼經驗就不胡謅了,不過,我相信相對於運營成本,上面的人力成本可能真的是滄海一粟、九牛一毛.........

希望對想做互聯網的各位有一點點作用,做產品真的需要真金白銀的投入,而且還不一定成功,萬語千言一句話「互聯網不相信眼淚」!且行且珍惜。

文章來源:想做個APP?先要知道做個APP需要多少錢!

軟捷科技:http://www.ruanjiekeji.com


1.沐浴更衣
2.準備一張溫暖的大床
3.做夢


花十天時間,各種廟會擺攤,掙夠錢。用一部分錢,雇十個程序猿,開始瘋狂編程。中途你需要不停的跟他們談理想,講情懷。讓他們相信你是在做ins的路上,死心塌地給你賣命。用十天做出個app的殼子~剩下的錢用來公關,各種圈子各種推。然後就是A,B,C輪融資。行了,兄弟,你離上市不遠了!
http://news.xinhuanet.com/photo/2015-02/24/c_127513426.htm


應用公園:不懂編程,也能快速自己製作手機APP

http://www.apppark.cn

開發一款 App需要多久?如何開發 app?自己開發APP 需要掌握哪些技能?

下面這個開發APP的經驗分享,涵蓋了上面問題的很多要點。

2016年7月,我發布了一款小眾的自媒體APP,iOS版本的。到目前為止,已經更新了三個版本了,下載量已經突破3000,不多但是每天都在持續增加,自己還有很有收穫感的。雖然是業餘時間做的,但是會有一種自己創業的感覺,接下來我就分享一下做這個APP前前後後的一些經驗。


1、關於iOS APP 設計

最初的功能及頁面設計,我是在PPT裡面進行色塊的排版,但是總感覺哪裡不對勁兒,後來自己在紙上畫,來來回回的塗改,也非常不方便。其實最簡單的就是抄襲,沒錯,多看看市場上類似的iOS APP,看一下他們的頁面布局及連接是如何設計的,其實都差不多。

後來才知道這個過程就是iOS APP的原型設計,通過搜索關鍵詞,發現了「墨刀」這個神器,專門做APP頁面排版的,各個鏈接及頁面的跳轉非常方便。因為我自己會一些基礎的畫面處理,製作起來非常順手。

2、關於iOS APP 製作

其實一個iOS APP能不能做出來,我覺得設計師非常重要的,等你把模型做出來了,你就會信心去繼續琢磨。

我的APP模型做出來後,就直接用的應用公園平台上手做了,這個平台不需要編程技術,僅需要對上面的功能模塊進行排版即可,iOS APP 整體開發費用不要外包的十分之一。不要問我怎麼知道這個iOS APP開發平台的,當你決定要做iOS APP的時候,多主動搜索一些相關信息,總會發現的。

我的APP對開發功能的要求不外乎以下幾點:註冊登錄板塊、新聞諮詢板塊、電商板塊,還有就是論壇、貼吧、交友聊天的互動板塊。每個板塊下面都有很多小的細節功能,不過不用擔心,應用公園有已經配置好的模板,複製修改就可以。

iOS APP開發詳細教程:http://www.apppark.cn/t-212.html

3、開發者證書

我在2016年6月就買了一個$99的個人開發者賬號,剛開始就是想走個過程,後來下決心製作APP也有不想浪費了這個688多快大洋的心裡,雖然後來發現,確實浪費了。

因為用個人賬號申請上架APP經常被打回來,一個台灣腔的妹子,總是找各種問題,磨磨唧唧的。後來才知道應用公園幫助會員免費上架,他們作為蘋果的大客戶,有企業賬號,通過率比較高。當然,也需要什麼證書、真機測試等的相關東西。


4.意見反饋

意見反饋開始我用的新浪微博,感覺夠用了,不過用戶要先登錄後才能寫反饋。後來下載了應用公園的運營助手,在手機上就可以隨機處理。

5.iPhone6的適配

iPhone6、7 和6+的適配其實就一句話,這種平台類生產的,都自動適配。

6.伺服器

應用公園提供前期的伺服器,用戶數量不大的情況下,也沒必要自己花錢購買部署。

7.關於運營推廣和統計

數據統計的話,蘋果iTunes Connect自帶的就有統計下載量,應用公園也有後台,可以檢測。同時應用公園也有運營助手,在手機上也可以查看。

8.AppStore搜索優化

關鍵詞可以設好多,我想說的是一定要把所有的關鍵詞都用完,不要浪費。

9.後期規劃、更新迭代

說實話,一個非專業的開發人員能夠製作出一款自己的APP已經很了不起了,即使對專業人員來說,一次性全部搞定也是幻想。一個產品的好壞本身就要根據市場、根據用戶進行不斷的修改。應用公園這類平台做出的iOS APP 還有一點好處就是,無論功能還是內容的更新自己都可以搞定。

時間有了,點子也有,技術成分也不需要太高,只要耐心,自己制一款iOS APP還是很容易的。具體的細節還有很多,大家多多包涵,謝謝!


你沒有這種能力,否則你不會來知乎問這種怎麼開始的問題


無基礎一個月開發出 Instagram 這樣的(完整功能的)App?

要不你學個 Javascript 吧。


推薦閱讀:

TAG:iOS 應用 | 編程語言 | 移動開發 |