2011-02-22 27 views
8

Có thể ai đó vui lòng giải thích cách kiểm soát luồng thực thi trong ứng dụng iOS không? Tôi biết rằng UIApplicationMain được gọi là đầu tiên từ chính. Rồi sao? Mối quan hệ giữa các phương thức xác định của tôi và chính là gì? Có phải tất cả điều khiển sự kiện hay có thể có một số chuỗi có cấu trúc?Lệnh thực hiện mục tiêu C sau khi UIApplication là gì?

Tôi không có ý nói mơ hồ, tôi chỉ cần biết bắt đầu từ đâu. Có lẽ tôi đang xem xét điều này một cách sai lầm.

Ví dụ, trong C++ tôi sẽ làm một cái gì đó như:

#include "myMethods.h" 
int main (int argc, char * const argv[]) { 

    Method1(); // Initialization 
    Method2(); // Opening views and options 
    Method3(); // Meat of the program 

    return 0; 
} 

Cảm ơn trước.

+2

FYI, 'UIApplicationMain()' không bao giờ trở lại. Ứng dụng được chấm dứt thông qua một cuộc gọi đến 'exit()'. Vì vậy, bất cứ điều gì bạn đặt sau khi 'UIApplicationMain (argc, argv, nil, nil);' trong 'main()' sẽ * không bao giờ * được thực thi. Chưa bao giờ. –

+1

Ugh. @ Dave nếu thats đúng, mà thực sự grosses tôi ra. Nó giống như những ngày của BASIC khi chúng ta chỉ đặt STOP ở giữa một GOSUB! –

Trả lời

7

Như bạn nói UIApplicationMain tạo ra một thực đơn trong hệ thống. Trong số những thứ mà quá trình tải ứng dụng thực hiện, tôi cho rằng bạn quan tâm đến những gì có liên quan đến một ứng dụng cụ thể. Ngoài ra tôi giả định một trường hợp điển hình, được minh họa trong nhiều mẫu dự án mà Xcode cung cấp.

Quy trình tải ứng dụng sẽ xem xét danh sách thuộc tính thông tin của ứng dụng. Ở đó, nó tìm thấy 'Tên cơ sở tệp nib chính' và phiên bản UIApplication của ứng dụng của bạn tải tệp nib tương ứng từ gói ứng dụng. Tệp nib này chỉ định một lớp ứng dụng ủy nhiệm và yêu cầu kết nối một cá thể của lớp với thuộc tính ủy nhiệm của cá thể UIApplication của bạn.

Tùy thuộc vào tập tin nib chính, các đối tượng khác có thể được tạo ra và kết nối là tốt, ví dụ, cửa sổ của ứng dụng, bộ điều khiển giao diện chính, vv

Bây giờ dãy tải kết thúc, và tất cả mọi thứ là tất cả sự kiện -driven, bắt đầu từ lớp đại biểu ứng dụng của bạn để nhận được thông báo -applicationDidFinishLaunching: nổi tiếng.

2

Từ Tài liệu của Apple -

Vòng đời ứng dụng tạo thành chuỗi các sự kiện xảy ra giữa sự ra mắt và chấm dứt của ứng dụng. Trong iOS, người dùng khởi chạy ứng dụng của bạn bằng cách nhấn vào biểu tượng của ứng dụng trên Màn hình chính. Ngay sau khi vòi nước xảy ra, hệ thống sẽ hiển thị một số đồ họa chuyển tiếp và tiến hành khởi chạy ứng dụng của bạn bằng cách gọi chức năng chính của nó. Từ thời điểm này, phần lớn công việc khởi tạo được chuyển giao cho UIKit, tải tệp nib chính của ứng dụng và đọc vòng lặp sự kiện.

Application Life Cycle

17

Vì vậy, như bạn đã đề cập, hàm main() trong main.m là điểm bắt đầu, sau đó gọi UIApplicationMain(). Nếu bạn kiểm tra các tài liệu, bạn sẽ thấy rằng UIApplicationMain có bốn đối số:

  • argc,
  • * argv [],
  • * principalClassName
  • * delegateClassName.

Hai loại đầu tiên trong số đó chỉ là số đối số và danh sách biến được chuyển từ main(). Nhưng đối số thứ ba và thứ tư là con trỏ tới NSStrings. Đối số thứ ba xác định lớp nào sẽ là UIApplication. Trừ khi bạn có ý định phân lớp UIApplication, bạn chỉ định nil cho đối số thứ ba.Đối số thứ tư xác định lớp nào sẽ là lớp đại biểu của UIApplication, lớp này sẽ trả lời bất kỳ thứ gì được chỉ định trong Giao thức UIApplicationDelegate. Bạn không cần phải muck với điều này trực tiếp, vì nó bao gồm trong tất cả các mẫu Xcode:

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool { 
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 
    } 
} 

Đừng để các bit NSStringFromClass([AppDelegate class])) ném bạn. Đó chỉ là một cách ưa thích của việc xác định các đối số thứ tư để các đại biểu phải được gọi là sau này bạn nên thay đổi tên của AppDelegate.m.

UIApplication bắt đầu main event loop và gọi -application:didFinishLaunchingWithOptions:, một trong những phương pháp mà đại biểu của họ phải xử lý. Hãy xem AppDelegate.m và bạn sẽ tìm thấy một số mã mẫu cho phương pháp này. Đây là nơi bạn có thể bắt đầu tùy biến, tạo ra những thứ mà cần phải được đặt đúng chỗ trước khi UIWindow và trường hợp khác của UIView được tạo ra:

- (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; 
} 

Vì vậy, bây giờ cửa sổ ứng dụng và xem gốc điều khiển được xác định, và các ứng dụng tắt và chạy. hơn

Tất cả điều này, và khá một chút, được xuất sắc giải thích ở đây: http://oleb.net/blog/2012/02/app-launch-sequence-ios-revisited/