2011-07-05 22 views
9

Tôi đã đọc lại UIApplicationMain tài liệu và tự hỏi, nếu UIApplicationMain không bao giờ trở lại, tại sao:Tại sao các mẫu main.m iOS lại bao gồm câu lệnh trả về và một nhóm tự động phát hành?

  • là có một return ở cuối?
  • có số NSAutoreleasePool không?

Tôi thậm chí còn tự hỏi: tại sao int main(int argc, char *argv[]) trên iPhone? Chúng tôi có thể khởi chạy ứng dụng bằng dòng lệnh không? argcargv là gì? Chúng được sử dụng hay chỉ là di sản C?

Một số bình luận trên Twitter từ đồng loại danh dự là rằng:

  • return là vào đây để trình biên dịch
  • các NSAutoreleasePool là vô ích.
  • vòng lặp chạy cần bể bơi autorelease được phân bổ (mâu thuẫn với # 2)

Trả lời

4

1) Lệnh return có lẽ chỉ có bởi vì trình biên dịch không biết rằng chức năng không bao giờ có thể trở lại (nó không phải là được đánh dấu theo bất kỳ cách đặc biệt nào, sau khi tất cả). Vì vậy, phân tích luồng mã của trình biên dịch sẽ cảnh báo rằng nó có một câu lệnh trả về bị thiếu. Điều đó vẫn không giải thích tại sao UIApplicationMain() có một giá trị trả về. Có thể có một tình huống lỗi khi nó thực sự là có thể trả lại, ai biết được.

2) Tôi nghĩ rằng có một hồ bơi autorelease trong chính() xung quanh UIApplicationMain là sai, vì bất kỳ đối tượng được phát hành mà không có một hồ bơi sẽ kết thúc trong hồ bơi autorelease này, mà vẫn tồn tại trong suốt thời gian của ứng dụng. Vì vậy, hiệu quả đối tượng vẫn còn bị rò rỉ.

Thông thường, nếu không có sẵn bể tự động, thời gian chạy sẽ ghi lại thông báo lỗi về hồ bơi bị thiếu và yêu cầu nhà phát triển đặt điểm ngắt trên _NSAutoreleaseNoPool để tìm nơi tự động phát hiện ít xảy ra. Các NSAutoreleasePool cấp cao nhất được tìm thấy trong các mẫu như vậy thực sự là giấu rò rỉ này từ người dùng.

UIApplicationMain() nên xây dựng hồ bơi tự động của riêng mình khi cần thiết (Nó phải tạo và rách xuống một lần một lần thông qua vòng lặp sự kiện, nếu không các đối tượng sẽ chỉ thêm vào trong hồ bơi bên ngoài, tiêu thụ tất cả bộ nhớ). Nếu ai đó nghĩ rằng họ thực sự cần chạy mã ObjC trước khi gọi UIApplicationMain() (và họ không thể làm công việc tương tự trong applicationDidFinishLaunching: hoặc thích), họ luôn có thể tạo một hồ bơi trước UIApplicationMain(). Vì UIApplicationMain() được ghi lại để không bao giờ trở lại (như exit()), không có điểm nào trong việc có các lệnh theo sau nó. Các hồ bơi sẽ không bao giờ được phát hành.

Nếu bạn nhìn vào các mẫu Mac, chúng thực sự không có hồ bơi.

3) Các tham số được sử dụng ngay cả khi bạn bấm đúp vào một ứng dụng trên máy Mac. Hệ điều hành chuyển thông tin nhất định đến ứng dụng theo cách đó. Tham số đầu tiên là đường dẫn đến tệp thực thi khi nó được khởi chạy, đó là cần thiết để tìm các tệp trong gói, tôi giả sử.Trên máy Mac, PSN (số sêri xử lý) cũng được chuyển đến một ứng dụng dưới dạng tham số khi được khởi chạy từ Trình tìm kiếm:

05.07.11 22:18:54,129 [0x0-0x21e21e].com.thevoidsoftware.MacTestApp: 0: /Volumes/RamDisk/MacTestApp-fdcuwfrzopalmgaufwujijhqhvjc/Build/Products/Debug/MacTestApp.app/Contents/MacOS/MacTestApp 
05.07.11 22:18:54,129 [0x0-0x21e21e].com.thevoidsoftware.MacTestApp: 1: -psn_0_2220574 
+0

Về mẫu Mac, có thể vì chúng sử dụng bộ sưu tập rác (không phải môi trường được tính tham chiếu)? trên iOS, chúng tôi không có nó. –

+1

@Cyril Godefroy chỉ các nhà phát triển lười biếng sử dụng bộ sưu tập rác và nó không được kích hoạt theo mặc định. Tôi ghét nó, nhưng đó là ý kiến ​​của tôi. –

+0

Bạn có thể trả lời câu hỏi đó cho chính mình nếu bạn có quyền truy cập vào phần mềm tiền phát hành. Tôi không thể nói nhiều hơn. – uliwitness

0

Trên phần đối số, trên iOS, nếu bạn khởi chạy trực tiếp ứng dụng bạn chỉ nhận được một đối số, đường dẫn ứng dụng

2011-07-05 22:38:15.004 iCyril[2326:707] There are 1 args 
Argument 1 : /var/mobile/Applications/7D58CC99-89C3-4F86-93D9-5FAF0756B706/iCyril.app/iCyril 

Cho rằng bạn có thể mở tệp, đọc url vv từ phương pháp ủy quyền UIApplication, thông tin khác phải được xử lý bởi cùng một cơ chế.

+0

Không chắc chắn. Điều đó sẽ làm cho nó không thể mở một tài liệu hoặc URL với một ứng dụng đang chạy. Trên MacOS, Sự kiện của Apple được sử dụng để yêu cầu ứng dụng mở tệp/URL. Những người lần lượt được dựa trên tin nhắn Mach dưới mui xe những ngày này. Tôi đoán iOS có cái gì đó tương đương, nội bộ. – uliwitness

Các vấn đề liên quan