首頁

2013年7月22日 星期一

***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 곳이다 그래서이 마지막보기는 창에 추가됩니다, 우리는 앱, 사진을 볼 수있는 첫 번째 시작됩니다.**

*****

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



沒有留言:

張貼留言


if you like make fds, wellcome you here~~anytime***

my free place for everyones who want the good software,

come & download them~ wellcome!!