首頁

2013年7月22日 星期一

**繁/英/韓**App對應的專案程式碼**依據當初開發時----不同的設定*---*三種全然不同的~ ios SDK*__{不需要去煩心尋找修改}*第二章..(完)~*(EN)***Appcorresponds to the original project code **basis when developing different settings*---*Three completely diffeent ~ ios SDK* (modify ) do not need to worry about looking for !!*Chapter 2)..!!**(KR)*다른 설정을 개발할 때*** 앱은 원래 프로젝트 코드에 **기준에 해당 *---* 세 가지 완전히 다른 ~ IOS SDK * *_* {수정} ** 찾고에 대해 걱정할 필요가 없습니다 ~*제 2장 !!*완결**

**繁/英/韓**App對應的專案程式碼**依據當初開發時--
--不同的設定*---*三種全然不同的~ ios SDK*_
_{不需要去煩心尋找修改}*第二章..(完)~
*(EN)****Appcorresponds to the original project code **basis when developing different settings*---*
Three completely diffeent ~ ios SDK* (modify )
do not  need to worry about looking for !!*Chapter 2)..!!
**(KR)*다른 설정을 개발할 때*** 앱은 원래 프로젝트
코드에 **기준에 해당 *---* 가지 완전히 다른 ~
IOS SDK * *__* {수정} ** 찾고에 대해 걱정할
필요가 없습니다 ~*2 !!*완결**

***故事二*以程式碼設計App( 起始畫面 )當不靠storyboard,也不透過xib,完全經由程式碼打造App美麗的起始畫面時,
故事又將如何進行呢? 其實答案很簡單,毫無創意,幾乎和故事二一模一樣。
如下所示,我們看到它的application:didFinishLaunchingWithOptions: ,
跟故事一的就像是同一個模子印出來的
檔案AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.viewController = [[ViewController alloc] init];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}

唯一的小小差異,存在於以下這一行controller物件的建立。

self.viewController = [[ViewController alloc] init];


在這裡我們單純的建立ViewController物件,不依靠xib,因此沒有呼叫 initWithNibName:bundle:。到時候controller顯示的畫面完全定義--
--在ViewController.m裡。

其實有一個秘密***雖然我們只呼叫init,但是在UIViewController定義---
---的init method裡,其實會另外地再去呼叫initWithNibName:bundle: method,
只不過此時傳入的2個參數都是nil。前面提到當nibBundleOrNil為nil時,
將預設為App的main bundle。其實當nibNameOrNil等於nil時,
也有特別意義。當它是nil時,將假設要找尋的xib檔檔名跟controller同名。
所以如果我們的xib檔跟controller同名,比方在這裡都叫ViewController,
其實是可以傳入nil就好。

因此,最後呼叫makeKeyAndVisible時,一樣會試著去載入ViewController.xib,
只不過因為此時專案裡沒有這個檔案,所以到時候將另外生成什麼都--
--沒有的view元件做為controller的view。

**故事三*(storyboard 設計App始畫面  : 
前三個步驟跟故事一相同,但從步驟4就開始變調了。

4. 建立App主畫面的window (UIWindow物件),並設定AppDelegate物件--
--的window property連結到window物件。

5. 載入MainStoryboard.storyboard

從Target App Summary頁面的Main Storyboard欄位我們可以設定App--
啟動後載入的storyboard檔  **
****
**也可以從Info頁面的Main storyboard file base name欄位設定**
****
**6. 從storyboard找到負責起始畫面的view controller (由箭頭標記識別)

在Storyboard上可能有多個view controller,
負責起始畫面的view controller有以下2個特徵
(1) 有個箭頭指向它
(2)  Attribute Inspector頁面的Is Initial View Controller被勾選      *
****
**7. 建立負責起始畫面的view controller物件**
***在view controller的Identity Inspector頁面裡,
Class欄位決定了view controller的類別         *
****
***因為View Controller的view property連結到storyboard上設計的view,
所以到時候我們看到的App畫面,也就是此controller所管理的頁面,
才會恰恰好等於storyboard上設計的畫面             *
****
**8. 設定UIWindow物件的rootViewController property為剛剛---
---建立的ViewController物件  **
**9. App完成啟動,呼叫AppDelegate物件的application:
didFinishLaunchingWithOptions: method

檔案AppDelegate.m

-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
    // Override point for customization after application launch.
    return YES:
}
令人覺得不可思議的,當以storyboard設計App起始畫面時,application:didFinishLaunchingWithOptions:裡竟然什麼都不做,
只回傳YES表示App順利完成啟動。其實當初故事一二的application:didFinishLaunchingWithOptions:裡做的事,在故事三也有做,
只是這些事都是早在此method被呼叫前就事先做了。
所以如果我們在此method裡列印self.window, self.viewController時,
將看到物件的記憶體位址,而不會是空的。
10. 呼叫UIWindow物件的makeKeyAndVisible method,顯示window,
進行和前面故事一二一樣的流程。只不過這次生成的view將--
---從storyboard而來,連結到storyboard裡的UIView元件                **
                              **完~****
**EN**
Story of two * *** in code design App (start page)When not rely storyboard, nor through xib, completely via the App code 
to create a beautiful start screen,How will the story be it? The answer is simple, there is no creativity, 
and stories of two almost identical.As shown below, we see that it's application: didFinishLaunchingWithOptions:,The story is like with a print out of the same moldFile AppDelegate.m- (BOOL) application: (UIApplication *) application didFinishLaunchingWithOptions: (NSDictionary *) launchOptions{
    
self.window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];
    
/ / Override point for customization after application launch.
    
self.viewController = [[ViewController alloc] init];
    
self.window.rootViewController = self.viewController;
    
[Self.window makeKeyAndVisible];
    
return YES;} The only small differences exist in the following line controller object creation.self.viewController = [[ViewController alloc] init];Here we simply build ViewController object, do not rely xib, so there is no 
call initWithNibName: bundle:. To the screen displayed when controller is  
 fully defined -- In ViewController.m Lane.In fact, there is a secret *** Although we only call init, but defined in  
 UIViewController ------ The init method, the fact will additionally go to call initWithNibName:
 bundle: method,But this time passed two parameters are nil. Mentioned
earlier when nibBundleOrNil is nil, the App will default to the main bundle. 
In fact, when nibNameOrNil equal to nil,  theAlso has a special significance. When it is nil, it will assume you want to 
 find the xib file the same name as the file name with the controller.So if we xib file with the controller with the same name, for example, 
here called ViewController,In fact, can pass nil like.Therefore, the last call makeKeyAndVisible time, they would try to  
 load ViewController.xib,Simply because there are no projects at this time this file, so when  
the time will additionally generate anything -- No view component as controller of view.*^^!* Story three * (storyboard design App start screen:The first three steps with an identical story, but began tone of step 4.4 Establish App main screen window (UIWindow objects), and set the 
 AppDelegate object -- The window property linked to the window object.5 Load MainStoryboard.storyboardFrom the Target App Summary page Main Storyboard field we can set App -Starts loading the storyboard file                      ***
****
**Also available from the Info page Main storyboard file base name field is set  **
*****
**6). From the storyboard found responsible for starting screen view controller 
(indicated by the arrow mark recognition)

There may be multiple in Storyboard view controller, responsible for the 
start-up screen view controller has the following two characteristics
(A) there is an arrow pointing to it 
(2) Attribute Inspector page Is Initial View Controller is checked    **
****
**7). Establish responsible for start-up screen view controller object
In the view controller's Identity Inspector pages, Class field determines 
the view controller class     **
****
**Because View Controller's view property linked to the design on the 
storyboard view, so when we saw the App screen, which is managed by 
the pages of this controller, the design will be just right on the screen is 
equal to storyboard        **
****
**8 Set UIWindow object rootViewController property of an object just created ViewController

9. App finish starting, call AppDelegate object's application: didFinishLaunchingWithOptions: method



File AppDelegate.m


- (BOOL) application: (UIApplication *) application didFinishLaunchingWithOptions: (NSDictionary *) launchOptions
{
     / / Override point for customization after application launch.
     return YES;
}


People feel incredible, when the start screen App storyboard design, application: didFinishLaunchingWithOptions: li actually do nothing, just return YES means
App successfully completed startup. In fact, when the story twelve of application: didFinishLaunchingWithOptions: doing things in the story three have to do,
 but these things are all back in this method is called before the advance made​​.
So if we have this method in print self.window, self.viewController,
you will see the object's memory address, and will not be empty.


10). Call UIWindow object makeKeyAndVisible method, display window, 
the same as for the previous twelve story flow. 
But this time generated view comes from the storyboard to link to  
storyboard UIView components inside           **
                                                                                                    **END~*****
**( KR )**
**두 가지의 이야기 **** 코드 디자인 App에서 (시작 페이지)스토리 보드를 의지하지 않는 경우, 또는 XIB를 통해 완전히 아름다운 시작
화면을 만들 수있는 응용 프로그램 코드를 통해,어떻게 이야기가 될 것인가? 대답은 간단하다, 아무 독창성도없고, 거의
동일한 두 개의 이야기.didFinishLaunchingWithOptions : 아래 그림과 같이, 우리는 그것의 응용
프로그램을 참조하십시오,이야기는 동일한 형의 밖으로 프린트처럼파일 AppDelegate.m- (BOOL) 신청 : (UIApplication *) 응용 프로그램 didFinishLaunchingWithOptions :
(있는 NSDictionary *) launchOptions{
    
self.window = [[UIWindow에 할당] initWithFrame : [[UIScreen mainScreen] 경계];
    
/ / 응용 프로그램 실행 후 맞춤 점을 재정의합니다.
    
self.viewController = [[있는 viewController 할당] INIT]
    
self.window.rootViewController = self.viewController;
    
[Self.window makeKeyAndVisible]
    
YES 반환;} 단지 작은 차이는 다음과 같은 라인 컨트롤러 객체 생성에 존재합니다.self.viewController = [[있는 viewController 할당] INIT]여기에서 우리는 단순히있는 viewController 객체를 구축 XIB를 의존하지
않기 때문에 외침 initWithNibName가 없습니다 : 번들 :. - 컨트롤러가 완전히
정의 될 때 표시되는 화면- ViewController.m 레인합니다.우리는 init을 호출하지만 사실, 비밀 ***이 있습니다 만,
 UIViewController에 정의 ---번들 : --- init 메소드, 사실은 추가 initWithNibName 전화를 갈 방법은,하지만 이번에는 두 개의 매개 변수가 전무 통과시켰다. 이전 nibBundleOrNil이
전무 할 때 언급응용 프로그램은 기본 번들로 기본 설정됩니다. 사실 때, 전무,
동등한 nibNameOrNil또한 특별한 의미가있다. 이 전무 할 때, 그것은 당신이 XIB 파일에게
컨트롤러와 파일 이름과 동일한 이름을 찾으려면 가정합니다.우리는 같은 이름의 컨트롤러 파일을 XIB 경우에, 예를 들어,
여기에있는 viewController 호출사실, 같은 nil을 전달할 수 있습니다.따라서, 마지막 호출 makeKeyAndVisible 시간,
그들은 ViewController.xib를로드 할 것이다시간이 추가로 아무것도 생성되므로이 시간에는 프로젝트에이
파일이없는 단순히 때문에 -- 뷰의 컨트롤러로 구성 요소를 볼 수 없음.* 스토리 세 * (스토리 보드 디자인 응용 프로그램 시작 화면 :처음 세 개의 동일한 이야기​​를 같이하지만, 4 단계의 톤을 시작했다.4 앱 메인 화면 창 (UIWindow에 객체)을 수립하고,
 AppDelegate 개체를 설정합니다 -- 윈도우 속성은 윈도우 개체에 연결됩니다.5 부하 MainStoryboard.storyboard대상 응용 프로그램 요약 페이지 메인 스토리 분야에서 우리는 응용 프로그램을
설정할 수 있습니다 -스토리 보드 파일의로드를 개시합니다         **
**
**또한 정보 페이지 메인 스토리 파일 기본 이름 필드에서 사용할
수있는이 설정됩니다  ****
 **스토리 보드에서 6 화면보기 컨트롤러 (화살표 표시 인식으로 표시됨) 시작
대한 책임이 있습니다

스토리 보드보기 컨트롤러에서 여러가있을 수 있습니다 시작 화면보기 
컨트롤러에 대한 책임 다음과 같은 두 가지 특징이 있습니다
(A) 화살표가 여기에 있습니다 가리키는
(2) 속성 관리자 페이지 초기 컨트롤러가 선택되어인가            **
****
**7 시작 화면보기 컨트롤러 개체에 대한 책임 수립

뷰 컨트롤러의 ID 속성 페이지에서 클래스 필드는 컨트롤러 클래스를 결정       **
****
**보기 컨트롤러의 뷰 속성은 우리가이 컨트롤러 페이지에서 관리되는
응용 프로그램 화면을 볼 때, 그래서 스토리 보드보기에서 디자인
연결하기 때문에, 디자인은 스토리 보드에 동일한 화면에 바로 될 것입니다          **
****
**개체의 8 세트는 UIWindow 객체 rootViewController 속성 방금있는
viewController 생성

. didFinishLaunchingWithOptions : 방법 : 9 마무리 시작 AppDelegate
개체의 응용 프로그램을 호출

파일 AppDelegate.m


- (BOOL) 신청 : (UIApplication *) 응용 프로그램 didFinishLaunchingWithOptions :
(있는 NSDictionary *) launchOptions
{
   / / 응용 프로그램 실행 맞춤 점을 재정의합니다.
     YES 반환;
}

didFinishLaunchingWithOptions : 리튬 실제로 아무것도하지 않는,
그냥 YES 반환하면 응용 프로그램이 성공적으로 시작 완료 의미 시작 화면
스토리 보드 디자인, 응용 프로그램을 사람들은 믿을 수없는 느낌.
사실, 응용 프로그램의 이야기 열두 : didFinishLaunchingWithOptions :
미리 만든 전에 이야기를 세 가지 일을 수행해야하지만, 이런 일들
방법의 모든 돌아가 호출됩니다. 우리는 인쇄 self.window,
self.viewController 방법이 경우에, 당신은 개체의 메모리 주소를 참조하고,
비어 있지 않습니다.

10 전화는 UIWindow 객체 makeKeyAndVisible 방법, 디스플레이 창,
 이전에 12 층의 흐름과 동일합니다. 이번에 생성 된 뷰는 내부 UIView의
구성 요소를 스토리 보드 링크 스토리에서 온다             ***
                                                                                                        **완결~***
****
**
*MelodyRO~*
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

***App對應的專案程式碼**依據當初開發時不同的設定*---*三種全然不同的~ ios SDK*__{不需要去煩心尋找修改}*第一章.....待續*(EN)**** App corresponds to the original project code ** basis when developing different settings *---* Three completely different ~ ios SDK * __ {modify} do not need to worry about looking for !!*Chapter ..... To be continued**(KR)*다른 설정을 개발할 때 *** 앱은 원래 프로젝트 코드에 ** 기준에 해당 *---* 세 가지 완전히 다른 ~ IOS SDK * *__* {수정} ** 찾고에 대해 걱정할 필요가 없습니다 ~*제..... 계속하기****

***App對應的專案程式碼**依據當初開發時---
不同的設定*------*三種全然不同的~ ios SDK*_
_{不需要去煩心尋找修改 }*第一章.....待續*
*}**(EN)**** App corresponds to the original 
project code ** basis when developing  
different settings *-----* Three completely  
different ~ ios SDK * {modify} do not need  
to worry about looking for !!*Chapter ..... To be continued* *
!*(KR)***다른 설정을 개발할 때 *** 앱은 원래 
프로젝트 코드에 ** 기준에 해당 *----* 세 가지 
완전히 다른 ~ IOS SDK * _**{수정} ** 찾고에 
대해 걱정할 필요가 없습니다 ~* ..... 계속하기**

*CHT))*若是沒有特別提到對應的專案程式碼,即表示此處的動作是存在,
真的有執行,但我們看不到也不需要去煩心尋找修改的***
*EN))*** If there is no specific reference to the corresponding project code,  
 it means that the action is present here,
Really perform, but we do not need to worry about not see looking to modify ***

***

*KR))**해당 프로젝트 코드에 대한 구체적인 언급 없음 * 경우, 작업이 여기에 
존재하는 것을 의미한다 정말 수행하지만, 우리가 고민 할  
필요가없는 것은 *** 수정을 찾고 볼 수 없습니다***

*CHT**
**故事一(以xib設計App起始畫面): 

1.  App啟動,執行main function

檔案 main.m

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil,

 NSStringFromClass([AppDelegate class]));
    }
}

2. 建立代表App的UIApplication物件

3.  建立App代理人AppDelegate物件,UIApplication物件的代理人將被 

設為此AppDelegate物件

為什麼那麼巧App的代理人物件類別是AppDelegate? 其實這是有玄機的。

回頭看看剛剛的main function,在main function裡我們呼叫UIApplicationMain function,
此function的宣告如下:


檔案 UIApplication.h

int UIApplicationMain(int argc, char *argv[], NSString

*principalClassName, NSString *delegateClassName);

此function的第4個參數為delegateClassName。
所以我們在此傳入代理人物件的類別字串,
到時候自然就會產生此類別的代理人物件。 
最簡單的寫法其實可以直接傳入@"AppDelegate",
不過在這裡我們看到了實際傳入的則是以下function的回傳物件

 NSStringFromClass([AppDelegate class])

此function的宣告如下:

檔案NSObjCRuntime.h

NSString *NSStringFromClass(Class aClass);

在SDK裡,每一個類別都可以化身為類別物件( 類別為Class),
而當我們將類別物件傳入NSStringFromClass後,即可取得代表--
--此類別的NSString物件。因此我們首先呼叫[AppDelegate class] 
取得AppDelegate的類別物件 (任何的類別都可透過呼叫class method,
得到它的類別物件) ,接著當成參數傳入後, 
即可取得此類別的字串@"AppDelegate"。

class method的宣告如下:


檔案NSObject.h

+ (Class)class;
4. App完成啟動,呼叫AppDelegate物件的
application:didFinishLaunchingWithOptions: method


檔案AppDelegate.m

- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:
[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.viewController =
 [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}

由application:didFinishLaunchingWithOptions: 的程式碼,
可以再衍生出步驟5 ~ 8 

5. 建立App主畫面的window (UIWindow物件),
並設定AppDelegate物件的window property連結到window物件

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

UIWindow物件是App畫面最底層的UI元件,必須要先有window,
之後才能再將其它的UI元件,比方UIView元件,加到它的上面。

在建立UIWindow元件時,我們透過nitWithFrame: method初始化
window的大小。由於App的畫面一定是佔滿整個螢幕, 
所以我們利用[[UIScreen mainScreen] bounds]取得螢幕的大小,
以此作為window的尺寸。

至於AppDelegate的window property,則可在AppDelegate.h裡找到

檔案 AppDelegate.h

@property (strong, nonatomic) UIWindow *window;
6. 建立View Controller物件,指定其對應的xib檔名,
並連結到AppDelegate的property

self.viewController = [[ViewController alloc]
initWithNibName:@"ViewController" bundle:nil];

AppDelegate的viewController property宣告如下:


檔案 AppDelegate.h



@property (strong, nonatomic) ViewController *viewController;


利用initWithNibName:bundle:初始化ViewController物件。
此method的宣告如下: 

檔案 ViewController.h

- (id)initWithNibName:(NSString *)nibNameOrNil 
 bundle:(NSBundle *)nibBundleOrNil;;

參數nibNameOrNil:
xib檔的名稱。

參數nibBundleOrNil:
NSBundle物件。到時候在載入xib檔時,將會尋找bundle下的xib檔。
由於我們的xib檔是直接加入專案裡,所以它會包含在最後 
產生的App bundle資料夾下。 
因此其實我們應該傳入[NSBundle mainBundle],
如此搭配前一個參數傳入的xib檔名@"ViewController", 
即可找到ViewController.xib。

但是令人不解的,我們卻傳入nil。這是因為當我們傳入nil時,
到時候在載入xib時,將假設此xib在App bundle資料夾下,
因此還是可以找到xib檔。

如果仔細觀察UIViewController.h,則可找到以下2個property。

@property(nonatomic, readonly, copy) NSString *nibName;

@property(nonatomic, readonly, retain) NSBundle *nibBundle;

因此我們在initWithNibName:bundle:傳入的參數,其實會記錄在--
--這2個property裡。等到之後時機成熟,真的要載入xib時,再從這裡查詢。
7. 設定UIWindow物件的rootViewController property--
--為剛剛建立的ViewController物件

self.window.rootViewController = self.viewController;
此property的宣告如下


檔案 UIWindow.h

@property(nonatomic,retain) UIViewController *rootViewController;


8. 呼叫UIWindow物件的makeKeyAndVisible,顯示window

[self.window makeKeyAndVisible];

最後呼叫的makeKeyAndVisible method,其實是App畫面現身的關鍵一步。
當呼叫此method時,除了代表讓window顯示外, 
還會去呼叫此window的rootViewController的view method, 
取得controller管理的畫面_view。 
在這裡view method其實就是_view的getter,
它們的相關宣告如下:

檔案UIViewController.h

UIView *_view;

@property(nonatomic,retain) UIView *view; 


此getter method view十分特別。傳統上我們會經由setter設定,

getter取得。但此getter會去檢查此時_view是否有值, 
如果沒有了話它會去生成_view元件,然後才回傳。 
因此在這一步時它會先發現此時_view是空的, 
於是經由nibName和nibBundle找尋相關的xib檔,如果有找到, 
即會呼叫NSBundle物件的loadNibNamed:owner:options: method, 
載入此xib檔,生成xib檔裡的UI元件。
此method的宣告如下:


檔案UINibLoading.h


- (NSArray *)loadNibNamed:(NSString *)name
owner:(id)owner options:(NSDictionary *)options;

在呼叫此method時,此controller物件將是第2個傳入的參數owner,
因此到時候此xib檔的owner將是此controller。



此時讓我們回頭檢視ViewController.xib。點選File's Owner。
現在我們知道了此File's Owner將是ViewController物件。 
切換到Identity Inspector頁面,此時可以看到Class欄位很巧的--
--正是ViewController。也因為設為ViewController,到時候我們 ---
---才能將xib上的UI元件和ViewController做連結。


接著切換到Connection Inspector頁面,我們可以看到controller的view已經
事先被連結到畫面上的View元件了。所以回到剛剛前面載入xib檔的說明。
當xib檔被載入,裡面的UI元件一一被生成後,它的UIView元件就連結到了--
controller的view。因此最後這個view,也就是我們在xib裡設計的畫面,
將被加到window上,成為我們啟動App後,第一個看到的畫面。


                             
**

**EN**
**Story one (start screen to xib Design App):1. App start, execute main functionFile main.mint main (int argc, char * argv []){
    
@ Autoreleasepool {
        
return UIApplicationMain (argc, argv, nil,

NSStringFromClass ([AppDelegate class]));
    
}}(2) to establish the UIApplication object represents App3 Establish App agents AppDelegate object, UIApplication object's agent

will be set to this object AppDelegateWhy are so clever App agent object class AppDelegate? Fact, this is a mystery.
 Just look back at the main function, the main function where we call
UIApplicationMain function, this function is declared as follows:File UIApplication.hint UIApplicationMain (int argc, char * argv [], NSString *
principalClassName, NSString * delegateClassName);This function first four parameters delegateClassName. So we are 
here to pass proxy object class string, that time will naturally generate a 
proxy object in this category. 
 The simplest formulation can actually be passed directly @ "AppDelegate", 
but here we see the actual incoming is the following function returns an object of

 
NSStringFromClass ([AppDelegate class])This function is declared as follows:File NSObjCRuntime.hNSString * NSStringFromClass (Class aClass);In the SDK, each category can be transformed into a

class object (class of Class), and when we passed NSStringFromClass
class object, you can get NSString object representing this category. 
 Therefore, we first call [AppDelegate class] made AppDelegate class object 
(can be any class by calling class method, to get it to the class object), 
and then passed as a parameter, you can obtain this 
 category string @ "AppDelegate" .class method declaration as follows:File NSObject.h+ (Class) class;4. App finish starting, call AppDelegate object's application:
didFinishLaunchingWithOptions: methodFile AppDelegate.m- (BOOL) application: (UIApplication *) application
didFinishLaunchingWithOptions: (NSDictionary *) launchOptions{
    
self.window = [[UIWindow alloc] initWithFrame: 

 [[UIScreen mainScreen] bounds]];
    
/ / Override point for customization after application launch.
    
self.viewController = [[ViewController alloc] initWithNibName: 

 @ "ViewController" bundle: nil];
    
self.window.rootViewController = self.viewController;
     
[Self.window makeKeyAndVisible];
    
return YES; } By the application: didFinishLaunchingWithOptions: code,

you can then derive Steps 5-8(5) Establish App main screen window (UIWindow objects), 
 and set the AppDelegate object window property linked to the window objectself.window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];UIWindow object is the bottom of the screen App UI component, must first have a window, and then only after the other UI elements, such as UIView components, added on top of it.UIWindow element in the establishment, we, through nitWithFrame:
method to initialize the window size.
As App picture fills the whole screen must be,
so we use [[UIScreen mainScreen] bounds] to obtain the size 
of the screen as a window size.As AppDelegate's window property, can be found in AppDelegate.hFile AppDelegate.h@ Property (strong, nonatomic) UIWindow * window;(6) Establish View Controller object, specify the corresponding xib
file name and link to the property AppDelegateself.viewController = [[ViewController alloc] initWithNibName:
@ "ViewController" bundle: nil];AppDelegate's viewController property declared as follows:File AppDelegate.h@ Property (strong, nonatomic) ViewController * viewController;Use initWithNibName: bundle: initialized ViewController object.
This method is declared as follows:File ViewController.h- (Id) initWithNibName: (NSString *) nibNameOrNil bundle:
(NSBundle *) nibBundleOrNil;;Parameters nibNameOrNil:xib file name.Parameters nibBundleOrNil:NSBundle object. By the time the load xib file, it will look for bundle under the xib file.
Since our xib file is added directly to the project where it will be included in the 
 final generated App bundle folder. So in fact, we should pass [NSBundle mainBundle], 
 so with the previous parameter passed xib file name @ "ViewController", 
you can find ViewController.xib.But paradoxically, we are passing nil. This is because when we pass nil when 
 loading xib at that time, it will assume that this xib in the App bundle folder,
 so it can find xib files.If you look closely UIViewController.h, you can find the following two property.@ Property (nonatomic, readonly, copy) NSString * nibName;@ Property (nonatomic, readonly, retain) NSBundle * nibBundle;So we initWithNibName: bundle: incoming parameters, in fact, will be recorded  
in this two property inside. Wait until after the time is ripe, really want to load xib, 
and then from here to search.7 Set UIWindow object rootViewController property of an object 
just created ViewControllerself.window.rootViewController = self.viewController;This property is declared as followsFile UIWindow.h@ Property (nonatomic, retain) UIViewController * rootViewController;8 Call UIWindow object makeKeyAndVisible, display window[Self.window makeKeyAndVisible];Last call makeKeyAndVisible method, in fact, is a key step App screen appeared.
When calling this method, in addition to representatives make window display,
the call will go to the rootViewController this window of view method,
to obtain the controller management screen _view.
 Here view method is actually _view the getter,
their associated declare as follows:File UIViewController.hUIView * _view;@ Property (nonatomic, retain) UIView * view;This getter method view is very special. Traditionally, we will set via setter,
getter available. However, this time _view getter will check whether there is value,
 if not, then it will go to generate _view components before you return. Therefore,
 in this step at this time when it will first find _view is empty,
then via nibName and nibBundle find related xib file, if found,
will call NSBundle object loadNibNamed: owner: options: method,
load the xib files generated xib file in the UI components.
This method is declared as follows:File UINibLoading.h- (NSArray *) loadNibNamed: (NSString *) name owner:
(id) owner options: (NSDictionary *) options;After calling this method, this controller object will be the first two
arguments passed owner, so that by the time this xib file owner will be this controller.At this point let's go back to view ViewController.xib. Click the File's Owner.
 Now that we know this will be a ViewController File's Owner object.
Switch to the Identity Inspector page, then you can see the Class field is
very clever ViewController. Because set ViewController,
then we can be on xib UI components and ViewController do link.
****Then switch to the Connection Inspector page, we can see the controller's
view has previously been linked to the screen of the View element.
So back to just in front loaded xib file description.
When xib file is loaded inside the UI component eleven is generated,
it will link to the UIView component controller's view. So this last view,
that is where we xib design of the screen, will be added to window,
 become we start the App, the first one to see the picture.          ***
*******

**KR**
**이야기 하​​나 (XIB 디자인 앱을 시작 화면)1. 애플리케이션 주요 기능은 시작, 실행파일 main.m주요 int (INT ARGC, char *로 변수는 argv []){
    
@ Autoreleasepool {
        
UIApplicationMain을 (ARGC, ARGV, 무기, NSStringFromClass ([AppDelegate 클래스]))을 반환;
    
}}(2) UIApplication 객체를 설정하려면 응용 프로그램을 나타냅니다3 응용 프로그램 에이전트 AppDelegate 객체를 구축, UIApplication 객체의 에이전트는이 개체 AppDelegate로 설정됩니다왜 그렇게 똑똑한 앱 에이전트 객체 클래스 AppDelegate은? 사실, 이것은 신비이다. 그냥 주요 기능, 우리는 UIApplicationMain 함수를 호출 주요 기능에 다시 보면,이 함수는 다음과 같이 선언합니다 :UIApplication.h을 제기INT UIApplicationMain (INT ARGC, char *로 변수는 argv [],있는 NSString * principalClassName,있는 NSString * delegateClassName)이 기능을 처음 네 개의 매개 변수 delegateClassName. 그래서 우리는 프록시 객체 클래스 문자열을 전달하기 위해 여기 있으며, 그 시간은 자연스럽게이 범주에 대한 프록시 객체를 생성합니다. 간단한 공식이 실제로 직접 @ "AppDelegate"를 전달하지만, 여기에 우리가 실제 수신은 다음과 같은 기능입니다 볼 수있는 것은의 개체를 반환

 
NSStringFromClass ([AppDelegate 클래스])이 함수는 다음과 같이 선언합니다 :NSObjCRuntime.h을 제기있는 NSString * NSStringFromClass (클래스 ACLASS)SDK에서 각 카테고리는 클래스 객체 (클래스 클래스)로 변환 할 수 있습니다, 우리는 NSStringFromClass 클래스 개체를 통과 할 때, 당신은이 범주를 나타내는있는 NSString 객체를 얻을 수 있습니다. 따라서 우리는 먼저 [AppDelegate 클래스] 제 AppDelegate 클래스 객체 (클래스 객체에 그걸 얻기 위해 호출 클래스 방식으로 모든 클래스가 될 수 있음), 다음 매개 변수로 전달하면이 범주 문자열 @ "AppDelegate"얻을 수 있습니다 문의 .로 클래스 메소드의 선언은 다음과 같습니다 :NSObject.h을 제기+ (클래스) 클래스;. didFinishLaunchingWithOptions : 방법 4 앱 끝은 시작 AppDelegate 개체의 응용 프로그램을 호출파일 AppDelegate.m- (BOOL) 신청 : (UIApplication *) 응용 프로그램 didFinishLaunchingWithOptions : (있는 NSDictionary *) launchOptions{
    
self.window = [[UIWindow에 할당] initWithFrame : [[UIScreen mainScreen] 경계];
    
/ / 응용 프로그램 실행 후 맞춤 점을 재정의합니다.
    
self.viewController = [[있는 viewController 할당] initWithNibName : @ "있는 viewController"번들 : 무기 호]
    
self.window.rootViewController = self.viewController;
    
[Self.window makeKeyAndVisible]
    
YES 반환;}didFinishLaunchingWithOptions : 응용 프로그램에서 코드를, 당신은 다음 단계 5-8 파생시킬 수 있습니다(5) 앱 메인 화면 창 (UIWindow에 객체)을 수립하고, window 객체에 연결된 AppDelegate 개체 창에서 속성을 설정self.window = [[UIWindow에 할당] initWithFrame : [[UIScreen mainScreen] 경계];UIWindow에 객체가 화면 앱 UI 구성 요소의 하단입니다, 먼저 창을 가지고, 그리고 단지 그것의 위에 추가 등 UIView의 구성 요소와 다른 UI 요소, 후해야합니다.설립 UIWindow에 요소 nitWithFrame을 통해 우리 : 창 크기를 초기화하는 방법. 앱 사진이 전체 화면이 있어야합니다 채우고, 우리는 창 크기와 화면의 크기를 얻기 위해 [[UIScreen mainScreen] 경계]을 사용하므로.AppDelegate의 창 속성으로, AppDelegate.h에서 찾을 수 있습니다AppDelegate.h을 제기@ 속성 (강, 세분화)는 UIWindow * 창;(6) 수립 컨트롤러 개체보기 해당 XIB 파일 이름과 속성 AppDelegate에 대한 링크를 지정self.viewController = [[있는 viewController 할당] initWithNibName : @ "있는 viewController"번들 : 무기 호]다음과 같이 AppDelegate의있는 viewController 속성은 선언AppDelegate.h을 제기

@ 속성 (강, 세분화)있는 viewController *있는 viewController;번들 : 초기화 위해 ViewController 객체 initWithNibName을 사용합니다. 이 방법은 다음과 같이 선언합니다 :ViewController.h을 제기- (ID) initWithNibName : (있는 NSString *) nibNameOrNil 번들 : (NSBundle *) nibBundleOrNil;매개 변수 nibNameOrNil :XIB 파일 이름을 입력합니다.매개 변수 nibBundleOrNil :NSBundle 객체입니다. 시간로드 XIB 파일에 의해, 그것은 XIB 파일에서 번들을 찾습니다. 우리의 XIB 파일은 최종 생성 된 응용 프로그램 번들 폴더에 포함되는 프로젝트에 직접 추가되기 때문에. 그래서 사실, 우리는 이전 매개 변수가 XIB 파일 이름 @ "있는 viewController"를 통과와 함께 [NSBundle mainBundle]을, 그래서 당신은 ViewController.xib를 찾을 수 있습니다 전달해야합니다.그러나 역설적으로, 우리는 nil을 전달하는. 그 당시 XIB를로드 할 때 우리는 무기를 전달할 때, 응용 프로그램 번들 폴더에서이 XIB, 그래서 그것은 XIB 파일을 찾을 수 있다고 가정하기 때문입니다.당신이 자세히 UIViewController.h 보면, 다음과 같은 두 가지 속성을 찾을 수 있습니다.@ 속성 (세분화, 읽기 전용, 복사)있는 NSString * nibName;@ property에 NSBundle * nibBundle을 (세분화, 읽기 전용, 보관)그래서 우리는 initWithNibName : 번들 : 수신 매개 변수는, 사실,이 두 가지 속성 내부에 기록됩니다. 시간이 익은 후, 정말 XIB를로드하려면, 다음 여기에서 검색 할 때까지 기다립니다.객체의 7 세트는 UIWindow 객체 rootViewController 속성을 그냥있는 viewController를 생성self.window.rootViewController = self.viewController;이 속성은 다음과 같이 선언합니다UIWindow.h을 제기@ property에 UIViewController * rootViewController을 (세분화, 유지)8 전화는 UIWindow 객체 makeKeyAndVisible, 디스플레이 창[Self.window makeKeyAndVisible]마지막 호출 makeKeyAndVisible 방법은, 사실, 등장 중요한 단계 응용 화면입니다. 이 메서드를 호출 할 때, 대표 외에 윈도우 화면을 만들어 호출은 컨트롤러 관리 화면 _view을 얻기 위해, rootViewController의 뷰 방식이 창을 이동합니다. 여기에 방법을 보려면 실제로는 getter를 _view되고, 그와 관련된 다음과 같이 선언합니다 :UIViewController.h을 제기UIView의 * _view;@ 속성 (세분화, 유지) UIView의 *보기;이 getter 메소드보기는 아주 특별하다. 전통적으로, 우리는 가능한 세터, 게터를 통해 설정합니다. 그러나,이 시간 _view 게터가없는 경우 반환하기 전에, 다음은 _view 구성 요소를 생성 할 갈 것입니다, 값이 있는지 여부를 확인합니다. 따라서이 시간에이 단계에서 먼저 nibName 및 nibBundle를 통해 다음 _view가 비어 찾을 때 XIB 파일을 관련이있을 경우, loadNibNamed NSBundle 객체 호출 찾습니다 소유자 : 옵션 : 방법, XIB를로드 할 파일은 UI 구성 요소에서 XIB 파일을 생성 한. 이 방법은 다음과 같이 선언합니다 :UINibLoading.h을 제기- (NSArray 중 *) loadNibNamed (있는 NSString *) 이름 소유자 (ID) 소유자 옵션 (있는 NSDictionary *) 옵션;이 메서드를 호출 한 후,이 컨트롤러 객체는 시간에이 XIB 파일의 소유자가이 컨트롤러 될 수 있도록, 소유자를 통과 첫 번째 두 개의 인수 될 것이다.
이 시점에서의이 ViewController.xib를보기로 가자. 파일의 소유자를 클릭합니다. 이제 우리는이있는 viewController 파일의 소유자 객체가 될 것입니다 알고. 아이디 속성 페이지로 전환, 당신은 클래스 필드는 매우 영리한있는 viewController입니다 볼 수 있습니다. 설정있​​는 viewController 때문에, 우리는 링크를 할 XIB UI 구성 요소와있는 viewController에있을 수 있습니다.
******
그런 다음 연결 관리자 페이지로 전환, 우리는 컨트롤러의 뷰가 이전 뷰 요소의 화면에 연결되어 있습니다 볼 수 있습니다. 그래서 다시 바로 앞은 XIB 파일의 설명을로드. XIB 파일은 UI 구성 요소 열한가 생성되는 내부로드 될 때, 그것은 UIView의 구성 요소 컨트롤러의 뷰에 연결됩니다. 우리는 화면의 디자인을 XIB 곳이다 그래서이 마지막보기는 창에 추가됩니다, 우리는 앱, 사진을 볼 수있는 첫 번째 시작됩니다.**

*****

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&