1、項目經常使用文件及文件夾
1>Products文件夾:主要用來放Mac開發的可執行文件。對手機應用開發來講徹底沒用
2>Frameworks文件夾:當前開發依賴的一些框架和庫。如Foundation框架,UIKit框架,CoreGraphics框架,test框架
3>工程名+Tests文件夾:用來作單元測試的,寫好某一小塊功能以後,能夠在這裏面寫相應的代碼來測試我寫好的這個函數或者寫好的這個功能是否正確
4>支持文件夾下的 工程名--info.plist文件 :是應用程序的一個配置文件,該文件對工程作一些運行期的配置,很是重要,不能刪除
*項目中其餘plist文件不能帶有"Info"這個字眼,否則會被錯認爲是傳說中很是重要的"Info.plist"。
*項目中含有一個InfoPlist.strings的文件,跟Info.plist文件的本地化相關
info.plist常見設置(這些均可以在工程文件左邊欄第一個的General裏可視化設置)
Bundle display name:顯示在桌面上的應用的名稱(若更名那麼先刪掉這個應用而後Clean一下,再運行。否則可能會有緩存,用的仍是上次的plist文件)
Bundle identifier:程序的惟一標識(發佈應用,真機調試,安裝應用都會用到),若是有2個應用的程序標識同樣,那麼後安裝的會覆蓋前安裝的程序。如cn.baidu
問:爲何域名要倒過來寫?
答:由於域名是惟一的,若是百度和谷歌都開發地圖,那麼兩個map就會有一個被覆蓋。因此將域名倒過來寫com.baidu.map,com.google.map就不會覆蓋了。
Bundle version.string.short:蘋果商店的正式版本(後一次必定要比前一次大)
Bundle version:內部版本
Main storyboard file base name:Main 那麼之後就會加載Main.storyboard
plist文件經過xml保存,xml是用來保存數據的(經過字典鍵值對的形式保存)
5>支持文件夾下的 工程名--Prefix.pch文件(也是一個頭文件)
*pch頭文件的內容能被項目中的其餘全部源文件共享和訪問
用途:
A.通常在pch文件中定義一些全局的宏,或導入一些全局都能用到的頭文件
B.用來自定義Log(不會這個就等於你沒有開發經驗)
在開發中分爲兩個階段
1.開發調試階段:是須要打印LOG調試程序的,若是程序處於調試階段,系統會爲咱們定義一個名爲DEBUG的宏
2.發佈階段:不須要打印LOG,由於LOG很佔用資源而且用戶看不懂LOG,若是程序處於發佈階段,系統就會自動刪除名爲DEBUG的宏
因此須要自定義LOG
*在pch文件中添加下列預處理指令(寫在#ifdef __OBJC__和#endif之間),而後在項目中使用NJLog(...)來輸出日誌信息,就能夠在發佈應用的時候,一次性將NSLog語句移除(在調試模式下,纔有定義DEBUG)
#ifdef DEBUG
#define NJLog(...)NSLog(__VA_ARG5__)//將自定義宏替換成系統宏
#else
#define NJLog(...) //表示這個自定義宏什麼都不替換,因此以前全部用NJLog打印的語句都變成了空白。
#endif
//PS:三個點...表明可變參數緩存
pch文件裏默認代碼的說明
//在全部的.m文件和.mm文件中默認就定義了__OBJC__這個宏,默認導入2個框架
#ifdef __OBJC__
//若是這個全局的頭文件或者宏只須要在.m文件和.mm文件中使用,請把該頭文件或宏寫到#ifdef __OBJC__和#endif之間
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#endif網絡
之後工做第一件事就是打開pch文件,查看公司自定義的LOG是什麼,而後使用公司自定義的LOG,永遠不要使用系統LOG。app
2、4大對象框架
對象1:UIApplication
:ide
1.獲取UIApplication函數
UIApplication *app = [UIApplication sharedApplication]; UIApplication *app1 = [UIApplication sharedApplication]; //app和app1的地址是相同的。證實只有一個UIApplication對象 //UIApplication *app2 = [UIApplication alloc] init];//這句會報錯,由於只能有一個UIApplication對象,不能再建立
2.在View上添加一個按鈕,當點擊按鈕時作應用級別的操做單元測試
UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(100,100,100,100)]; [btn setTitle:@"點我啊" forState:UIControlStateNormal]; [btn addTarget:self action:@selector(onClick) forControlEvents:UIControlEventTouchUpInside]; btn.backgroundColor = [UIColor redColor]; [self.view addSubview:btn];
-(void)onClick { UIApplication *app = [UIApplication sharedApplication]; //桌面圖標左上角就會顯示紅色的998標籤,表明有新的消息 app.applicationIconBadgeNumber = 998; //狀態欄上的小菊花(聯網動畫) app.networkActivityIndicatorVisible = YES; }
3.修改狀態欄樣式(設置狀態欄是否隱藏同理)
方法一:經過控制器修改狀態欄(適用於應用中包含多種樣式狀態欄的狀況)測試
-(UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; }
方法二:經過UIApplication修改狀態欄(適用於應用中狀態欄樣式不變的狀況)
1>先在Info.Plist文件中添加一個屬性View controller-based status bar appearance,並設置爲NO
2>app.statusBarStyle = UIStatusBarStyleLightContent;
下面的方法還能夠設置動畫
[app setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];動畫
/* URL:統一資源定位符,用來惟一地表示一個資源 URL:協議頭://主機地址/資源路徑 網絡資源:http://www.baidu.com/images/20140603/abc.png 本地資源:file://users/apple/desktop/abc.png */ NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"]; [app openURL:url]; //系統會自動判斷資源類型而且使用適當應用打開
對象2:UIApplicationDelegategoogle
對象3:UIWindow
#pragma mark - 代理方法 //當應用程序啓動完畢的時候就會調用(系統自動調用,且只調用一次,退到後臺再啓動就不會再調用了) -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { return YES; } //即將失去活動狀態的時候調用(失去焦點,不可交互) -(void)applicationWillResignActive:(UIApplication *)application { } //應用程序進入後臺的時候調用 //通常在該方法中保存應用程序的數據,以及狀態 -(void)applicationDidEnterBackground:(UIApplication *)application { } //應用程序即將進入前臺的時候調用 //通常在該方法中恢復應用程序的數據,以及狀態 -(void)applicationWillEnterForeground:(UIApplication *)application { } //從新獲取焦點(可以和用戶交互) -(void)applicationDidBecomeActive:(UIApplication *)application { } //應用程序即將被銷燬的時候會調用該方法 //注意:若是應用程序處於掛起狀態的時候沒法調用該方法 -(void)applicationWillTerminate:(UIApplication *)application { } //應用程序接收到內存警告的時候就會調用 //通常在該方法中釋放掉不須要的內存 -(void)applicationDidReceiveMemoryWarning:(UIApplication *)application { }
UIWindow的建立
系統會在didFinishLaunchingWithOptions:方法中自動建立UIWindow,設置其背景色爲白色,並將UIWindow顯示出來。
建立一個空Application就能夠看到這些細節,但須要本身建立控制器(若是建立Single View Application就不須要,系統會自動建立)
方式一:將控制器view添加到UIWindow上
問題:當view發生一些事件的時候,通知控制器,可是控制器已經銷燬了,因此可能出現未知錯誤
方式二:將Window的根控制器設置爲建立的控制器
(建議使用這個方法,系統自動設置時也是這樣作的。)
好處:當發生旋轉事件的時候,UIApplication對象會將旋轉事件傳遞給UIWindow,UIWindow又會將旋轉事件傳遞給它的根控制器,由根控制器決定是否須要旋轉,因此設置了根控制器就會旋轉,方便用戶操做。
對象4:UIViewController
3、程序啓動原理
打開程序會執行main函數,由上至下執行如下代碼
int main(int argc,char * argv[ ]) { /* 瞭解便可 argc:系統或者用戶傳入的參數個數 argv:系統或者用戶傳入的實際參數 */ return UIApplicationMain(argc,argv,nil,NSStringFromClass ([NJAppDelegate class])); /* 瞭解便可 1.根據傳入的第三個參數建立UIApplication對象 2.根據傳入的第四個參數建立UIApplication對象的代理 3.設置剛剛建立出來的代理對象爲UIApplication的代理 4.開啓一個事件循環(UIApplicationMain永遠不會返回) */ }
iOS程序的啓動過程(須要掌握)
監聽系統事件,而後將事件隊列(先進先出)裏的事件依次處理,處理一個扔一個,有事件就處理,沒事件就休息,至關於一個死循環,永遠不返回。
兩種狀況會返回
1.被系統主動關掉
2.被用戶主動關掉
筆記:
程序完整啓動過程
1.main函數
|
2.UIApplicationMain(建立UIApplication及其代理,並設置代理)
|
3.沒有storyboard的狀況
delegate對象開始處理(監聽)系統事件
*程序啓動完璧的時候就會調用代理的application:didFinishLaunchingWithOptions:方法
*在application:didFinishLaunchingWithOptions:方法中建立UIWindow
*建立和設置UIWindow的rootViewController
*顯示窗口
3.有storyboard的狀況
根據Info.plist得到最主要storyboard的文件名,加載最主要的storyboard
*建立UIWindow
*建立和設置UIWindow的rootViewController
*顯示窗口
問:爲何必需要有UIWindow才能顯示內容?
答:由於只有UIWindow有makeKeyAndVisible(讓窗口成爲主窗口並顯示出來)
PS:一個應用程序只能有一個主窗口(後一個會覆蓋前一個)
BUG:iOS7和iOS8裏面主窗口和次窗口沒區別。