【對比Android與IOS開發系列】之 Activity與UIViewController,uiviewcontroller
對比開發系列 Activity與UIViewController
Activity與UIViewController
Android的Activity和Fragment是最基本的介面組成,而IOS是UIViewController。幾乎所有的View和空間都會放在Activity和UIViewController中。
在之上有不少擴充的:
Android: FragmentActivity, AppCompatActivity
IOS: UITableViewController, UICollectionViewController
我們對比一下繼承關係:
Android: Activity->ContextThemeWrapper->ContextWrapper->Context
IOS: UIViewController->UIResponder->NSObject
IOS幾乎所有的基類都是NSObject,Android中也有Object,一般作為Model層對象的基類。
生命週期
這方面資料很多,我簡單說一下:
Android的Activity, onCreate() 中初始化操作, onResume()中可以加一些改變介面和狀態的操作;
IOS的UIViewController, -viewDidLoad 中初始化操作, -viewWillAppear 中可以加一些改變介面和狀態的操作;
對比一下:
Activity: onCreate() –> onStart() –> onResume( )–> 運行態 –> onPause() –> onStop() –> onDestroy()
UIViewController: -viewDidLoad –> -viewWillAppear –> -viewDidAppear –> 運行態 –> -viewWillDisappear –> -viewDidDisappear
這裡補充一個Android的
Fragment:* *onAttach() –> onCreate() –> onCreateView() –> onActivityCreate() –> onStart() –> onResume( )–> 運行態 –> onPause() –> onStop() –> onDestroyView() –> onDestroy() –> onDetach()
Android與IOS都使用 堆棧 的資料結構 儲存Activity和UIViewController.
Android關於Activity的堆棧, 可以搜尋taskAffinity和launchMode。同一應用所有Activity具有相同的親和性(taskAffinity),可通過Itent FLAG設定,也可在AndroidManifest中設定.
IOS中的UINavigationController通過堆棧來UIViewController.
介面跳轉與傳值
Android: Activity可以使用Intent,Fragment使用Bundle。 對於介面回調傳值,通過startActivityForResult()啟動和onActivityResult()接收。
IOS: 在初始化UIViewController對象時,直接給對象中的變數賦值。 對於介面回調傳值,可以自訂介面(Delegate),也可以使用通知(Notification)
結構類型類代碼
//AndroidA.java Class A extends B implements C
//IOSA.h @interface A : B A.m @implementation A <C>
強引用和弱引用
Android:
有四種參考型別,強引用(StrongReference),軟引用(SoftReference),弱引用(WeakReference),虛引用(Phantom Reference)。
一般建立的對象都是強引用。所以當記憶體空間不足時,Java虛擬機器寧願拋出OOM異常,也不會隨意回收強引用的對象。
對於軟引用,記憶體空間足夠,記憶體回收行程就不會回收它,可以做圖片的緩衝。
對於弱應用,使用情境例如:在Activity中使用Handler時,一方面需要將其定義為靜態內部類形式,這樣可以使其與外部類(Activity)解耦,不再持有外部類的引用,同時由於Handler中的handlerMessage一般都會多少需要訪問或修改Activity的屬性,此時,需要在Handler內部定義指向此Activity的WeakReference,使其不會影響到Activity的記憶體回收同時,可以在正常情況下訪問到Activity的屬性。
IOS:
使用__weak, __strong用來修飾變數,預設聲明一個對象 __strong。
在強引用中,有時會出現循環參考的情況,這時就需要弱引用來幫忙(__weak)。
強引用持有對象,弱引用不持有對象。
強引用可以釋放對象,但弱引用不可以,因為弱引用不持有對象,當弱引用指向一個強引用所持有的對象時,當強引用將對象釋放掉後,弱引用會自動的被賦值為nil,即弱引用會自動的指向nil。
私人和公有
IOS中有- +方法,-相當於Android中的private,
+相當於Android中的public static。
對於全域變數,IOS是放在AppDelegate中或者使用#define聲明在.h中。
Android同樣,放在Application中 或者類中使用public static。
當然,都可以使用單例類。
基本控制項
對比一些常用的
| Android |
IOS |
| TextView |
UILabel |
| TextEdit |
UITextField UITextView |
| ImageView |
UIImageView |
| Button |
UIButton |
| Switch |
UISwitch |
| ListView |
TableView |
| GridView |
CollectionView |
對比一下繼承:
Android Views -> View
IOS Views -> UIView -> UIResponder -> NSObject
Java實際上任何對象都是直接或間接繼承自Object,寫extends Object和不寫extends是等價的。
因此 Android和IOS的對象, 本質上都是從頂級的Object繼承來的。Amazing~
後記
暫時寫這麼多,隨後再補充。
這篇只是這個系列的第一篇,隨後再寫更多。
文章和代碼一樣,也需要不斷去梳理,不斷迭代。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。